2013-08-16 15 views
3

在我的應用程序中,我有一個粘性服務,它通過我的應用程序子類的onCreate()中的startService()來啓動。然後我綁定到該服務以與其交互。在這裏似乎都很好:我可以退出應用程序(完成())或者我可以按Home鍵,當我回到應用程序時,我仍然可以重新連接到在後臺運行的相同服務。啓動/限制服務生命週期。爲什麼重新創建

但有一個用例讓我困惑。如果我按Home鍵,然後啓動一些其他應用程序,觀看YouTube等,一段時間後,我可以在日誌中看到我的應用程序被重新創建(onCreate()被稱爲),這很好。但是,當我嘗試綁定到相同的服務時,它也被重新創建(構造函數被調用),並且我得到一個新實例,儘管我正在檢查並且我確定我的舊服務仍在運行。這打破了用例,因爲我需要正在運行的服務中正在處理的數據。

是不是bindService()應該綁定到現有的服務,只有在它沒有運行時才創建它?爲什麼會導致創建新實例?一般來說,這個用例的流程在哪裏描述(應用程序在後臺被重新創建)?

P.S.另一個奇怪的是,舊服務的onDestroy()不被調用。

這裏是上下文我的應用程序類的一些代碼:

@Override 
public void onCreate(){ 
    super.onCreate(); 
    Intent intent = new Intent(getContext(), MyService.class); 
    if(!isMyServiceRunning()){ 
     getContext().startService(intent); 
    } 
    getContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE); 
} 

private boolean isMyServiceRunning() { 
    ActivityManager manager = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
     if (MyService.class.getName().equals(service.service.getClassName())) { 
      return true; 
     } 
    } 
    return false; 
} 

回答

2

如果您希望您的應用程序連接到服務的一個實例在服務描述中設置

android:singleUser="true" 

AndroidManifest.xml中。如果此標誌設置爲true,則表示此組件的單個實例將針對所有用戶運行。你

也可能發現你的情況很有用

android:stopWithTask="false" 

這意味着你的服務將保持即使與你的應用程序的任務是摧毀活躍。

+0

我剛剛查找了'stopWithTask',並且[文檔](https://developer.android.com/reference/android/R.attr.html#stopWithTask)說默認值是'false',所以設置它可能是不需要的。 – Sam

+0

我剛剛查找'singleUser',[文檔](https://source.android.com/devices/tech/admin/multiuser-apps)說''只有系統應用程序當前可以使用此功能.'。不過,我自己並沒有嘗試過,所以我可能是錯的。 – Sam