如何检查服务是否在Android上运行?

如何检查后台服务(在Android上)是否正在运行?

我想要一个切换服务状态的Android活动 - 如果它处于关闭状态,它会让我打开它,如果它处于打开状态,则会将其打开。


不久前我有同样的问题。 由于我的服务是本地的,我最终只是在服务类中使用静态字段来切换状态,正如hackbod所描述的

编辑(备案):

这是hackbod提出的解决方案:

如果您的客户端和服务器代码是同一个.apk的一部分,并且您使用具体的Intent(指定确切的服务类)绑定到该服务,那么您可以简单地让您的服务在运行时设置一个全局变量你的客户可以检查。

我们故意没有API来检查服务是否正在运行,因为几乎没有失败,当您想要做类似的事情时,最终会在代码中出现竞争条件。


我在活动中使用以下内容:

private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

我用它来称呼它:

isMyServiceRunning(MyService.class)

这是可靠的,因为它基于Android操作系统通过ActivityManager#getRunningServices提供的运行服务的信息。

所有使用onDestroy或onSometing事件或绑定器或静态变量的方法都无法可靠地工作,因为作为开发人员,您永远不知道,Android何时决定杀死您的流程,或者是否调用了所提及的回调。 请注意Android文档生命周期事件表中的“killable”列。


得到它了!

必须调用startService()才能正确注册您的服务,并且传递BIND_AUTO_CREATE将不够用。

Intent bindIntent = new Intent(this,ServiceTask.class);
startService(bindIntent);
bindService(bindIntent,mConnection,0);

现在ServiceTools类:

public class ServiceTools {
    private static String LOG_TAG = ServiceTools.class.getName();

    public static boolean isServiceRunning(String serviceClassName){
        final ActivityManager activityManager = (ActivityManager)Application.getContext().getSystemService(Context.ACTIVITY_SERVICE);
        final List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);

        for (RunningServiceInfo runningServiceInfo : services) {
            if (runningServiceInfo.service.getClassName().equals(serviceClassName)){
                return true;
            }
        }
        return false;
     }
}
链接地址: http://www.djcxy.com/p/24605.html

上一篇: How to check if a service is running on Android?

下一篇: How to get the Android device's primary e