iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0
Mobile Development

刮掉Web Development的我,與撿到的Android Development系列 第 7

[Lesson7] Activity生命週期

為了在Activity生命週期的各個階段之間導航轉換,Activity類提供六個核心回調:onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()。當Activity進入新狀態時,系統會調用其中每個回調。
https://ithelp.ithome.com.tw/upload/images/20210831/20129566HcuX75VhcZ.png
onCreate():
您必须實現此回調,它會在系统首次創建Activity時觸發。Activity會在創建後進入“已創建”狀態。在onCreate()方法中,您需執行基本應用啟動邏輯,該邏輯在Activity的整個生命週期中只應發生一次。例如:onCreate()的實現可能會將數據绑定到列表,將Activity與ViewModel相關聯,並實例化某些類作用域變量。此方法會接收savedInstanceState參數,後者是包含Activity先前保存狀態的Bundle對象。如果Activity此前未曾存在,Bundle 對象的值為null。
如果您有一個生命週期感知型組件與您的Activity生命週期相關聯,該組件將收到ON_CREATE事件。系统將調用帶有 @OnLifecycleEvent注釋的方法,以使您的生命週期感知型組件可以執行已創建狀態所需的任何設置代碼。
onCreate()方法完成執行後,Activity進入“已開始”狀態,系統會用onStart()和onResume()方法。

onStart():
當Activity進入“已開始”狀態時,系統會調用此回調。onStart()調用使Activity對用户可見,因為應用會為 Activity進入前台並支持互動做準備。例如:應用通過此方法來初始化維護界面的代碼。
當Activity進入已開始狀態時,與Activity生命週期相關聯的所有生命週期感知型組件都將收到ON_START事件。
onStart()方法會非常快速地完成,並且與“已創建”狀態一樣,Activity不會一直處於“已開始”狀態。一旦此回調结束,Activity便會進入“已恢復”狀態,系統將調用onResume()方法。

onResume():
Activity會在進入“已恢復”狀態時來到前台,然後系統調用onResume()回調。這是應用與用户互動的狀態。應用會一直保持這種狀態,直到某些事件發生,讓焦點遠離應用。此類事件包括接到來電、用户導航到另一個Activity,或設備螢幕關閉。
當Activity進入“已恢復”狀態時,與Activity生命週期相關聯的所有生命週期感知型組件都將收到ON_RESUME事件。這時,生命週期組件可以啟用在組件可見且位於前台時需要運行的任何功能,例如啟動相機預覽。
當發生中斷事件時,Activity進入“已暫停”狀態,系统調用onPause()回調。
如果Activity從“已暫停”狀態返回“已恢復”狀態,系统將再次調用onResume()方法。因此,您應實現onResume(),以初始化在onPause()期間釋放的組件,並執行每次Activity進入“已恢復”狀態時必須完成的任何其他初始化操作。
無論您選擇在哪個構建事件中執行初始化操作,都請務必使用相應的生命週期事件來釋放資源。如果您在收到ON_START事件後初始化某些内容,請在收到ON_STOP事件後釋放或終止相應内容。如果您在收到ON_RESUME事件後初始化某些内容,請在收到ON_PAUSE事件後將其釋放。

onPause():
系統將此方法視為用户將要離開您的Activity的第一個標誌(僅管這並不總是意味著Activity會被銷毀);此方法表示 Activity不再位於前台(僅管在用户處於多窗口模式時Activity仍然可見)。使用onPause()方法暫停或調整當Activity處於“已暫停”狀態時不應繼續(或應有節制地繼續)的操作,以及您希望很快恢復的操作。
您還可以使用onPause()方法釋放系統資源、傳感器(例如GPS)手把,或當您的Activity暫停且用户不需要它們時仍然可能影響電池續航時間的任何資源。
onPause()執行非常簡單,而且不一定要有足夠的時間来執行保存操作。因此,您不應使用onPause()来保存應用或用户數據、進行網路調用或執行數據庫事務。因為在該方法完成之前,此類工作可能無法完成。相反,您應在onStop()期間執行高負載的關閉操作。
onPause()方法的完成並不意味著Activity離開“已暫停”狀態。相反,Activity會保持此狀態,直到其恢復或變成對用户完全不可見。如果Activity恢復,系統將再次調用onResume()回調。如果Activity從“已暫停”狀態返回“已恢復”狀態,系統會讓Activity實例繼續駐留在内存中,並會在系統調用onResume()時重新調用該實例。在这种情况下,您無需重新初始化在任何回調方法導致Activity進入“已恢復”狀態期間創建的組件。如果Activity變為完全不可見,系統會調用onStop()。

onStop():
如果您的Activity不再對用户可見,說明其已进入“已停止”狀態,因此系統將調用onStop()回調。例如,當新啟動的 Activity覆蓋整个營幕時,可能會發生這種情况。如果Activity已结束運行並即將終止,系統還可以調用onStop()。
當Activity進入已停止狀態時,與Activity生命週期相關聯的所有生命週期感知型組件都將收到ON_STOP事件。這時,生命週期組件可以停止在組件未顯示在螢幕上時無需運行的任何功能。
在onStop()方法中,應用應釋放或調整在應用對用户不可見時的無用資源。例如,應用可以暫停動畫效果,或從精確位置更新切換到粗略位置更新。使用onStop()而非onPause()可確保與界面相關的工作繼續進行,即使用户在多窗口模式下查看您的Activity也能如此。
您還應使用onStop()執行CPU相對密集的關閉操作。例如,如果您無法找到更合適的時機來將信息保存到數據庫,可以在onStop()期間執行此操作。
當您的Activity進入“已停止”狀態時,Activity對象會繼續駐留在内存中:該對象將維護所有狀態和成員信息,但不會附加到窗口管理器。Activity恢復後,Activity會重新調用這些信息。您無需重新初始化在任何回調方法導致Activity進入“已恢復”狀態期間創建的組件。
進入“已停止”狀態後,Activity要嘛返回與用户互動,要嘛結束運行並消失。如果Activity返回,系統將調用onRestart()。如果Activity結束運行,系統將調用onDestroy()。

onDestroy():
銷毀Ativity之前,系統會先調用onDestroy()。
當Activity進入已銷毀狀態時,與Activity生命週期相關聯的所有生命週期感知型組件都將收到ON_DESTROY事件。這時,生命週期組件可以在Activity被銷毁之前清理所需的任何數據。
您應使用ViewModel對象来包含Activity的相關視圖數據,而不是在您的Activity中加入邏輯來確定Activity被銷毁的原因。如果因配置變更而重新創建Activity,ViewModel不必執行任何操作,因为系統將保留ViewModel並將其提供給下一個Activity實例。如果不重新創建Activity,ViewModel將調用onCleared()方法,以便在Activity被銷毁前清除所需的任何數據。
您可以使用isFinishing()方法區分這兩種情况。
如果Activity即將結束,onDestroy()是Activity收到的最後一個生命週期回調。如果由於配置變更而調用onDestroy(),系統會立即新建Activity實例,然後在新配置中為新實例調用onCreate()。
onDestroy()回調應釋放先前的回調(例如onStop())尚未釋放的所有資源。

參考資料:https://developer.android.com/guide/components/activities/activity-lifecycle?hl=zh-cn
謝謝大家願意花時間閱讀,小弟弟我在此鞠躬/images/emoticon/emoticon41.gif


上一篇
[Lesson6] Fragment
下一篇
[Lesson8] MediaPlayer
系列文
刮掉Web Development的我,與撿到的Android Development30

尚未有邦友留言

立即登入留言