Activity之啓動模式

在Android中每一個界面都是一個Activity,切換界面操做實際上是多個不一樣Activity之間的實例化操做。在Android中Activity的啓動模式決定了Activity的啓動運行方式。html

Activity具備四種啓動模式:standard、singleTop、singleTask、singInstance。啓動模式可經過AndroidManifest.xm中Activity的launchMode屬性配置,或者經過使用Intent flags設置。android

standard模式

默認啓動方式,當執行startActivity時,默認會建立一個新的Activity實例並加入到任務棧中。app

singleTop模式

當執行startActivity時,若是當前任務棧中已經具備該Activity實例,而且位於棧頂,則不會建立新實例,而會調用原有實例的onNewIntent方法。不然,建立新的實例並加入棧頂。spa

好比:假如任務的後退棧中包含四個ActivityA-B-C-D(D位於棧頂)。當新的Intent但願啓動D,而D得launchMode是默認的「standard」,則將會產生一個新的D加入到棧頂,則後退棧變成A-B-C-D-D。 若是D的launchMode是"singleTop",則原有的D實例將會經過onNewIntent來接受intent。則任務棧依然是A-B-C-D。 若是要求啓動B,則將會新建一個D加入到棧中,即便B的launchMode是"singleTop"。.net

singleTask模式

若是任務棧中存在該模式的Activity實例,則把棧中該實例以上的Activity實例所有移除,調用該實例的onNewIntent()方法重用該Activity,使該實例處於棧頂位置,不然就從新建立一個新的Activity實例。code

在這個位置,我有一個疑問,新建立的Activity實例是加入到原有任務棧中仍是建立一個新的任務棧呢? 之因此會有這個疑問,是由於Google的官方文檔上的描述是這樣的:htm

文字信息是:blog

The system creates a new task and instantiates the activity at the root of the new task. However, if an instance of the activity already exists in a separate task, the system routes the intent to the existing instance through a call to itsonNewIntent() method, rather than creating a new instance. Only one instance of the activity can exist at a time.文檔

大意是,對於設置爲"singleTask"的Activity,若是在task中不存在該Activity實例,系統將建立一個新的task和新的Activity實例,而後將這個Activity實例放在新的task的根(也就是棧底)。若是已經存在該實例,則經過調用onNewIntent將intent傳遞給該實例。  get

咱們的關注點放在是否建立新的task上,在我看來一個task就對應一個後退棧,那麼是否意味着利用singleTask新建立的Activity實例會放到新的棧上呢? 

在博客園或者CSDN上看到不少博主關於singleTask的模式的介紹都沒有明確這一點,所以非常疑問。不過,在網上看到一篇文章《深入理解Activity啓動模式XXX》,應該能解答個人疑惑。裏面有說到:

一個Activity的Launch Mode爲singleTask時,在新建這個Activity時,默認taskAffinity狀況下,通常不會新建task,taskAffinity屬性默認application中是相同的,那麼就會新建在當前棧。…… 其實,把啓動模式設置爲singleTask,framework在啓動該activity時只會把它標示爲可在一個新任務中啓動,至因而否在一個新任務中啓動,還要受其餘條件的限制。增長一個taskAffinity屬性給啓動的singleTask的aty,那麼將在新task啓動。

對於這個問題暫時先擱置,以後想辦法作實驗進行驗證。

singleInstance模式 

整個系統中有且只有一個該Activity實例,且該實例位於單獨的一個棧中,該棧中有且只有一個該Activity。當再次啓動該Activity時,調用onNewIntent傳遞intent。

一個Activity的Launch Mode爲singleInstance時,老是在新的任務中開啓,而且這個新的任務中有且只有這一個實例,也就是說被該實例啓動的其餘activity會自動運行於另外一個任務中。當再次啓動該activity的實例時,會重用已存在的任務和實例。而且會調用這個實例的onNewIntent()方法,將Intent實例傳遞到該實例中。和singleTask相同,同一時刻在系統中只會存在一個這樣的Activity實例。

   一個Activity的Launch Mode爲singleInstance時,與singleTask模式相同的是在新建這個Activity時,會把它放在一個新的stack中並置於頂部(即放在新的task中)。與singleTask模式不一樣的是,這個新建的task的stack永遠只會有一個元素,就是這個Activity本身。若是這個Activity已經在某個Task的stack中了(這個stack一定只有一個元素,那就是這個Activity本身),此時只會調用它的onNewIntent(),而不會調用onCreate()。
相關文章
相關標籤/搜索