安卓開發之Activity的4種啟動模式
一、四種啟動模式
Activity的啟動模式有4種,分別為standard、singleTop、singleTask、singleIntance。4種啟動模式的區別主要與Activity的任務棧管理有關,棧是一種後進先出的集合。
二、Activity啟動模式的設定
在AndroidManifest.xml中 ,註冊Activity時可以設定Activity啟動模式, android:launchMode=”” ,這個屬性用於配置Activity的啟動模式,屬性預設啟動模式為standard。
示例
<activity android:name=".MainActivity" android:launchMode="standard" />
三、各個啟動模式的區別
standard
這是Activity的標準啟動模式,也是Activity的預設啟動模式。在這種啟動模式下的Activity可以被多次例項化,即在同一個任務棧中可以存在多個該Activity的例項。如果ActivityA的啟動模式為standard,且已經有一個ActivityA例項被啟動,在ActivityA中呼叫startActivity時會啟動一個新的Activity例項,對系統性能的消耗過大。
singleTop
如果在任務棧的棧頂正好存在該Activity的例項, 就會重用位於棧頂的該例項,不會建立新的Activity物件,並且不會再呼叫通常情況下我們處理請求資料的onCreate方法,而是呼叫該例項的onNewIntent()函式將Intent物件傳遞到這個例項中,否則就會建立新的例項並放入棧頂(即使棧中已經存在該Activity例項,只要不在棧頂,都會建立例項)。
singleTask
在同一個Task內只能有一個Activity例項:
如果啟動的目標Activity不存在Task任務棧中,系統將會建立一個目標Activity例項,並將它加入到Task棧頂
如果啟動的目標Activity已存在Task任務棧的棧頂,就會重用位於棧頂的該例項,並且不會再呼叫通常情況下我們處理請求資料的onCreate方法,而會呼叫該例項的onNewIntent()函式將Intent物件傳遞到這個例項中。(同singleTop)
若果啟動的目標Activity已存在但沒有位於Task任務棧的棧頂,系統將會把任務棧中該目標Activity上面的所有Activity移除Task棧,使該Activity置於Task棧頂。
singleInstance
設定了singleInstance模式的Activity會在一個獨立的任務中開啟,並且在這個任務中有且只有這一個例項。當再次啟動該Activity例項時,會重用已存在的任務和例項,並且會呼叫該例項的onNewIntent()函式來接收Intent。類似瀏覽器工作原理,不管多少應用要啟動該Activity,這個Activity有且只有一個。
總結:
standard:標準模式,系統的預設模式
singleTop:棧頂複用模式,Activity如果在棧頂就不會被重新建立
singleTask:棧內複用模式,Activity如果在某個棧中存在就不會被重新建立
singleInstance:單例項模式,是加強版的singleTask,當例項建立後,系統會建一個新的任務棧(獨立存在)