Activity中的任务和返回站
今天繼續(xù)來任務(wù)和返回棧,應(yīng)用通常包含多個Activity,任務(wù)是指在執(zhí)行特定作業(yè)時與用戶交互的一系列Activity,這些Activity按照各自的打開順序排列在堆棧中。
后天可以同時運行多個任務(wù),但是如果用戶同時運行多個后臺任務(wù),則系統(tǒng)可能會開始銷毀后臺Activity,以回收內(nèi)存資源,從而導(dǎo)致Activity狀態(tài)丟失,故如果要避免用戶的信息丟失,應(yīng)主動通過在Activity中實現(xiàn)onSaveInstanceState()回調(diào)方法在保留工作。
?定義啟動模式:
啟動模式允許定義Activity的新實例如何與當(dāng)前任務(wù)關(guān)聯(lián),可以通過兩種方式定義不同的啟動模式。
使用清單文件:在清單文件中聲明Activity時,可以使用指定的Activity在啟動時應(yīng)該如何與任務(wù)關(guān)聯(lián)。
使用Intent標(biāo)志:調(diào)用startActivity()時,可以在Intent中加入一個標(biāo)志,用于聲明新Activity如何與當(dāng)前的任務(wù)關(guān)聯(lián)。
因此,如果 Activity A 啟動 Activity B,則 Activity B 可以在其清單文件中定義它應(yīng)該如何與當(dāng)前任務(wù)關(guān)聯(lián)(如果可能),并且 Activity A 還可以請求 Activity B 應(yīng)該如何與當(dāng)前任務(wù)關(guān)聯(lián)。如果這兩個 Activity 均定義 Activity B 應(yīng)該如何與任務(wù)關(guān)聯(lián),則 Activity A 的請求(如 Intent 中所定義)優(yōu)先級要高于 Activity B 的請求(如其清單文件中所定義)。注:某些適用于清單文件的啟動模式不可用作 Intent 標(biāo)志,同樣,某些可用作 Intent 標(biāo)志的啟動模式無法在清單文件中定義。
使用清單文件
在清單文件中聲明 Activity 時,可以使用<activity>元素的launchMode屬性指定 Activity 應(yīng)該如何與任務(wù)關(guān)聯(lián)。
launchMode屬性指定有關(guān)應(yīng)如何將 Activity 啟動到任務(wù)中的指令。可以分配給launchMode屬性的啟動模式共有四種:
standard, singletTop, singleTask, singleInstance
"standard"(默認模式)
例如,假設(shè)任務(wù)的返回棧包含根 Activity A 以及 Activity B、C 和位于頂部的 D(堆棧是 A-B-C-D;D 位于頂部)。收到針對 D 類 Activity 的 Intent。如果 D 具有默認的?"standard"?啟動模式,則會啟動該類的新實例,且堆棧會變成 A-B-C-D-D。但是,如果 D 的啟動模式是?"singleTop",則 D 的現(xiàn)有實例會通過?onNewIntent()?接收 Intent,因為它位于堆棧的頂部;而堆棧仍為 A-B-C-D。但是,如果收到針對 B 類 Activity 的 Intent,則會向堆棧添加 B 的新實例,即便其啟動模式為?"singleTop"?也是如此。
注:為某個 Activity 創(chuàng)建新實例時,用戶可以按“返回”按鈕返回到前一個 Activity。 但是,當(dāng) Activity 的現(xiàn)有實例處理新 Intent 時,則在新 Intent 到達?onNewIntent()?之前,用戶無法按“返回”按鈕返回到 Activity 的狀態(tài)。
注:盡管 Activity 在新任務(wù)中啟動,但是用戶按“返回”按鈕仍會返回到前一個 Activity。
使用Intent標(biāo)志:
啟動Activity時,可以通過傳遞給startActivity()的Intent中加入相應(yīng)的標(biāo)志,修改Activity與其任務(wù)的默認關(guān)聯(lián)方式。
正如前文所述,這會產(chǎn)生與?"singleTask"launchMode?值相同的行為。
正如前文所述,這會產(chǎn)生與?"singleTop"launchMode?值相同的行為。
產(chǎn)生這種行為的?launchMode?屬性沒有值。
FLAG_ACTIVITY_CLEAR_TOP?通常與?FLAG_ACTIVITY_NEW_TASK?結(jié)合使用。一起使用時,通過這些標(biāo)志,可以找到其他任務(wù)中的現(xiàn)有 Activity,并將其放入可從中響應(yīng) Intent 的位置。
注:如果指定 Activity 的啟動模式為?"standard",則該 Activity 也會從堆棧中移除,并在其位置啟動一個新實例,以便處理傳入的 Intent。 這是因為當(dāng)啟動模式為?"standard"?時,將始終為新 Intent 創(chuàng)建新實例。
處理關(guān)聯(lián):“關(guān)聯(lián)”指示 Activity 優(yōu)先屬于哪個任務(wù)。默認情況下,同一應(yīng)用中的所有 Activity 彼此關(guān)聯(lián)。 因此,默認情況下,同一應(yīng)用中的所有 Activity 優(yōu)先位于相同任務(wù)中。?
可以修改 Activity 的默認關(guān)聯(lián)。 在不同應(yīng)用中定義的 Activity 可以共享關(guān)聯(lián),或者可為在同一應(yīng)用中定義的 Activity 分配不同的任務(wù)關(guān)聯(lián)。
可以使用?<activity>?元素的?taskAffinity?屬性修改任何給定 Activity 的關(guān)聯(lián)。
taskAffinity?屬性取字符串值,該值必須不同于在?<manifest>?元素中聲明的默認軟件包名稱,因為系統(tǒng)使用該名稱標(biāo)識應(yīng)用的默認任務(wù)關(guān)聯(lián)。
在兩種情況下,關(guān)聯(lián)會起作用:啟動 Activity 的 Intent 包含?FLAG_ACTIVITY_NEW_TASK?標(biāo)志。
Activity 將其?allowTaskReparenting?屬性設(shè)置為?"true"。
清理返回棧:
如果用戶長時間離開任務(wù),則系統(tǒng)會清除所有 Activity 的任務(wù),根 Activity 除外。 當(dāng)用戶再次返回到任務(wù)時,僅恢復(fù)根 Activity。系統(tǒng)這樣做的原因是,經(jīng)過很長一段時間后,用戶可能已經(jīng)放棄之前執(zhí)行的操作,返回到任務(wù)是要開始執(zhí)行新的操作。
可以使用下列幾個 Activity 屬性修改此行為:
alwaysRetainTaskState
啟動任務(wù)
<activity ... ><intent-filter ... ><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>... </activity>此類 Intent 過濾器會使 Activity 的圖標(biāo)和標(biāo)簽顯示在應(yīng)用啟動器中,讓用戶能夠啟動 Activity 并在啟動之后隨時返回到創(chuàng)建的任務(wù)中。
總結(jié)
以上是生活随笔為你收集整理的Activity中的任务和返回站的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Activity中加载器的总结
- 下一篇: 概览屏幕(最新动态屏幕、最近任务列表)