本文介绍了如何检查服务是否在Delphi 10运行西雅图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Java开发人员的共识(最多票数)似乎是

私人布尔isMyServiceRunning(类<> serviceClass){
    ActivityManager经理=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
    对于(RunningServiceInfo服务:manager.getRunningServices(Integer.MAX_VALUE的)){
        如果(serviceClass.getName()。等于(service.service.getClassName())){
            返回true;
        }
    }
    返回false;
}

但我一个Delphi开发人员10西雅图工作。

我得到了这个远在我的编码功能,卡住了。

什么是的研究?该Androidapi.JNI.App.pas包括返回JList中的 JActivityManager getRunningServices 方法,而是一个JList,究竟是什么?

有没有在该文件.PAS为 JRunningServiceInfo 的定义。如何定义这个问题并完​​成了code?

功能TfrmMain.IsServiceStarted:布尔;
VAR
  ActivityServiceManager:JObject;
  FActivityManager:JActivityManager;
  清单:JList的;
  迭代器:JIterator;
  R:
  小号:字符串;
开始  结果:= FALSE;
  ActivityServiceManager:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.ACTIVITY_SERVICE);
  FActivityManager:= TJActivityManager.Wrap((ActivityServiceManager为ILocalObject).GetObjectID);
  清单:= FActivityManager.getRunningServices(MAXINT);
  迭代器:= List.iterator;
  而Iterator.hasNext和(没有结果)做
  开始
    R:=
    小号:= JStringToString(r.service.getClassName);
    结果:=(S ='com.embarcadero.services.MyService');
  结束;结束;


解决方案

好吧,我想我已经找到了我一直在寻找(这一切都在问的右键的问题)的答案。在中国的网站上,我找到了德尔福包装code表示这是从作为提供Androidapi.JNI.App.pas

缺少RunningServiceInfo

这是ActivityManager一个完整的单元,即predates德尔福10西雅图(德尔福XE5),但为我节省了编码RunningServiceInfo包装器自己的麻烦。为什么Embarcadero公司反正离开了这一点?

通过使单位Androidapi.JNI.RunningServiceInfo.pas,只是为了JActivityManager_RunningServiceInfo类,我能够完成我的函数code。它编译,并在测试中产生predicable结果。

 用途
  Androidapi.JNI.RunningServiceInfo;功能TfrmHo​​stMain.ServiceIsStarted:布尔;
VAR
  ActivityServiceManager:JObject;
  FActivityManager:JActivityManager;
  清单:JList的;
  迭代器:JIterator;
  RI:JActivityManager_RunningServiceInfo;
  小号:字符串;
开始  结果:= FALSE;
  ActivityServiceManager:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.ACTIVITY_SERVICE);
  FActivityManager:= TJActivityManager.Wrap((ActivityServiceManager为ILocalObject).GetObjectID);
  清单:= FActivityManager.getRunningServices(MAXINT);
  迭代器:= List.iterator;
  而Iterator.hasNext和(没有结果)做
  开始
    RI:= TJActivityManager_RunningServiceInfo.Wrap((Iterator.next为ILocalObject).GetObjectID);
    小号:= JStringToString(ri.service.getClassName);
    结果:=(S ='com.embarcadero.services.MyService');
  结束;结束;

这里是code为我所做的Andr​​oidapi.JNI.RunningServiceInfo.pas。我希望这个解决方案能够帮助其他Delphi开发者节省时间。我花了太多时间在这!

 单元Androidapi.JNI.RunningServiceInfo;接口用途
  Androidapi.JNI.App
  ,Androidapi.JNIBridge
  ,Androidapi.JNI.GraphicsContentViewText
  ,Androidapi.JNI.JavaTypes
  ,Androidapi.JNI.Os
;类型
{类​​向前声明}
  JActivityManager_RunningServiceInfo =接口;{http://developer.android.com/reference/android/app/ActivityManager.RunningServiceInfo.html在API级别增加1}
  JActivityManager_RunningServiceInfoClass =接口(JObjectClass)
  ['{8A01CD6D-5177-4F74-A65E-20BAC0B76F0F}']
    {属性方法}
    功能_GetCREATOR:JParcelable_Creator;
    功能_GetFLAG_FOREGROUND:整数;
    功能_GetFLAG_PERSISTENT_PROCESS:整数;
    功能_GetFLAG_STARTED:整数;
    功能_GetFLAG_SYSTEM_PROCESS:整数;
    { 方法 }
    功能INIT:JActivityManager_RunningServiceInfo; CDECL;
    {}属性
    物业CREATOR:JParcelable_Creator阅读_GetCREATOR;
    //在API级别5
    物业FLAG_FOREGROUND:整数读取_GetFLAG_FOREGROUND;
    //在API级别5
    物业FLAG_PERSISTENT_PROCESS:整数读取_GetFLAG_PERSISTENT_PROCESS;
    //在API级别5
    物业FLAG_STARTED:整数读取_GetFLAG_STARTED;
    //在API级别5
    物业FLAG_SYSTEM_PROCESS:整数读取_GetFLAG_SYSTEM_PROCESS;
  结束;  [JavaSignature('机器人/应用/ ActivityManager $ RunningServiceInfo')]
  JActivityManager_RunningServiceInfo =接口(JObject)
  ['{CEECA783-977A-4E16-8907-C4F65F25D168}']
    {属性方法}
    功能_GetactiveSince:Int64的;
    程序_SetactiveSince(价值:Int64的);
    功能_GetclientCount:整数;
    程序_SetclientCount(价值:整数);
    功能_GetclientLabel:整数;
    程序_SetclientLabel(价值:整数);
    功能_GetclientPackage:的jstring;
    程序_SetclientPackage(价值的jstring);
    功能_GetcrashCount:整数;
    程序_SetcrashCount(价值:整数);
    功能_Getflags:整数;
    程序_Setflags(价值:整数);
    功能_Getforeground:布尔;
    程序_Setforeground(价值:布尔);
    功能_GetlastActivityTime:Int64的;
    程序_SetlastActivityTime(价值:Int64的);
    功能_Getpid:整数;
    程序_Setpid(价值:整数);
    功能_Getprocess:的jstring;
    程序_Setprocess(价值的jstring);
    功能_Getrestarting:Int64的;
    程序_Setrestarting(价值:Int64的);
    功能_Getservice:JComponentName;
    程序_Setservice(价值:JComponentName);
    功能_Getstarted:布尔;
    程序_Setstarted(价值:布尔);
    功能_Getuid:整数;
    程序_Setuid(价值:整数);
    { 方法 }
    功能describeContents:整数; CDECL;
    程序readFromParcel(来源:JParcel); CDECL;
    程序writeToParcel(DEST:JParcel;标志:整数); CDECL;
    {}属性
    物业activeSince:Int64的读_GetactiveSince写_SetactiveSince;
    物业clientCount:整数读_GetclientCount写_SetclientCount;
    // API级别5
    物业clientLabel:整数读_GetclientLabel写_SetclientLabel;
    // API级别5
    物业clientPackage:读的jstring写_GetclientPackage _SetclientPackage;
    物业crashCount:整数读_GetcrashCount写_SetcrashCount;
    // API级别5
    属性标志:整数读_Getflags写_Setflags;
    物业前景:布尔读_Getforeground写_Setforeground;
    物业lastActivityTime:Int64的读_GetlastActivityTime写_SetlastActivityTime;
    物业PID:整数读_Getpid写_Setpid;
    财产过程:读的jstring写_Getprocess _Setprocess;
    物业重新启动:Int64的读_Getrestarting写_Setrestarting;
    物业服务:JComponentName读_Getservice写_Setservice;
    物业开始:布尔读_Getstarted写_Setstarted;
    // API级别5
    物业UID:整数读_Getuid写_Setuid;
  结束;
  TJActivityManager_RunningServiceInfo =类(TJavaGenericImport< JActivityManager_RunningServiceInfoClass,
    JActivityManager_RunningServiceInfo>)结束;履行程序RegisterTypes;
开始
  TRegTypes.RegisterType('Androidapi.JNI.RunningServiceInfo.JActivityManager_RunningServiceInfo',
    所属类别(Androidapi.JNI.RunningServiceInfo.JActivityManager_RunningServiceInfo));
结束;初始化
  RegisterTypes;
结束。

The consensus (most votes) for Java developers seems to be

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;
}

But I am a Delphi developer working with 10 Seattle.

I got this far in coding my function, and got stuck.

What is r? The Androidapi.JNI.App.pas includes the JActivityManager and the getRunningServices method that returns a JList, but a JList of what exactly?

There isn't a definition for a JRunningServiceInfoin that .pas file. How do I define this and complete the code?

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;
解决方案

Ok, I think I've found the answer I was looking for (it's all in asking the right question). On a Chinese website, I found the Delphi wrapper code for the RunningServiceInfo which is missing from the as-supplied Androidapi.JNI.App.pas

http://blog.csdn.net/flcop/article/details/17190009uses (Chinese)

This is a complete unit for the ActivityManager, that predates Delphi 10 Seattle (Delphi XE5), but saves me the trouble of coding the RunningServiceInfo wrapper myself. Why did Embarcadero leave this out anyway?

By making a unit Androidapi.JNI.RunningServiceInfo.pas, just for the JActivityManager_RunningServiceInfo class, I am able to complete my function code. It compiles and produces predicable results in tests.

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;

And here is the code for the Androidapi.JNI.RunningServiceInfo.pas I made. I hope this solution helps other Delphi developers save time. I spent way too much time on this!

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.

这篇关于如何检查服务是否在Delphi 10运行西雅图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-16 17:22