Android Activity的启动模式及对生命周期的影响
Activity的啟動模式
官網解釋鏈接
(tips:在閱讀此文章前,應先對Activity生命周期掌握)
在每一個程序的main目錄下有一個AndroidManifest.xml文件,這個文件是用來配置Activity的,在配置Activity時可指定android:launchMode 屬性,該屬性用于配置該Activity的啟動模式(或稱加載模式)。
eg:AndroidManifest.xml
android:launchMode 屬性支持如下4個屬性值:
- standard:標準模式,這也是默認的加載模式。
- singleTop:Task棧頂單列模式。
- singleTask:Task內單列模式。
- singleInstance:全局單列模式。
Activity的啟動模式負責管理實例化、啟動Activity的方式,并可以控制Activity與Task之間的加載關系。
Task可以理解為Activity棧,Task以棧的形式來管理Activity,并且先啟動的Activity被放入棧底,后啟動的Activity被置于棧頂。
standard模式以及對Activity生命周期的影響
啟動Activity時,Android都會為目標Activity創建一個新的實例,并添加在當前的Task棧中。特點:一直啟動新的Activity實例并且不會啟動新的Task。
MainActivity部分代碼:
PersonActivity部分代碼:
findViewById(R.id.imageView2).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(view.getContext(), MainActivity.class);view.getContext().startActivity(intent);}});上面兩段代碼意思是在MainActivity中點擊id為imageButton的按鈕時,啟動PersonActivity;在PersonActivity中點擊id為imageView2的控件時,啟動MainActivity。
在AndroidManifest.xml中設置MainActivity和PersonActivity的啟動模式為standard:
運行程序,進入MainActivity,點擊按鈕啟動PersonActivity,進入PersonActivity,點擊圖片控件啟動MainActivity,進入MainActivity,再次點擊按鈕啟動PersonActivity觀察其生命周期的變化:
MainActivity實例1:onCreate()->
MainActivity實例1:onStart()->
MainActivity實例1:onResume()->
此時點擊按鈕->
MainActivity實例1:onPause()->
PersonActivity()實例1:onCreate()->
PersonActivity實例1:onStart()->
PersonActivity實例1:onResume()->
MainActivity實例1:onStop()->
此時點擊圖片控件->
PersonActivity實例1:onPause()->
MainActivity實例2:onCreate()->
MainActivity實例2:onStart()->
MainActivity實例2:onResume()->
PersonActivity實例1:onStop()->
此時點擊按鈕->
MainActivity實例2:onPause()->
PersonActivity()實例2:onCreate()->
PersonActivity實例2:onStart()->
PersonActivity實例2:onResume()->
MainActivity實例2:onStop()
上述生命周期加粗處以及圖片標記顏色處發現:在同一個Activity對的實例未銷毀,卻進行的是onCreate()而不是onRestart()。因此,在標準模式下,Activity創建了新的對象加入Task棧頂,原來的實例在Task棧內。(不同Activity實例的hashCode值有差異,但它們所在的TaskID總是相同的,表明標準模式不會使用新的Task)
singleTop模式以及對Activity生命周期的影響
singleTop模式與standard模式類似,不同點在于singleTop模式時,若需啟動的目標Activity已經位于Task棧頂時,系統不會重新創建目標Activity的實例,而是復用已有位于棧頂Activity實例。
其對于Activity生命周期的影響與standard模式不同的時,當動的目標Activity已經位于Task棧頂時,不會onCreate(),而是onRestart()。其他情況與standard模式保持一致,在此不做詳細敘述。
singleTask模式以及對Activity生命周期的影響
采用singleTask這種加載模式的Activity能保證在同一個Task內只有某個Activity的一個實例,當系統采用singleTask 模式啟動目標Activity時,可分為如下三種情況:
代碼參考standard模式中貼的代碼,其中將MainActivity與PersonActivity的啟動模式設置為android:launchMode=“singleTask”
觀察在singleTask模式下對Activity生命周期的影響:
MainActivity:onCreate()->
MainActivity:onStart()->
MainActivity:onResume()->
此時點擊按鈕->
MainActivity:onPause()->
PersonActivity():onCreate()->
PersonActivity:onStart()->
PersonActivity:onResume()->
MainActivity:onStop()->
此時點擊圖片控件->
PersonActivity:onPause()->
MainActivity:onRestart()->
MainActivity:onStart()->
MainActivity:onResume()->
PersonActivity:onStop()->
上述生命周期加粗處以及圖片標記顏色處發現:啟動目標Activity在Task棧中存在時,會直接啟動已存在的Activity的實例復用,并且會銷毀Task棧中在此Activity實例上的Activity實例。
singleInstance模式以及對Activity生命周期的影響
在singlelInstance這種啟動(加載)模式下,系統保證無論從哪個Task中啟動目標Activity,只會創建一個目標Activity實例,并會使用一個全新的Task 棧來加載該Activity實例。
當系統采用 singleInstance模式啟動目標Activity時,可分為如下兩種情況。
- 如果將要啟動的目標Activity不存在,系統會先創建一個全新的Task,再創建目標Activity的實例,并將它加入新的Task棧頂。
- 如果將要啟動的目標Activity已經存在,無論它位于哪個應用程序中、位于哪個Task中,系統都會把該Activity所在的Task轉到前臺,從而使該Activity顯示出來。
需要指出的是,采用singleInstance模式加載Activity總是位于Task 棧頂,且采用singleInstance模式加載的Activity所在Task將只包含該Activity。
觀察在singleInstance模式下對Activity生命周期的影響:
從圖中可以看出,singleInstance模式下,啟動MainActivity時,創建了Task,并將MainActivity的實例放入Task棧中(只有一個故位于棧頂);啟動PersonActivity時,創建了新的Task,并將PersonActivity的實例放入新Task中(只有一個故位于棧頂),新Task位于前臺,原Task置于后臺;再啟動MainActivity時,由于其之前已經存在,將其位于的原Task轉入前臺,因在棧頂,直接展示。
總結
以上是生活随笔為你收集整理的Android Activity的启动模式及对生命周期的影响的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Andriod anim 补间(Twee
- 下一篇: Android Handler消息传递机