2012-02-01 56 views
3

我正在使用该函数在调用服务之前查找服务是否已在运行,以便服务在其已经运行时不会启动: -为什么检查服务是否正在运行,是否给出错误

private boolean iSR() { 

     String sClassName; 

     ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
     for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) 
     { 
      sClassName = service.service.getClassName(); 

      if (sClassName.contains("com.abc.def.Service_name")) 
      { 

        return true; 
      } 
     } 

     return false; 
} 

而且我需要在单独的进程中运行服务,否则会导致应用程序变慢。因此,在清单: -

<service android:name=".Service_name" android:process=":my_process" > </service> 

但是,如果该服务正在运行,并调用该函数时,它会给错误是这样的: -

..java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xyz.abc/com.xyz.abc.main}: java.lang.NullPointerException 

为什么会这样呢?任何帮助,高度赞赏。

+1

你确定manager不是null吗?你可以在那里加一张支票吗?在您提供的堆栈跟踪中没有行号,很难预测发生了什么。 – kosa 2012-02-01 17:15:40

+0

是的,经理不是空的。在服务真正运行时,当函数(iSR())正确返回true时,执行“Service_name.mThis.stopSelf();”行会发生问题。 ''mThis''是一个公共静态变量(声明为public static Service_name.mThis = null;并且在'onStartCommand()'mThis = this;'onDestroy'mThis = null。 – 2012-02-02 02:10:02

回答

2

如果您第二次从客户端启动服务,则已启动的服务(在您的情况下已创建专用进程并已在服务组件上调用onCreate)将不会再次“启动”(除非该服务在内存不足的情况下停止了自己或被系统杀死)。您的服务将获得几个onStartCommand调用。

因此,通常您不必检查服务是否正在运行,系统将根据是否需要启动和停止服务。

而且,在单独的进程中运行你的服务来加速你的应用程序可能是你在应用程序主线程中做了很多事情的标志。你应该重新审视你的决定,因为如果你有两个进程而不是一个进程,你的应用通常会对系统有更大的影响。

相关问题