Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何跨多个应用程序共享服务并检查它是否已在运行?_Android_Android Service - Fatal编程技术网

Android 如何跨多个应用程序共享服务并检查它是否已在运行?

Android 如何跨多个应用程序共享服务并检查它是否已在运行?,android,android-service,Android,Android Service,我的问题是,我想制作一个包含IntentService的SDK(要包含在不同应用程序项目中的库项目)。AlarmManager计划每2秒重复一次此意向服务(实际上是每2分钟一次): Intent startServiceIntent=newintent(“com.my.package.my_UNIQUE_ACTION”); startServiceIntent.setClass(上下文,InstalledAppsService.class); PendingEvent PendingEvent=

我的问题是,我想制作一个包含IntentService的SDK(要包含在不同应用程序项目中的库项目)。AlarmManager计划每2秒重复一次此意向服务(实际上是每2分钟一次):

Intent startServiceIntent=newintent(“com.my.package.my_UNIQUE_ACTION”);
startServiceIntent.setClass(上下文,InstalledAppsService.class);
PendingEvent PendingEvent=PendingEvent.getService(上下文,0,startServiceIntent,PendingEvent.FLAG_CANCEL_CURRENT);
AlarmManager AlarmManager=(AlarmManager)context.getSystemService(context.ALARM\u服务);
alarmManager.setRepeating(alarmManager.RTC_WAKEUP,2000,2000,PendingEvent);
因此,当我在启动服务的应用程序中使用此方法时:

private boolean ismyservice running(){
Intent startServiceIntent=newintent(“com.my.package.my_UNIQUE_ACTION”);
startServiceIntent.setClass(上下文,InstalledAppsService.class);
布尔alarmUp=(PendingEvent.getService(上下文,0,
StartService意向,
PendingEvent.FLAG_NO_CREATE)!=null);
返回警报;
}
如果已计划服务,则返回true。我不希望使用相同的SDK从不同的应用程序启动相同的服务。我想要一个服务,为所有应用程序与SDK,我只需要检查,如果这个服务是从每个应用程序运行

但当我使用相同的方法,但来自不同的应用程序时,它返回false。 这是我的舱单:


我应该向清单中添加一些内容还是使用ActivityManager检查流程是否存在?目前,我从两个不同的服务中获得两个日志标记

我想要的是:启动服务,完成工作,处理服务。我不需要它一直运行。目前,alarm manager可以做到这一点,但需要单独的流程

这是我的服务:

公共类InstalledAppsService扩展了IntentService{
私有静态最终字符串TAG=“services.InstalledAppsService”;
公共安装的AppsService(){
超级(“InstalledAppsService”);
}
受保护的手部内容无效(意图){
}
public void onCreate(){
super.onCreate();
}
公共空间{
super.ondestory();
}
}
我应该向清单中添加一些内容还是使用ActivityManager检查流程是否存在

都不是。特别是,无法保证您的流程在任何时间点都存在,因此使用
ActivityManager
将无效,除非您要经常投票数分钟。除非所有应用程序都使用同一个签名密钥签名,否则我怀疑你的
android:process
值是否仍然有效

至少,您需要在
ismyservicerrunning()
代码中去掉
setClass()
,因为这将
意图限制在应用程序中实现该类。理论上,如果没有它,它应该检查一个
pendingent
包装在
Intent
周围的
pendingent,它通常用于您的动作字符串,它将接收任何应用程序的实现。当由类似于
AlarmManager
的程序执行时,
PendingEvent
将在其
中使用该操作执行某些服务

我希望这个结果偶尔会起作用,而且不安全。我之所以说“偶尔”,是因为看到您如何处理重新启动、强制停止以及任何可能会使警报计划外的事情都会很有趣。我之所以说“不安全”,是因为任何应用程序都可以在服务中实现该操作字符串,并且警报可能会运行该应用程序而不是您的应用程序。虽然自定义权限有其自身的安全问题,但您可以使用自定义权限执行某些操作,以尝试至少不启动某些欺骗服务

如果我想这么做,我会专注于制定一个更强大的选举协议,指定一个应用程序和你的服务作为责任方,直到和除非它被卸载(在这一点上,你需要一个新的选举)。让这项工作顺利进行将有点复杂


您可以考虑更改SDK以允许独立运行客户端,部分原因可能是事件频率比每小时30次低得多。

所以问题是我的服务做得太快了,当下一个应用程序检查服务是否正在运行时,它已经完成了它的工作,并从系统中被销毁。此外,AlarmManager没有检查是否安排了任何事情的选项

所以我做了一个timertask来完成这项工作,这样系统在完成工作时就不会破坏服务

服务代码可在此处查看:

使用这种方法:

private boolean isServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager)  
    context.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}
专用布尔IServiceRunning(类serviceClass){
ActivityManager=(ActivityManager)
getSystemService(context.ACTIVITY\u服务);
对于(ActivityManager.RunningServiceInfo服务:manager.getRunningServices(Integer.MAX_值)){
if(serviceClass.getName().equals(service.service.getClassName())){
返回true;
}
}
返回false;
}
我可以检测到服务是否正在运行