在總結(jié)Activity的啟動模式前,我們先來認(rèn)真一下android中的任務(wù)與返回棧模式。
什么是任務(wù)?
Android中的任務(wù)是指在執(zhí)行特定作業(yè)時與用戶交互的一系列 Activity。 這些 Activity 按照各自的打開順序排列在堆棧(即返回棧)中涛菠。如圖莉御,即是一個完整的任務(wù)棧流程撇吞。
Activity 和任務(wù)的默認(rèn)行為總結(jié)如下:
1.當(dāng) Activity A 啟動 Activity B 時,Activity A 將會停止礁叔,但系統(tǒng)會保留其狀態(tài)(例如牍颈,滾動位置和已輸入表單中的文本)。如果用戶在處于 Activity B 時按“返回”按鈕琅关,則 Activity A 將恢復(fù)其狀態(tài)煮岁,繼續(xù)執(zhí)行。
2.用戶通過按“主頁”按鈕離開任務(wù)時涣易,當(dāng)前 Activity 將停止且其任務(wù)會進(jìn)入后臺画机。 系統(tǒng)將保留任務(wù)中每個 Activity 的狀態(tài)。如果用戶稍后通過選擇開始任務(wù)的啟動器圖標(biāo)來恢復(fù)任務(wù)新症,則任務(wù)將出現(xiàn)在前臺并恢復(fù)執(zhí)行堆棧頂部的 Activity步氏。
3.如果用戶按“返回”按鈕,則當(dāng)前 Activity 會從堆棧彈出并被銷毀徒爹。 堆棧中的前一個 Activity 恢復(fù)執(zhí)行荚醒。銷毀 Activity 時芋类,系統(tǒng)不會保留該 Activity 的狀態(tài)。
android的多任務(wù)模式中界阁,任務(wù)的狀態(tài)與行為各有不同侯繁,那我們?nèi)绾稳ス芾砣蝿?wù),并且控制任務(wù)內(nèi)部元素的狀態(tài)呢泡躯? 這就講到了Activity的啟動模式贮竟、
Activity的啟動模式
1.定義啟動模式
? ? Activity的啟動模式定義有兩種, 一種在AndroidManifast.xml中定義launchMode屬性,一種即在startActivity的Intent參數(shù)中聲明新 Activity 如何(或是否)與當(dāng)前任務(wù)關(guān)聯(lián)较剃。 如果一個Activity在清單中定義了其關(guān)聯(lián)方式坝锰,并且startActivity中的Intent也已經(jīng)聲明,則Intent中定義的優(yōu)先級要高于清單文件重付。
2.啟動模式介紹
? ?清單文件中的屬性:
? ? ? ? "standard":?默認(rèn)顷级。系統(tǒng)在啟動 Activity 的任務(wù)中創(chuàng)建 Activity 的新實例并向其傳送 Intent。Activity 可以多次實例化确垫,而每個實例均可屬于不同的任務(wù)弓颈,并且一個任務(wù)可以擁有多個實例。
? ? ? ? "singleTop":如果當(dāng)前任務(wù)的頂部已存在 Activity 的一個實例删掀,則系統(tǒng)會通過調(diào)用該實例的onNewIntent()方法向其傳送 Intent翔冀,而不是創(chuàng)建 Activity 的新實例。Activity 可以多次實例化披泪,而每個實例均可屬于不同的任務(wù)纤子,并且一個任務(wù)可以擁有多個實例(但前提是位于返回棧頂部的 Activity 并不是 Activity 的現(xiàn)有實例)。
例如款票,假設(shè)任務(wù)的返回棧包含根 Activity A 以及 Activity B控硼、C 和位于頂部的 D(堆棧是 A-B-C-D;D 位于頂部)艾少。收到針對 D 類 Activity 的 Intent卡乾。如果 D 具有默認(rèn)的"standard"啟動模式,則會啟動該類的新實例缚够,且堆棧會變成 A-B-C-D-D幔妨。但是,如果 D 的啟動模式是"singleTop"谍椅,則 D 的現(xiàn)有實例會通過onNewIntent()接收 Intent误堡,因為它位于堆棧的頂部;而堆棧仍為 A-B-C-D雏吭。但是锁施,如果收到針對 B 類 Activity 的 Intent,則會向堆棧添加 B 的新實例堆棧變成了A-B-C-D-B,即便其啟動模式為"singleTop"也是如此沾谜。
? ? ? ?"singleTask" :系統(tǒng)創(chuàng)建新任務(wù)并實例化位于新任務(wù)底部的 Activity膊毁。但是,如果該 Activity 的一個實例已存在于一個單獨的任務(wù)中基跑,則系統(tǒng)會通過調(diào)用現(xiàn)有實例的onNewIntent()方法向其傳送 Intent婚温,而不是創(chuàng)建新實例。一次只能存在 Activity 的一個實例媳否。?注:盡管 Activity 在新任務(wù)中啟動栅螟,但是用戶按“返回”按鈕仍會返回到前一個 Activity。
? ? ? "singleInstance":與"singleTask"相同篱竭,只是系統(tǒng)不會將任何其他 Activity 啟動到包含實例的任務(wù)中力图。該 Activity 始終是其任務(wù)唯一僅有的成員;由此 Activity 啟動的任何 Activity 均在單獨的任務(wù)中打開掺逼。
Intent中的參數(shù):
? ? FLAG_ACTIVITY_NEW_TASK?: 同清單屬性中的singleTask
? ? FLAG_ACTIVITY_SINGLE_TOP?: 同清單屬性中的singleTop
? ??FLAG_ACTIVITY_CLEAR_TOP : 如果正在啟動的 Activity 已在當(dāng)前任務(wù)中運行吃媒,則會銷毀當(dāng)前任務(wù)頂部的所有 Activity,并通過onNewIntent()將此 Intent 傳遞給 Activity 已恢復(fù)的實例(現(xiàn)在位于頂部)吕喘,而不是啟動該 Activity 的新實例赘那。