在Android中每一個界面都是一個Activity,切換界面操做實際上是多個不一樣Activity之間的實例化操做。在Android中Activity的啓動模式決定了Activity的啓動運行方式。html
Activity具備四種啓動模式:standard、singleTop、singleTask、singInstance。啓動模式可經過AndroidManifest.xm中Activity的launchMode屬性配置,或者經過使用Intent flags設置。android
默認啓動方式,當執行startActivity時,默認會建立一個新的Activity實例並加入到任務棧中。app
當執行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
若是任務棧中存在該模式的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啓動。
對於這個問題暫時先擱置,以後想辦法作實驗進行驗證。
整個系統中有且只有一個該Activity實例,且該實例位於單獨的一個棧中,該棧中有且只有一個該Activity。當再次啓動該Activity時,調用onNewIntent傳遞intent。
一個Activity的Launch Mode爲singleInstance時,老是在新的任務中開啓,而且這個新的任務中有且只有這一個實例,也就是說被該實例啓動的其餘activity會自動運行於另外一個任務中。當再次啓動該activity的實例時,會重用已存在的任務和實例。而且會調用這個實例的onNewIntent()方法,將Intent實例傳遞到該實例中。和singleTask相同,同一時刻在系統中只會存在一個這樣的Activity實例。