活動生命週期結論
- 啟動 Activiy:onCreate => onStart() => onResume(), Activity 進入執行狀態.
- Activity 退居後臺 ( Home 或啟動新 Activity ): onPause() => onStop().
- Activity 返回前臺: onRestart() => onStart() => onResume().
- Activity 後臺期間記憶體不足情況下當再次啟動會重新執行啟動流程。
- 鎖屏: onPause() => onStop().
- 解鎖: onStart() => onResume().
初識Activity
在日常應用中Activity是與使用者互動的介面,它提供了一個使用者完成相關操作的視窗。當我們在開發中建立Activity後,通過呼叫setContentView(View)方法來給該Activity指定一個佈局介面,而這個介面就是提供給使用者互動的介面。Android系統中是通過Activity棧的方式來管理Activity的,而Activity自身則是通過生命週期的方法來管理的自己的建立與銷燬,既然如此,現在我們就來看看Activity生命週期是如何運作的。
Activity的形態
Active/Running
Activity處於活動狀態,此時Activity處於棧頂,是可見狀態,可與使用者進行互動。
Paused
當Activity失去焦點時,或被一個新的非全屏的Activity,或被一個透明的Activity放置在棧頂時,Activity就轉化為Paused狀態。但我們需要明白,此時Activity只是失去了與使用者互動的能力,其所有的狀態資訊及其成員變數都還存在,只有在系統記憶體緊張的情況下,才有可能被系統回收掉。
Stopped
當一個Activity被另一個Activity完全覆蓋時,被覆蓋的Activity就會進入Stopped狀態,此時它不再可見,但是跟Paused狀態一樣保持著其所有狀態資訊及其成員變數。
Killed
當Activity被系統回收掉時,Activity就處於Killed狀態。 Activity會在以上四種形態中相互切換,至於如何切換,這因使用者的操作不同而異。瞭解了Activity的4種形態後,我們就來聊聊Activity的生命週期。
Activity生命週期
這裡我們先來看一張經典的生命週期流程圖:
典型的生命週期方法
onCreate
該方法是在Activity被建立時回撥,它是生命週期第一個呼叫的方法,我們在建立Activity時一般都需要重寫該方法,然後在該方法中做一些初始化的操作,如通過setContentView設定介面佈局的資源,初始化所需要的元件資訊等。
onStart
此方法被回撥時表示Activity正在啟動,此時Activity已處於可見狀態,只是還沒有在前臺顯示,因此無法與使用者進行互動。可以簡單理解為Activity已顯示而我們無法看見擺了。
onResume
當此方法回撥時,則說明Activity已在前臺可見,可與使用者互動了,onResume方法與onStart的相同點是兩者都表示Activity可見,只不過onStart回撥時Activity還是處於後臺無法與使用者互動,而onResume則已顯示在前臺,可與使用者互動。當然從流程圖,我們也可以看出當Activity停止後(onPause方法和onStop方法被呼叫),重新回到前臺時也會呼叫onResume方法,因此我們也可以在onResume方法中初始化一些資源,比如重新初始化在onPause或者onStop方法中釋放的資源。
onPause
此方法被回撥時則表示Activity正在停止(Paused形態),一般情況下onStop方法會緊接著被回撥。但通過流程圖我們還可以看到一種情況是onPause方法執行後直接執行了onResume方法,這屬於比較極端的現象了,這可能是使用者操作使當前Activity退居後臺後又迅速地再回到到當前的Activity,此時onResume方法就會被回撥。當然,在onPause方法中我們可以做一些資料儲存或者動畫停止或者資源回收的操作,但是不能太耗時,因為這可能會影響到新的Activity的顯示——onPause方法執行完成後,新Activity的onResume方法才會被執行。
onStop
一般在onPause方法執行完成直接執行,表示Activity即將停止或者完全被覆蓋(Stopped形態),此時Activity不可見,僅在後臺執行。同樣地,在onStop方法可以做一些資源釋放的操作(不能太耗時)。
onRestart
表示Activity正在重新啟動,當Activity由不可見變為可見狀態時,該方法被回撥。這種情況一般是使用者開啟了一個新的Activity時,當前的Activity就會被暫停(onPause和onStop被執行了),接著又回到當前Activity頁面時,onRestart方法就會被回撥。
onDestroy
此時Activity正在被銷燬,也是生命週期最後一個執行的方法,一般我們可以在此方法中做一些回收工作和最終的資源釋放。
Activity異常生命週期
異常的生命週期是指Activity被系統回收或者當前裝置的Configuration發生變化(一般指橫豎屏切換)從而導致Activity被銷燬重建。異常的生命週期主要分以下兩種情況:
- 相關的系統配置發生改變導致Activity被殺死並重新建立(一般指橫豎屏切換)
- 記憶體不足導致低優先順序的Activity被殺死
onSaveInstanceState和onRestoreInstanceState方法是幹什麼用的呢?
實際上這兩個方法是系統自動呼叫的,當系統配置發生變化後,Activity會被銷燬,也就是onPause,onStop,onDestroy會被依次呼叫,同時因為Activity是在異常情況下銷燬的,android系統會自動呼叫onSaveInstanceState方法來儲存當前Activity的狀態資訊,因此我們可以在onSaveInstanceState方法中儲存一些資料以便Activity重建之後可以恢復這些資料,當然這個方法的呼叫時機必須在onStop方法之前,也就是Activity停止之前。至跟onPause方法的呼叫時機可以隨意。
當Activity被重新建立之後,系統還會去呼叫onRestoreInstanceState方法,並把Activity銷燬時通過onSaveInstanceState方法儲存的Bundle物件作為引數同時傳遞給onRestoreInstanceState和onCreate方法,因此我們可以通過onRestoreInstanceState和onCreate方法來判斷Activity是否被重新建立,倘若被重建了,我們就可以對之前的資料進行恢復。onRestoreInstanceState方法的呼叫時機是在onStart之後的。
這裡有點需要特別注意,onSaveInstanceState和onRestoreInstanceState只有在Activity異常終止時才會被呼叫的,正常情況是不會呼叫這兩個方法的。
如何選擇onRestoreInstanceState和onCreate進行資料恢復?
其實兩者都可以,兩者的區別在於,onRestoreInstanceState方法一旦被系統回撥,其引數Bundle一定不為空,無需額外的判斷,而onCreate的Bundle卻不一定有值,因為如果Activity是正常啟動的話,Bundle引數是不會有值的,因此我們需要額外的判斷條件,當然雖說兩者都可以資料恢復,但更傾向於onRestoreInstanceState方法。