天天看點

Android幫助文檔翻譯——開發指南(三)任務和Back Stack

一個應用程式通常都包含了多個 activity 。每一個 activity 都應該回避設計成( designe around )能執行使用者特定動作以及啟動其它 activity 。例如,一個郵件應用程式需要有一個用來顯示新郵件清單的 activity ,當使用者選中了其中一個郵件時,将打開另一個新的 activit 浏覽郵件内容。

一個 activity 甚至能打開裝置上其它應用程式中的 activity 。比如,如果你的應用程式需要發送一個電子郵件,你就應該定義一個執行“ send ”動作并包含了郵箱位址、郵件内容等資料的意圖( intent )。其它應用程式中聲明處理這種意圖的 activity 将會被打開。這種情況下,因為我們的這個意圖是要去發送一個郵件,是以一個郵件應用程式的寫郵件 activity 将會打開(如果有多個 activity 能處理這種意圖,那麼系統會讓使用者選擇要哪一個去執行)。當郵件發送完畢後,你的 activity 将恢複出來,這樣讓那個郵件程式看起來像是你的應用程式的一部分。雖然多個 activity 可能是來自不同的應用程式,但是 Android 系統通過把這些 activity 放在同一個任務中,使得使用者有無縫的體驗。

一個任務就是使用者執行某個特定工作過程中互相影響的 activity 的集合。這些 activity 按照打開的順序放在一個棧中( back stack )。

裝置的主界面是大多數任務的起點。當使用者觸摸了程式清單的一個圖示或主界面的一個快捷方式時,一個應用程式任務将置于前台。如果沒有與這個程式對應的任務時(由于這個程式最近沒有使用),系統将建立一個新的任務,并把這個程式的“ main ” activity 作為棧的根 activity 。

當目前 activity 啟動其它 activity 時,一個新的 activity 将被壓到棧頂并擷取到焦點。先前的 activity 雖然保留在棧中,但已經被停止了。當一個 activity 停止時,系統會儲存它的使用者接口界面的目前狀态。這樣當使用者按傳回鍵時,目前 activity 将多棧頂彈出(即這個 activity 被銷毀),而之前的 activity 将被恢複( UI 之前的狀态被恢複出來)。棧中的所有 activity 永遠不會被重新組合排列,隻有壓棧和出棧兩個動作,即當 activity 被啟動則壓入棧中,當使用者按下傳回鍵離開 activity 時從棧中彈出。正如上面所講,這個 back stack 是一個遵循後進先出原則的對象結構。圖 1 呈現了一個帶時間軸的 activity 演變圖,并給出了每次操作時 back stack 的狀态。

Android幫助文檔翻譯——開發指南(三)任務和Back Stack

圖 1 示範了每一個 activity 如何增加一個條目到 back stack 中去。當使用者按了傳回鍵時,目前 activity 被銷毀,先前的 activity 恢複。

如果使用者連續按傳回鍵時,棧中每一個 activity 将被彈出來以顯示前一個 activity ,一直到使用者傳回到主界面或任務開始時正在運作的那個 activity 。當棧中的所有 activity 被彈出後,這個任務也将不複存在。

Android幫助文檔翻譯——開發指南(三)任務和Back Stack

圖 2 兩個任務:任務 A 在背景等待被恢複,而任務 B 在前台接收使用者的互動資訊

任務是一個當使用者開戶新的任務或回到主界面(通過按 HOME 鍵)時能夠被移到背景的聚合單元。當任務在背景時,它裡面的所有 activity 将被停止,但任務的 back stack 被完整地儲存在記憶體中,即當有其它任務啟動時,目前任務僅僅是失去了焦點而已,如圖 2 所示。因為一個任務能夠傳回到前台,是以使用者可以在它被停止的斷點重新啟動。舉個例子,假如目前任務(稱為“任務 A ”)在棧中有三個 activity ,其中兩個在目前 activity 的下面。使用者可以按下 HOME 鍵回到主界面并從程式清單中啟動一個新的程式。當主界面出現時,任務 A 被置于背景。當打開一個新的應用程式時,系統将為這個新的程式啟動一個帶有它自己 activity 棧的任務(稱為“任務 B ”)。經過一些操作後,使用者又傳回到主界面并選中之前的程式,這樣就重新啟動了任務 A 。這時任務 A 又回到了前台,即其棧中的三個 activity 是完整的,并且棧頂的 activity 會被恢複出來。此時,使用者也可以通過傳回到主界面再選中程式圖示啟動程式回到任務 B 中。這就是 Android 系統多任務的一個例子。

注:多個任務能同時運作在背景。如果使用者在同一時間運作了很多個背景任務,系統可能為了回收記憶體而銷毀背景的 activity ,這就導緻了 activity 的狀态會丢失。可以參考下面關于 activity 狀态的章節。

待續……

繼續閱讀