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顯示出來。

关注微信公众号

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com