當Activity 處於Android 應用中運行時,它的活動狀態由 Android 以 Activity 棧的形式管理。當前活動的Activity位於棧頂。隨著不同應用的運行,每個Activity都有可能從活動狀態轉入非活動狀態,也可能從非活動狀態轉入活動狀態。 Activity 的生命周期 歸納
當Activity 處於Android 應用中運行時,它的活動狀態由 Android 以 Activity 棧的形式管理。當前活動的Activity位於棧頂。隨著不同應用的運行,每個Activity都有可能從活動狀態轉入非活動狀態,也可能從非活動狀態轉入活動狀態。
Activity 的生命周期
歸納起來 Activity 大致會經過如下4個狀態:
1、活動狀態:當前Activity位於前臺,用戶可見,可以獲得焦點
2、暫停狀態:其他Activity位於前臺,該Activity依然可見,只是不能獲得焦點。
3、停止狀態:該Activity不可見,失去焦點。
4、銷毀狀態:該Activity結束或Activity所在的Dalvlik進程被結束。
從上圖中可以看出,在Activity的生命周期中,如下方法會被系統回調。
1、onCreate(Bundle savedInstanceState):創建Activity時被回調。該方法只能被調用一次。
2、onStart():啟動Activity時被回調。
3、onRestart():重新啟動Activity時被回調。
4、onResume():恢復Activity時被回調,onStart()方法後一定會回調onResume()方法。
5、onPause():暫停Activity時被回調。
6、onStop():停止Activity時被回調。
7、onDestroy():銷毀Activity時被回調。該方法只會被調用一次。
開發Activity時也可根據需要選擇性的覆蓋指定方法。其中最常見的就是覆蓋onCreate(Bundle savedInstanceState)方法,該方法用於對該Activity執行初始化。除此之位,覆蓋onPause()方法也很常見:比如用戶正在玩一個游戲,此時又電話進來,那麼我們需要將當前(游戲)暫停,並保存該游戲的進行狀態,這就可以覆蓋onPause()方法來實現。接下來當用戶再次切換到游戲狀態時,onResume()方法已經會被回調,因此可以通過重寫onResume()方法來恢復游戲狀態。
Activity 的4種載入模式
在AndroidManifest.XML中配置Activity時可指定android:launchMode屬性,該屬性用於配置該Activity的載入模式,該屬性支持如下4個屬性值:
1、standard:標準模式,這是預設的載入模式
2、singleTop:Task頂單例模式。
3、singleTask:Task內單例模式。
4、singleInstance:全局單例模式。
在介紹Activity的載入模式之前,先介紹Android對Activity的管理:Android採用Task來管理多個Activity,當我們啟動一個應用時,Android就會為之創建一個Task,然會啟動這個應用的入口Activity(即<intent-filter.../>中配置為MAIN和LAUNCHER的Activity)。
Android的Task是一個有點麻煩的概念——因為Android並沒有為Task提供API,因此開發者無法真正去訪問Task,只能調用Activity的getTaskId()方法來獲取它所在的Task的ID。事實上我們可以把Task理解成Activity棧,Task以棧的形式來管理Activity:先啟動的Activity被放在Task棧底,後啟動的Activity被放在Task棧頂。
那麼Activity的載入模式,就負責管理實例化、載入Activity的方法、並可以控制Activity與Task之間的價值關係。
詳細介紹這4種載入模式
1、standard模式
每次通過這種模式來啟動目標Activity時,Android總會為目標Activity創建一個新的實例,並將該Activity添加到當前的Task棧中——這種模式不會啟動新的Task,新Activity將被添加到原有的Task中。
2、singleTop模式
這種模式與 standard 模式基本相似,但有一點不同:當將要被啟動的目標Activity已經位於Task棧頂時,系統不會重新創建目標Activity的實例,而是直接服用已有的Activity實例。
3、singleTask模式
採用赭紅載入模式的Activity在用一個Task內只有一個實例,當系統採用singleTask模式啟動目標Activity時,可分為如下三種情況:
3.1、如果將要啟動的目標Activity不存在,系統將會創建目標Activity的實例,並將它加入Task棧頂。
3.2、如果將要啟動的目標Activity已經位於Task棧頂,此時與singleTop模式的行為相同。
3.3、如果將要啟動的目標Activity已經存在,但沒有位於Task棧頂,系統將會把位於該Activity上面的所有Activity移除Task棧,從而使得目標Activity轉入棧頂。
4、singleInstance模式
這種載入模式下,系統保證無論從那個Task中啟動目標Activity,只會創建一個目標Activity實例,並會使用一個全新的Task棧來裝載該Activity實例。
當系統採用singleInstance模式啟動目標Activity時,可分為如下兩種情況:
4.1、如果將要啟動的目標Activity不存在,系統會先創建一個全新的Task、再創建模板Activity的實例,並將它加入新的Task的棧頂。
4.2、如果將要啟動的目標Activity已經存在,無論它位於哪個應用程式中,無論它位於哪個Task中,系統將會把該Activity所在的Task轉到前臺,從而使用該Activity顯示出來。