Android 检查服务是否来自另一个应用程序 运行
Android check if service is running from another application
我正在编写两个合作的应用程序,一个收集数据(使用服务),另一个是自定义键盘,从服务获取数据并将它们写入任何选定的文本字段。所有这一切都很好,我唯一的问题是服务绑定;现在,当他们调用绑定时,该服务将从任何应用程序启动。那不是我想要的行为;数据收集应用程序应该是唯一一个通过 activity 启动/停止服务的应用程序,只有当服务是 运行 时键盘才会绑定。我需要做的是在调用绑定之前检查服务是否为 运行。无论如何我可以从键盘应用程序检查状态?是否有某种锁来表示服务的存在?我现在找到的所有方法都需要 class 名称和服务启动位置的上下文,这对我不起作用。
无法检查服务是否已启动,Android 服务旨在处理多个客户端,如果尚未 运行 绑定方法将创建服务。
因此您可以显式启动它或使用 bind() 建立绑定服务连接,如果不存在则创建新的绑定服务。
不过,您可以通过多种方式实现此功能,例如将服务 'is running' 状态保存在某些共享首选项中,并在绑定到服务之前检查此首选项。 (SharedPreference可以在同一个用户id的2个进程之间共享)
基本上以三种可能性结束希望这对以后的其他人有所帮助。
方法 1:(虽然方法 2 更好,但我使用了事件)
public static boolean isServiceRunning(Context queryingContext) {
try {
ActivityManager manager = (ActivityManager) queryingContext.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if ("com.example.myservice".equals(service.service.getClassName()))
return true;
}
} catch (Exception ex) {
Toast.makeText(queryingContext, "Error checking service status", Toast.LENGTH_SHORT).show();
}
return false;
}
方法二:
就像上面建议的 pskink 使用带有标志 0 的 bindService
。唯一的问题是无论连接与否,该方法总是 return true,你必须找到另一种方法来知道发生了什么(如果失败,您将不会收到服务句柄)
方法三:
yosriz 建议使用 SharedPreference
停止其他应用程序将检查并了解服务状态的状态标志。
我正在编写两个合作的应用程序,一个收集数据(使用服务),另一个是自定义键盘,从服务获取数据并将它们写入任何选定的文本字段。所有这一切都很好,我唯一的问题是服务绑定;现在,当他们调用绑定时,该服务将从任何应用程序启动。那不是我想要的行为;数据收集应用程序应该是唯一一个通过 activity 启动/停止服务的应用程序,只有当服务是 运行 时键盘才会绑定。我需要做的是在调用绑定之前检查服务是否为 运行。无论如何我可以从键盘应用程序检查状态?是否有某种锁来表示服务的存在?我现在找到的所有方法都需要 class 名称和服务启动位置的上下文,这对我不起作用。
无法检查服务是否已启动,Android 服务旨在处理多个客户端,如果尚未 运行 绑定方法将创建服务。
因此您可以显式启动它或使用 bind() 建立绑定服务连接,如果不存在则创建新的绑定服务。
不过,您可以通过多种方式实现此功能,例如将服务 'is running' 状态保存在某些共享首选项中,并在绑定到服务之前检查此首选项。 (SharedPreference可以在同一个用户id的2个进程之间共享)
基本上以三种可能性结束希望这对以后的其他人有所帮助。
方法 1:(虽然方法 2 更好,但我使用了事件)
public static boolean isServiceRunning(Context queryingContext) {
try {
ActivityManager manager = (ActivityManager) queryingContext.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if ("com.example.myservice".equals(service.service.getClassName()))
return true;
}
} catch (Exception ex) {
Toast.makeText(queryingContext, "Error checking service status", Toast.LENGTH_SHORT).show();
}
return false;
}
方法二:
就像上面建议的 pskink 使用带有标志 0 的 bindService
。唯一的问题是无论连接与否,该方法总是 return true,你必须找到另一种方法来知道发生了什么(如果失败,您将不会收到服务句柄)
方法三:
yosriz 建议使用 SharedPreference
停止其他应用程序将检查并了解服务状态的状态标志。