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 停止其他应用程序将检查并了解服务状态的状态标志。