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

3

我有一个应用程序可以获取GPS坐标。它运行良好,但我想从调用活动内部测试服务是否正在运行。我有以下代码,我认为会检查,但当通知栏中的GPS图标仍在闪烁时,它返回false。有人有任何想法吗?提前感谢。

private boolean isGpsServiceRunning() {
          ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
          for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if ("LocationService".equals(service.service.getClassName())) {
              return true;
            }
          }
          return false;
        }

.

LocalBroadcastManager.getInstance(getApplicationContext())
                            .registerReceiver(
                                    locationChangereceiver,
                                    new IntentFilter(
                                            LocationChangeIntent.ACTION_LOCATION_CHANGE));
                    startService(new Intent(this, LocationService.class));

它是否会返回true?您是否尝试打印所有正在运行的服务以验证您是否正在寻找错误的值。此外,我建议使用LocationService.class.getSimpleName()而不是硬编码它。 - Amokrane Chentir
刚刚修好了,我还需要加上包名。和你说的一样。写个答案,我会接受的。谢谢。 - turtleboy
(ActivityManager)getSystemService(ACTIVITY_SERVICE); <--- 将其与我的答案进行比较 - bofredo
3个回答

3
你应该与 LocationService.class.getName() 进行比较,而不是使用硬编码的值。此外,您正在使用的值对应于Class#getSimpleName(),这可能不是您想要的。

2
 public boolean check(){
     ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) 
            {
                if ("com.example.yourpackagename.YourserviceName"
                        .equals(service.service.getClassName())) 
                {
                    return true;
                }
            }
         return false;
    }

1
这个方法对我来说很好用,而且使用起来很简单:

private boolean isMyServiceRunning() {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

    Log.i(TAG,"MyService.class.getName() = "+ButtonOnBootService.class.getName());              

    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {

        Log.i(TAG,"service.getClassName() = " +service.service.getClassName());

        if (ButtonOnBootService.class.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;   
}

1
你可能想要添加这样的检查:service.uid == Process.myUid()。这将加速搜索并避免在另一个进程中找到服务,尽管不太可能,我在同时运行相同应用程序的免费/付费版本时遇到了此问题! - 3c71
谢谢,我会研究一下。以任何方式加速Android听起来都很有用 :-) - bofredo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接