2013-06-25 32 views
0

當我的應用程序退出時,我想啓動一項服務,當用戶重新啓動應用程序時,我想停止它。但是,應用程序無法直接告知其所有活動何時完成。我的應用程序如何在應用程序退出時可靠地啓動服務?

這個問題很難,因爲用戶可以通過按回家或者他們像打電話一樣中斷任何Activity。所以我不能依賴退出根Activity的用戶來檢測何時啓動服務。

所以打算實施這些措施:

  • 的onPause所有ActivitiesStartService除非前往或從內部Activity。使用Intent參數進行跟蹤。
  • 的onResume所有ActivitiesStopService

有沒有做到這一點更優雅,更可靠的方法?

這個問題有一些提示: Stop All Started Services on App Close/Exit

+0

「當我的應用程序退出時,我想啓動一項服務,當用戶重新啓動應用程序時,我想停止它」 - 忽略這一點並不特別實際的事實(用戶和操作系統有多種方式可以獲得擺脫你的服務),並且考慮到用戶在99%的時間內不在你的應用程序中,只是讓服務一直運行起來會不會更簡單? – CommonsWare

+0

好點,這是一個可以考慮的選項 – gregm

回答

1

確定。讓我嘗試採取在這一個鏡頭..

讓我們創建一個BaseActivityActivity擴展和所有Activities應該從這個BaseActivity延長...

OverrideonDestroy()BaseActivity並在檢查,如果當前進程有任何更積極TaskActivities。如果它沒有任何更積極TaskActivity然後啓動Service ..

而且覆蓋在或onCreate(),如果這是唯一的活動TaskActivity ......如果是則停止你Service

下面的API可以用來檢查是否有更積極的檢查Task和/或Activities的應用:

要獲得的正在運行的任務列表:

ActivityManager activityManager = (ActivityManager)getBaseContext().getSystemService (Context.ACTIVITY_SERVICE); 

    List<RunningTaskInfo> tasks= activityManager.getRunningTasks(Integer.MAX_VALUE); 

要檢查任務,如果從您的應用程序:

for (RunningTaskInfo task : tasks) { 
     if (getContext().getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName())) { 
       //check activity 
      } 
    } 

NumActivitiesRunningTaskInfo屬性可以用來檢查在Task活動..

希望它可以幫助...

EDIT1:我喜歡@CommonsWare評論..也許你可以重新考慮你的方法..

+0

非常有幫助的答案 –

+1

有一點需要記住,這種方法是,onDestroy()不保證在操作系統正在終止進程時被調用。在運行預蜂窩版Android的設備上,onPause()也是如此。 – adstro

相關問題