我正在编写两个协作一起收集数据(使用服务)的应用程序,另一个是自定义键盘从服务获取数据并将它们写入选择的任何文本字段。这一切都很好我唯一的问题是服务绑定;现在,当他们调用bind时,服务将从任何应用程序启动。那不是我想要的行为;数据收集应用程序应该是唯一一个通过活动启动/停止服务的应用程序,键盘只会在服务运行时绑定。我需要做的是在调用绑定之前检查服务是否正在运行。无论如何,我有从键盘应用程序检查状态?有什么样的锁来表示服务的存在吗?我现在发现的所有方法都需要服务启动的类名和上下文,这对我来说不起作用。
答案 0 :(得分:1)
基本上以三种可能性结束,希望这有助于将来的其他人。
方法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;
}
方法2:
像pskink上面建议的那样使用带有标志0的bindService
。唯一的问题就是这个方法总会返回true,无论它是否连接,你必须找到另一种方法来了解发生了什么(你赢了如果失败则不接收服务句柄
方法3:
yosriz建议使用SharedPreference
来停止其他应用程序将检查并知道服务状态的状态标志。
答案 1 :(得分:0)
无法检查服务以查看它是否已启动,Android服务旨在处理多个客户端,以及何时绑定方法将创建服务(如果尚未运行)。
因此,您可以显式启动它,也可以使用bind()创建绑定服务连接,如果不存在则会创建新的连接。
尽管如此,您可以通过多种方式实现此功能,例如保存服务'正在运行'在某些共享首选项中声明并在绑定到服务之前检查此首选项。 (SharedPreference可以在同一用户ID的2个进程之间共享)