Как проверить, запущена ли служба в Delphi 10 Seattle

Консенсус (большинство голосов) разработчиков Java выглядит следующим образом:

private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

Но я разработчик Delphi, работающий с 10 Seattle.

Я зашел так далеко в кодировании своей функции и застрял.

Что такое r? Androidapi.JNI.App.pas включает методы JActivityManager и getRunningServices, которые возвращают JList, но JList чего именно?

В этом файле .pas нет определения для JRunningServiceInfo. Как мне это определить и завершить код?

function TfrmMain.IsServiceStarted: Boolean;
var
  ActivityServiceManager: JObject;
  FActivityManager : JActivityManager;
  List: JList;
  Iterator: JIterator;
  r: 
  s: String;
begin

  Result := False;
  ActivityServiceManager := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.ACTIVITY_SERVICE);
  FActivityManager := TJActivityManager.Wrap((ActivityServiceManager as ILocalObject).GetObjectID);
  List := FActivityManager.getRunningServices(MAXINT);
  Iterator := List.iterator;
  while Iterator.hasNext and (not Result) do
  begin
    r := 
    s := JStringToString(r.service.getClassName);
    Result := (s = 'com.embarcadero.services.MyService');
  end;

end;

person nolaspeaker    schedule 14.12.2015    source источник
comment
"""The consensus (most votes) for Java developers seems to be ...""" нет, см. Документацию по getRunningServices: this method is only intended for debugging or implementing service management type user interfaces.   -  person pskink    schedule 14.12.2015
comment
Ваш комментарий не имеет смысла. Оба фрагмента кода ссылаются на getRunningServices.   -  person nolaspeaker    schedule 14.12.2015
comment
вы читали javadocs?   -  person pskink    schedule 14.12.2015
comment
Нет, я никогда не читал документацию по Java. Я просто придумываю что-то и надеюсь, что он компилируется.   -  person nolaspeaker    schedule 14.12.2015
comment
это очень плохо, но это не моя проблема   -  person pskink    schedule 14.12.2015
comment
Вы когда-нибудь читали вопросы, которые задают люди?   -  person nolaspeaker    schedule 14.12.2015
comment
Нет, я никогда не читаю вопросы, которые задают люди. Я просто делаю случайные комментарии и надеюсь, что они помогут.   -  person pskink    schedule 14.12.2015
comment
Это очень плохо, но это не моя проблема.   -  person nolaspeaker    schedule 14.12.2015


Ответы (1)


Хорошо, я думаю, что нашел ответ, который искал (все дело в том, чтобы задать правильный вопрос). На китайском веб-сайте я нашел код оболочки Delphi для RunningServiceInfo, который отсутствует в поставляемом Androidapi.JNI.App.pas.

http://blog.csdn.net/flcop/article/details/17190009uses (китайский) < / а>

Это полный модуль для ActivityManager, предшествующий Delphi 10 Seattle (Delphi XE5), но избавляющий меня от необходимости самостоятельно кодировать оболочку RunningServiceInfo. Почему Эмбаркадеро все-таки не упомянул об этом?

Создав модуль Androidapi.JNI.RunningServiceInfo.pas только для класса JActivityManager_RunningServiceInfo, я могу завершить свой код функции. Он компилирует и дает предсказуемые результаты в тестах.

uses
  Androidapi.JNI.RunningServiceInfo;

function TfrmHostMain.ServiceIsStarted: Boolean;
var
  ActivityServiceManager: JObject;
  FActivityManager : JActivityManager;
  List: JList;
  Iterator: JIterator;
  ri: JActivityManager_RunningServiceInfo;
  s: String;
begin

  Result := False;
  ActivityServiceManager := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.ACTIVITY_SERVICE);
  FActivityManager := TJActivityManager.Wrap((ActivityServiceManager as ILocalObject).GetObjectID);
  List := FActivityManager.getRunningServices(MAXINT);
  Iterator := List.iterator;
  while Iterator.hasNext and (not Result) do
  begin
    ri := TJActivityManager_RunningServiceInfo.Wrap((Iterator.next as ILocalObject).GetObjectID);
    s := JStringToString(ri.service.getClassName);
    Result := (s = 'com.embarcadero.services.MyService');
  end;

end;

А вот код для созданного мной Androidapi.JNI.RunningServiceInfo.pas. Надеюсь, это решение поможет другим разработчикам Delphi сэкономить время. Я потратил на это слишком много времени!

unit Androidapi.JNI.RunningServiceInfo;

interface

uses
  Androidapi.JNI.App
  ,Androidapi.JNIBridge
  ,Androidapi.JNI.GraphicsContentViewText
  ,Androidapi.JNI.JavaTypes
  ,Androidapi.JNI.Os
;

type
{ Class forward declarations }
  JActivityManager_RunningServiceInfo = interface;

{  http://developer.android.com/reference/android/app/ActivityManager.RunningServiceInfo.html Added in API level 1 }
  JActivityManager_RunningServiceInfoClass = interface(JObjectClass)
  ['{8A01CD6D-5177-4F74-A65E-20BAC0B76F0F}']
    { Property Methods }
    function _GetCREATOR: JParcelable_Creator;
    function _GetFLAG_FOREGROUND: Integer;
    function _GetFLAG_PERSISTENT_PROCESS: Integer;
    function _GetFLAG_STARTED: Integer;
    function _GetFLAG_SYSTEM_PROCESS: Integer;
    { Methods }
    function init: JActivityManager_RunningServiceInfo; cdecl;
    { Properties }
    property CREATOR: JParcelable_Creator read _GetCREATOR;
    // Added in API level 5
    property FLAG_FOREGROUND: Integer read _GetFLAG_FOREGROUND;
    // Added in API level 5
    property FLAG_PERSISTENT_PROCESS: Integer read _GetFLAG_PERSISTENT_PROCESS;
    // Added in API level 5
    property FLAG_STARTED: Integer read _GetFLAG_STARTED;
    // Added in API level 5
    property FLAG_SYSTEM_PROCESS: Integer read _GetFLAG_SYSTEM_PROCESS;
  end;

  [JavaSignature('android/app/ActivityManager$RunningServiceInfo')]
  JActivityManager_RunningServiceInfo = interface(JObject)
  ['{CEECA783-977A-4E16-8907-C4F65F25D168}']
    { Property Methods }
    function _GetactiveSince: Int64;
    procedure _SetactiveSince(Value: Int64);
    function _GetclientCount: Integer;
    procedure _SetclientCount(Value: Integer);
    function _GetclientLabel: Integer;
    procedure _SetclientLabel(Value: Integer);
    function _GetclientPackage: JString;
    procedure _SetclientPackage(Value: JString);
    function _GetcrashCount: Integer;
    procedure _SetcrashCount(Value: Integer);
    function _Getflags: Integer;
    procedure _Setflags(Value: Integer);
    function _Getforeground: Boolean;
    procedure _Setforeground(Value: Boolean);
    function _GetlastActivityTime: Int64;
    procedure _SetlastActivityTime(Value: Int64);
    function _Getpid: Integer;
    procedure _Setpid(Value: Integer);
    function _Getprocess: JString;
    procedure _Setprocess(Value: JString);
    function _Getrestarting: Int64;
    procedure _Setrestarting(Value: Int64);
    function _Getservice: JComponentName;
    procedure _Setservice(Value: JComponentName);
    function _Getstarted: Boolean;
    procedure _Setstarted(Value: Boolean);
    function _Getuid: Integer;
    procedure _Setuid(Value: Integer);
    { Methods }
    function describeContents: Integer; cdecl;
    procedure readFromParcel(source: JParcel); cdecl;
    procedure writeToParcel(dest: JParcel; flags: Integer); cdecl;
    { Properties }
    property activeSince: Int64 read _GetactiveSince write _SetactiveSince;
    property clientCount: Integer read _GetclientCount write _SetclientCount;
    // API level 5
    property clientLabel: Integer read _GetclientLabel write _SetclientLabel;
    // API level 5
    property clientPackage: JString read _GetclientPackage write _SetclientPackage;
    property crashCount: Integer read _GetcrashCount write _SetcrashCount;
    // API level 5
    property flags: Integer read _Getflags write _Setflags;
    property foreground: Boolean read _Getforeground write _Setforeground;
    property lastActivityTime: Int64 read _GetlastActivityTime write _SetlastActivityTime;
    property pid: Integer read _Getpid write _Setpid;
    property process: JString read _Getprocess write _Setprocess;
    property restarting: Int64 read _Getrestarting write _Setrestarting;
    property service: JComponentName read _Getservice write _Setservice;
    property started: Boolean read _Getstarted write _Setstarted;
    // API level 5
    property uid: Integer read _Getuid write _Setuid;
  end;
  TJActivityManager_RunningServiceInfo = class(TJavaGenericImport<JActivityManager_RunningServiceInfoClass,
    JActivityManager_RunningServiceInfo>) end;

implementation

procedure RegisterTypes;
begin
  TRegTypes.RegisterType('Androidapi.JNI.RunningServiceInfo.JActivityManager_RunningServiceInfo',
    TypeInfo(Androidapi.JNI.RunningServiceInfo.JActivityManager_RunningServiceInfo));
end;

initialization
  RegisterTypes;
end.
person nolaspeaker    schedule 14.12.2015