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