Activity的生命週期
Activity通過一個Activity棧來進行管理。當一個新的Activity啓動的時候,它會首先被放置在Activity棧頂部,並且該 Activity的狀態爲Running,之前的Activity也在Activity棧中,但是被保存在它的下邊,只有當這個新的Activity推出之後,以前的Activity才能重新回到前景界面。
Activity有四種基本狀態:
Active/Running:一個新的Activity啓動入棧之後,它位於屏幕的最前端,Activity棧的最頂端,此時它處於可見並可以和用戶交互的狀態。
Paused:Activity失去了焦點,但仍然可見,這時爲Paused狀態。例如,被另一個透明的或者Dialog樣式的Activity覆蓋時的狀態。因爲失去了焦點,故不可與用戶交互。
Stopped:當Activity被另一個Activity完全覆蓋、失去焦點,並不可見,這叫處於Stopped狀態,它仍然保持着所有的狀態和成員 信息,但對於用戶來講,它是不可見的。當系統內存需要被用在其他地方的時候,Stopped的Activity將被殺掉。
Killed Activity:被系統殺死回收或者沒有被啓動時處於Killed狀態。Activity爲Paused或者Stopped狀態,系統需要清理內存時, 可以通過finish或者kill結束其進程。當需要重新顯示時,必須完全啓動,並將其關閉之前的狀態全部恢復。
Activity有三個關鍵的生命週期:
1. 完 整生命週期,從onCreate(Bundle)開始到onDestroy()結束。Activity在onCreate()設置所有的“全局”狀態,在 onDestory()釋放所有的資源。例如:某個Activity有一個在後臺運行的線程,用於從網絡下載數據,則該Activity可以在 onCreate()中創建線程,在onDestory()中停止線程。
2. 可見的生命週期,從onStart()開始到 onStop()結束。在這段時間,可以看到Activity在屏幕上,儘管有可能不在前臺,不能和用戶交互。在這兩個接口之間,需要保持顯示給用戶的 UI數據和資源等,例如:可以在onStart中註冊一個IntentReceiver來監聽數據變化導致UI的變動,當不再需要顯示時候,可以在 onStop()中註銷它。onStart(),onStop()都可以被多次調用,因爲Activity隨時可以在可見和隱藏之間轉換。
3. 前 臺的生命週期,從onResume()開始到onPause()結束。在這段時間裏,該Activity處於所有 Activity的最前面,和用戶進行交互。Activity可以經常性地在resumed和paused狀態之間切換,例如:當設備準備休眠時,當一個 Activity處理結果被分發時,當一個新的Intent被分發時。所以在這些接口方法中的代碼應該屬於非常輕量級的。
Activity類中定義了8個方法,可以通過重寫這些方法達到在Activity轉改改變時執行你所期望的操作。當實現這些方法是,需要注意的是一定要調用父類的對應方法。
public class Activity extendsAplicationContext {
protected void onCreate(Bundle icicle);
protected void onStart();
protected void onResume();
protected void onFreeze(Bundle outIcicle);
protected void onPause();
protected void onStop();
protected void onDestroy();
}
上述方法的含義用下表解釋:
方法 | 描述 | 完成後可否被殺掉? | 下一個方法 |
onCreate(Bundle) |
Activity初次創建時調用該方法。一般情況下,我們會重寫該方法,並作爲應用程序的入口,在這個方法中可以進行初始化數據、設置用戶界面等操作。大多數情況下,我們需要在這裏加載用戶界面xml資源文件,例如setContentView(R.layout.main),如果Activity之前存在凍結狀態,那麼此狀態將在Bundle中提供,如果Activity首次創建,本方法後將會調用onStart()方法,如果Activity是停止後重新顯示,將調用onRestart()方法。 |
否 | onStart() |
onStart() |
該方法在onCreate()方法之後被調用,或者在從Activity從Stopped狀態轉換爲Active狀態時調用。其後調用onRestart()方法或者onResume()方法。 |
否 | onResume() onStop() |
onRestart() |
當Activity從停止狀態重新啓動時調用。其後調用Resume()方法。 |
否 | onStart() |
onResume() | 當Activity將要與用戶交互時調用此方法,此時Activity在棧頂,用戶輸入已經可以傳遞給它。如果其它的Activity在它的上方恢復顯示,則將調用onFreeze()方法。 | 否 | onPause() |
onFreeze(Bundle) | 當Activity暫停,其它的Activity恢復與用戶交互的時候調用這個方法。 | ||
onPause() | 當系統要調用其他的Activity時調用,一般該方法用來提交數據的改變,停止動畫,和其它佔用CPU資源的東西。如果Activity重新回到前景則調用onResume()方法,如果對用戶徹底不可見則調用onStop()方法。 | 是 | onResume() onStop() |
onStop() | 當其他Activity恢復並遮蓋此Activity,導致此用戶不可見時調用。當Activity重新回到前景與用戶交互時調用onRestart()方法,如果Activity將退出則調用onDestroy()方法。 | 是 | onRestart() onDestroy() |
onDestroy | 在Activity被銷燬前調用的最後一個方法,當進程終止時會出現這種情況(調用Activity提過的一個finish()方法或者系統爲了節省空間而臨時銷燬Activity的實例,可以通過isFinishing()方法返回值區分這兩種情況)。 | 是 | 無 |