![](/img/trans.png)
[英]How to check if my application is running in android(not as a service)?
[英]Android check if service is running from another application
我正在编写两个相互配合的应用程序,一个收集数据(使用服务),另一个是自定义键盘,该键盘从服务中获取数据并将其写入所选的任何文本字段。 所有这些都工作正常,我唯一的问题是服务绑定。 现在,当他们调用bind时,该服务将从任何应用程序启动。 那不是我想要的行为; 数据收集应用程序应该是唯一通过活动启动/停止服务的应用程序,只有在服务正在运行时,键盘才会绑定。 我需要做的是在调用绑定之前检查服务是否正在运行。 无论如何,我可以通过键盘应用程序检查状态吗? 是否有某种锁来表示服务的存在? 我现在发现的所有方法都需要从服务启动位置开始的类名和上下文,而这些方法对我不起作用。
基本上以三种可能性结束,希望这对以后的人有所帮助。
方法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:
就像上面建议的bindService
一样,将bindService
与标志0一起使用。唯一的问题是,无论方法是否连接,该方法将始终返回true,您将不得不寻找另一种方式来了解发生了什么(如果发生错误,您将不会收到服务句柄它失败了)
方法3:
yosriz建议,使用SharedPreference
停止其他应用程序将检查并知道服务状态的状态标志。
无法检查服务以查看其是否已经启动,Android服务旨在处理多个客户端,并且如果bind方法尚未运行,则bind方法将创建该服务。
因此,您可以显式启动它,也可以使用bind()建立绑定服务连接,如果不存在,它将创建新的绑定。
但是,您可以通过多种方式实现此功能,例如,以某种共享的首选项保存服务“正在运行”状态,并在绑定到服务之前检查此首选项。 (SharedPreference可以在具有相同用户标识的2个进程之间共享)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.