和其他程序不一樣的是,activity不是使用main()函數開始程序,Activity實例調用不同的回調函數對應它的生命周期的不同階段。這裡是安裝一個順序去啟動一個activity,並且按照一個順序去關閉activity。
這節課提供一個生命周期方法的概述,展示了怎麼操作第一個回調函數去創建一個新的activity實例。
理解生命周期回調函數
在activity的生命中,系統安裝順序調用生命周期函數的過程類似一個金字塔。生命周期的每個階段就想金字塔的每一層。系統啟動一個新的activity,調用一個個回調函數,就像一步步的到達金字塔頂端。這個頂端就是activity處於前台狀態的時候,用戶這時可以和它交互。
當用戶離開activity的時候,系統調用另外一些回調函數,讓activity狀態回到金字塔的底部。有時候activity只是走下金字塔的一部分,然後在那裡等待(就想用戶切換到了其他程序),activity可以從這裡重新回到頂端(用戶返回activity),處於前台運行狀態。
基於你的activity的復雜度,你可能不必要實現所有的回調函數。不管怎樣,理解它們,並且按照用戶期望的行為方式實現它們是很重要的。為了確保你的程序保持良好,合理的實現activity生命周期函數有很多方法:
如果用戶接電話或者切換到其他程序時,你的程序不能崩潰。
當用戶不使用它時不要浪費寶貴的系統資源。
當用戶暫時離開程序的時候,不要丟失用戶的進度。
旋轉屏幕的時候不要崩潰和丟失用戶進度。
從上面的圖我們可以看出,一個activity會在不同的狀態間轉換。不過只有3個狀態的靜態的。一段時間中,activity只能處於3個狀態中的一個:
Resumed
這個就是activity處於前台時的狀態。
Paused
處於這個狀態,activity是被其他activity是部分掩蓋著的 - 這個其他activity可能是半透明的,或者是沒有完全覆蓋整個屏幕的。這個狀態下,activity不能接受用戶的輸入,也不能執行任何代碼。
Stopped
這個狀態下,activity是不可見的,它在系統後台運行著。當stopped的時候,activity實例和他的信息狀態像成員變量一樣被保留,也不能執行任何代碼。
其他狀態(Created和Started)是短暫的,系統只是快速的經過這些狀態到底其他狀態。比如,系統調用完onCreate()函數後,很快就調用onStart(),接著很快又調用onResume()。
這些就是生命周期的基礎知識,下面我們將要學習一些特定的生命周期行為。
指定你程序的啟動Activity
當用戶點擊圖標啟動程序的時候,系統會調用你聲明為"launcher"(或者"main")的activity中的onCreate()函數。這個activity就是你的程序界面的主入口。
你可以在AndroidManifest.xml中定義哪個activity是主activity。
主activity必須在清單文件中使用<intent-filter>包含MAIN行為和LAUNCHER分類。比如:
提示:當你使用SDK工具創建工程時,默認已經包含一個activity類,並且清單文件中已經聲明了這個過濾。
如果一個程序中沒有定義任何的MAIN行為或者LAUNCHER分類,那麼你的程序圖標不會出現在屏幕的程序列表中。
創建一個實例
大部分程序都會包含多個不同的activity,允許用戶執行不同的行為。不過你以什麼方式創建一個activity實例,你都需要先執行onCreate()函數。
你必須在onCreate()函數中實現程序的啟動邏輯,在整個生命周期中,整個函數只會執行一次。比如,你必須在onCreate()函數中定義你用戶界面,實例化一些類的作用域變量。
比如,下面的onCreate()代碼執行了activity的一些基本設置,聲明用戶接口(在XML文件中定義),定義成員變量,配置UI。
警告:使用SDK_INT組織老的系統去執行新API支持的方法,否則老版本會產生一個運行錯誤。
當執行完onCreate()函數後,系統馬上連續執行onStart()和onResume()函數。你的activity永遠不會處於Created或者Started狀態。理論上說,在調用onStart()的時候activity已經處於可見狀態了,但是onSumed()馬上就會接著執行,並保持狀態在Resumed,直到一些事情的發生改變它的狀態,比如接電話,啟動其他activity,變換屏幕方向。