Activity生命週期和啓動模式

Activity的生命週期分爲兩個部分,一部分是典型情況下的生命週期,另一部分是異常情況下的生命週期。
onCreate()他會在Activity第一次被創建時調用,通常完成Activity的初始化操作,如設置佈局、初始化試圖、綁定事件等。
onStart()此時的Activity還處在不可見狀態、它的下一個狀態就是Activity變得可見的時候,也就是這個函數在Activity可見之前被調用。這個時候Activity已經顯示出來了,但是我們看不到。
onResume()這個函數在Activity變爲可見時被調用,執行完這個函數後,Activity就會請求AMS渲染它所管理的試圖。Activity已經可見了,另外onStart的時候Activity還在後臺,onResume的時候Activity才顯示到前臺。
onPause()在Activity即將從可見狀態變爲不可見時調用。我們通常會在這個函數中將一些消耗CPU的資源釋放掉,以及保存一些關鍵數據。這個函數不能做太耗時的操作,因爲這會影響到新的Activity的顯示,onPause必須先執行完,新Activity的onResume纔會執行。
onStop()在Activity完全不可見時調用。如果新啓動的Activity是一個對話框Activity或透明主題的Activity,那麼該函數並不會被執行。可以做一些稍微重量級的回收工作,同樣不能太耗時。
onRestart()這個函數在Activity由停止狀態重新變爲運行狀態之前調用。
只有onResume和onStop函數之間的Activity是可見的。從Activity是否可見來說,onStart和onStop是配對的;從Activity是否在前臺來說,onResume和onPause是配對的。
Android運行的基本機制在不同Android版本上具有延續性。Android官方文檔對onPause的解釋有這麼一句,不能在onPause中做重量級的操作,因爲必須onPause執行完成以後新Activity才能Resume,也意味着我們應當儘量在onStop中做操作,從而使得新Activity儘快顯示出來並切換到前臺。
當旋轉屏幕,在默認情況下,Activity就會被銷燬並且重新創建,當然我們也可以阻止系統重新創建我們的Activity。同時由於Activity是在異常情況下終止的,系統會調用onSaveInstanceState來保存當前Activity狀態,這個方法的調用時機實在onStop之前。onRestoreInstanceState的調用時機在onStart之後。
當Activity在異常情況下需要重新創建時,系統會默認爲我們保存Activity的視圖結構。和Activity一樣,每個view都有onSaveInstanceState和onRestoreInstanceState方法。關於保存和恢復view層次結構,系統的工作流程是這樣的,
Activity調用onSaveInstanceState去保存數據,然後Activity會委託Window去保存數據,Window再委託頂級容器去保存數據,頂級容器一般是DecorView,最後頂層容器再去一一通知它的子元素來保存數據。
當系統內存不足時,如果一個進程中沒有四大組件在執行,那麼這個進程將很快被系統殺死。
如果不想讓Activity在屏幕旋轉的時候重新創建,就可以給configChanges屬性添加orientation這個值。SdkVersion大於13的話,還要加上screenSize。這樣配置的話,Activity就不會調用onSaveInstanceState和onRestoreInstanceState來存儲和恢復數據,取而代之的是系統調用了Activity的onConfigurationChanged方法。
Activity的構成並不是一個Activity對象再加上一個佈局文件那麼簡單,在Activity和開發人員設置的試圖之間還隔着兩層。實際上試圖會被設置一個window類,window中含有一個Decorview,它是整個窗口的頂級視圖。開發人員設置的佈局會被設置到這個Decorview的mContentParent佈局中。我們的Activity之下有一個PhoneWindow類,它是window的實現類,然後window之下包含一個Decorview,它是頁面的頂級視圖。並且在運行時將開發人員設置給Activity的佈局資源添加到系統佈局的mContentParent中,系統佈局會爲我們設置好標題欄等。在Activity的onResume函數被調用之後,用戶界面就顯示在我們面前了。
Activity的啓動模式有四個,standard、singleTop、singleTask、singleInstance。singleTask模式是常用的啓動模式,如果Activity設置了該啓動模式,那麼在一個任務棧中只能有一個該Activity實例。如果任務棧中還沒有該Activity,會新創建一個實例並放在棧頂。如果已經存在,系統會銷燬處在該Activity上的所有Activity,singleTask默認具有clearTop的效果最終讓該Activity實例處於棧頂,同時回調該Activity的onNewIntent函數。singleInstance模式的Activity會在一個獨立的任務中開啓,與singleTask不同的是,同一時刻在系統中只會存在一個這樣的Activity實例,而singleTask模式的Activity是可以有多個實例的,只要這些Activity在不同的任務棧中即可。
假設目前有2個任務棧,前臺任務棧的情況爲AB,而後臺任務棧的情況爲CD,CD的啓動模式爲singleTask。現在B啓動D,那麼整個後臺任務棧都會被切換到前臺,這個時候整個後退列表爲ABCD。
TaskAffinity任務相關性,這個參數標識了一個Activity所需要的任務棧的名字,默認Activity的任務棧的名字爲應用的包名,我們可以爲每個Activity單獨指定TaskAffinity,該屬性主要和singleTask啓動模式或者allowTaskReparenting屬性配對使用。
當TaskAffinity和singleTask啓動模式配對使用的時候,它是具有該模式的Activity的目前任務棧的名字,待啓動的Activity會運行在名字和TaskAffinity相同的任務棧中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章