2012-02-01 57 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調用。

因此,通常您不必檢查服務是否正在運行,系統將根據是否需要啓動和停止服務。

而且,在單獨的進程中運行你的服務來加速你的應用程序可能是你在應用程序主線程中做了很多事情的標誌。你應該重新審視你的決定,因爲如果你有兩個進程而不是一個進程,你的應用通常會對系統有更大的影響。

相關問題