2014-02-19 28 views
1

我有一個應用程序,我已經將某個服務連接到自定義應用程序類中,以便所有活動都可以訪問它,但是一旦我的應用程序關閉,我需要關閉該服務。如何捕捉應用程序的結尾?

我想發送捆綁數據只是一次,而不是每次單個活動命中onPause/Destroy()。

我也想到了Application類中的Terminate()並不總是被調用。

有沒有更好的方法來做到這一點?

+0

'onTerminate'「是在仿真過程中的環境中使用」它實際上應該永遠不會被稱爲真正的設備應用程序,因爲應用程序進程只是被殺死 – zapl

回答

3

如果您的目標是API級別14或更高,則可以使用registerActivityLifecycleCallbacks註冊偵聽器並計算onActivityResumed和onActivityStopped中的啓動/停止次數。當計數器爲0時,您知道堆棧中沒有更多的活動,並且您可以關閉服務

+0

謝謝阿列克斯!這種方法接近完成我所需要的:) 這裏是一個非常有用的文章,爲未來的流浪者 - http://www.mjbshaw.com/2012/12/determining-if-your-android-application.html 我現在可以對後臺應用程序進行正確的反應並回到最前面。 –

1

不幸的是,沒有回調/方法來檢測您的應用程序進程何時停止或將要停止。 @Alex建議收聽Activity生命週期回調可能會更棘手。

但是,如果你想檢測到這只是爲了停止運行Service,那麼這個問題是不相關的,因爲如果你的進程彎腰,那麼它擁有的所有正在運行的服務也會停止!

如果你的意思是要停止服務時,應用程序不是在前臺(完全不同的事情..),那麼解決方案不同的是:

如果你總是使用bindService()代替startService()內的onResume活動回調,並在onPause()停止它,然後當你的應用程序將進入後臺 - 服務將自動停止。

另一種選擇是使用服務回調來檢測,如果目前有界的活動:

@Override 
public IBinder onBind(Intent intent) { 
    mBoundedToActivity = true; 
    return mBinder; 
} 

@Override 
public void onRebind(Intent intent) { 
    mBoundedToActivity = true; 
    super.onRebind(intent); 
} 

@Override 
public boolean onUnbind(Intent intent) { 
    mBoundedToActivity = false; 
    return super.onUnbind(intent); 
} 
+0

我真的不在乎服務如何死亡,我有從所有活動收集的數據並捆綁在一個地方,只需要在用戶離開我的應用程序時通過服務將此數據發送到服務器(他已完成使用它並退出或打開另一個,而我的背景停留並最終在不久的將來死亡)。我只想抓住我的應用程序死亡的時刻,並在此之前使用該服務推送收集的數據。這可以確保我只需一個連接,而不必監聽應用程序中每個活動的onPause()。 –

+0

@troty_master:「app for good」=應用程序進程已停止?或=應用程序在後臺?我仍然不明白你們兩個的意思是什麼 –

+0

我猜這兩種方法都行得通,只要我不會錯過發送數據的機會,而且我不會多次發送它,以便單次使用我的應用程序。 –

相關問題