安卓開發之Activity的4種啟動模式

cxmscb發表於2016-07-01

一、四種啟動模式

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例項:

  1. 如果啟動的目標Activity不存在Task任務棧中,系統將會建立一個目標Activity例項,並將它加入到Task棧頂

  2. 如果啟動的目標Activity已存在Task任務棧的棧頂,就會重用位於棧頂的該例項,並且不會再呼叫通常情況下我們處理請求資料的onCreate方法,而會呼叫該例項的onNewIntent()函式將Intent物件傳遞到這個例項中。(同singleTop)

  3. 若果啟動的目標Activity已存在但沒有位於Task任務棧的棧頂,系統將會把任務棧中該目標Activity上面的所有Activity移除Task棧,使該Activity置於Task棧頂。

singleInstance

設定了singleInstance模式的Activity會在一個獨立的任務中開啟,並且在這個任務中有且只有這一個例項。當再次啟動該Activity例項時,會重用已存在的任務和例項,並且會呼叫該例項的onNewIntent()函式來接收Intent。類似瀏覽器工作原理,不管多少應用要啟動該Activity,這個Activity有且只有一個。

總結:

standard:標準模式,系統的預設模式

singleTop:棧頂複用模式,Activity如果在棧頂就不會被重新建立

singleTask:棧內複用模式,Activity如果在某個棧中存在就不會被重新建立

singleInstance:單例項模式,是加強版的singleTask,當例項建立後,系統會建一個新的任務棧(獨立存在)

相關文章