Activity的生命周期
一、Activity的生命周期
1)onCreate:表示Activity正在被創建,生命周期的第一個方法。
2)onRestart:表示Activity正在重新啟動。當前Activity從不可見重新變為可見狀態時,onRestart就會被調用。
3)onStart:表示Activity正在被啟動,即將開始,這時Activity已經可見了,但是還沒有出現在前臺,還無法和用戶交互。
4)onResume:表示Activity已經可見了,并且出現在前臺并開始活動。
5)onPause:表示Activity正在停止,緊接著onStop就會被調用。可以做一些存儲數據、停止動畫等工作,但不能太耗時。onPause必須先執行完,新Activity的onResume才會執行。
6)onStop:表示Activity即將停止,可以做一些稍微重量級的回收工作,同樣不能太耗時。
7)onDestroy:表示Activity即將被銷毀,是Activity生命周期中的最后一個回調,可以做一些回收工作和最終的資源釋放。

注:透明的Activity不會回調onStop
二、異常情況下的生命周期分析

1) 當系統配置發生改變之后,Activity會被銷毀,其onPause,(onSaveInstanceState),onStop,onDestroy均會被調用,同時由于Activity是在異常情況下終止的,系統會在onStop之前調用onSaveInstanceState來保存當前的Activity的狀態。
2) 當Activity被重新創建后,系統會調用onRestoreInstanceState,并且把Activity銷毀時onSaveInstanceState方法保存的Bundle對象作為參數同時傳遞給onRestoreInstanceState和onCreate方法。
從時序上來說,onRestoreInstanceState的調用時機在onStart之后。
3) 當系統內存不足時,系統也會按照上述優先級去殺死目標Activity所在的進程,并后續通過onSaveInstanceState和onRestoreInstanceState來存儲和恢復數據。``
三、常見的應用問題分析
1.如果一個Activity在用戶可見時才處理某個廣播,不可見時注銷掉,那么應該在哪個生命周期的回調方法去注冊和注銷BroadcastReeiver呢?
Activity的可見生命周期發生在onStart調用和onStop調用之間。在這段時間,用戶可以在屏幕上看到Activity并與其交互。因此,我們可以在onStart中注冊一個BroadcastReceiver以監控影響UI的變化,并在用戶無法看到您顯示的內容時在onstop中將其取消注冊。
為什么不能放在onPause方法中?
原因是onPause較容易被觸發,如彈出一個Dialog對話框時,Activity界面仍然是可見的,但onPause方法會被調用。所以,在保存數據時,為保證數據存儲的有效性可以放在onPause去做。在某些情況下,Activity走完onPause后,還未執行到onStop就被系統回收了。注意:onPause中要非常迅速地執行完所需操作,否則會影響下一個Activity的生命周期函數的調用。
從Activity A啟動Activity B時,它們的生命周期發生順序是:
A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> B顯示,同時A在屏幕上不可見 -> A.onStop().
由上面的流程可知,啟動第B的過程與停止A的過程存在重疊。
2.finish和onDestory方法區別?
先看看Activity的源碼注釋是怎么說的
~~~
/**
* Call this when your activity is done and should be closed.
*/
public void finish() {...}
~~~
在你的activity動作完成的時候,或者是activity需要關閉的時候調用此方法。
也就是說,調用些方法之后,系統只是將該Activity從棧中移除了,但并沒有及時的調用onDestory方法,其還占用著內存資源。此時點擊手機上的back鍵,再也找不到這個Activity了,因為它已經移出了棧。
~~~
/**
* Perform any final cleanup before an activity is destroyed. This can
* happen either because the activity is finishing (someone called
* {@link #finish} on it, or because the system is temporarily destroying
* this instance of the activity to save space. You can distinguish
* between these two scenarios with the {@link #isFinishing} method.
*/
protected void onDestroy() {...}
~~~
調用這個方法后,系統會銷毀這個Activity的實例在內存中占據的空間。重新進入該Activity時,系統會執行onCreate方法進行重新創建。
調試可以發現,執行finish會調用到onDestory方法,即 finish() -> onPause() -> onStop() -> onDestory()。
finish()方法用于主動結束一個Activity的生命周期,而onDestory()方法則是Activity生命周期的中最后一步,調用該方法后,系統會釋放此Activity之前占用的內存資源。