2012-01-23

Android Task、Home 鍵與 Back 鍵

Task 與 Back Stack

每個 App  可以有多個 Activity,每個 Activity 負責一些功能,也能視需要啟動其他 Activity 來滿足 User 的需求,可以啟動的 Activity 包括同一個 App 的 Activity 或者其他 App 的 Activity。

啟動其他 App 的 Activity 是透過指定特定 Action 的 Intent,若同時有多個 Activity 提供相同的 Action,Android 會讓 User 決定要用哪一個 Activity。

若 Activity A 啟動 Activity B,則 Activity A 停止(onStop)並保留 UI 現況,當 Activity B 按下 Back 鍵後,就會回到 Activity A 並回復 UI,而 Activity B 則被銷毀(onDestroy)。

若 A 啟動 B,B 又啟動 C,Android 以一個稱為「Back Stack」的堆疊依序紀錄每個 Activity,然後在 Back  鍵按下後,依據「後進先出」的原則依序從 C 回到 B 再回到 A,而這串 Activities 則稱之為「Task」。

Home 與 Back

Task 一般的出發位置是 Home 畫面,藉由開啟某個 App 開始一路往上堆疊,再一路回來,最後回到 Home;但也有不是從 Home 出發的時候,像是瀏覽網頁時有電話打進來或者由快捷鍵開啟相機,這類不是由目前 Activity 所啟動的行為,就會產生一個新的 Task 紀錄從電話或相機開始的 Activity 堆疊,有別於正在瀏覽網頁的那個 Task,等到講完電話或者拍完照,結束新的 Task 的所有 Activity 時,就會回到上一個 Task 的最後一個 Activity,上面的例子就是回到瀏覽器繼續瀏覽網頁。

除了剛提過的有電話打進來或者由快捷鍵開啟相機或其他快捷功能,會將目前的 Task 移到背景執行,按下 Home 鍵也會,所以 Home 鍵不同於 Back 鍵會將目前的 Activity 銷毀,僅只是將目前的 Task 隱藏並重起一個新的 Task;那要怎麼回到因 Home 鍵而隱藏的 Task 呢?重新啟動該 App 就可以了。

舉例來說,開瀏覽器瀏覽網頁,然後按下 Home 鍵回到 Home 畫面,開啟 Email 寫信給某個人,完成後回到 Home 畫面,此時再點選瀏覽器則會回到上次離開的地方,這就可以說明 Home 鍵與 Back 鍵不同的地方,前者是將目前的 Task 移到背景,後者則是銷毀目前的 Activity

要回到隱藏的 Task 也可以長按 Home 鍵就會看到所有最近執行過的 Task,這就是多工,但是若背景程式太多導致記憶體不足,Android 就可能未回收記憶體而殺掉隱藏的 Task。

還有一種特別的狀況,就是可以從多個 Activity 啟動同一個 Activity,例如 Acitivty A 可以啟動 Activity Z,而 Activity B 也可以啟動 Activity Z,那麼當 A 啟動 Z,Z 再啟動 B,B 再啟動 Z,那麼堆疊就會是 A -> Z -> B -> Z,依序按下 Back 鍵,就會從 Z 回到 B,再回到 Z,最後到 A,要注意的是,預設的狀況下,Z 會有兩個獨立存在的 instance

保留 Activity 現況

當 Activity 因為開啟另一個 Activity 或者整個 Task 移到背景而停止(onStop)時,Android 會保留該 Activity 的 UI 現況,包括 Scroll 的位置、游標的位置以及 EditText 裡的輸入文字等,直到該 Activity 重見天日時,Android 會將 Activity 回復到離開時候的狀態;但是當背景程式太多,Anddroid 需要回收記憶體而將整個 Task 殺掉時,Activity 就回不去了,為了讓 Acitivity 可以度過記憶體的寒冬,不應該只是依靠 Android,可以自行實做 onSaveInstanceState() 來保留現況,然後回復時可在 onCreate() 或者 onRestoreInstanceState() 自行手動復原,詳細說明請參考 Android Activity 筆記

相關文章

沒有留言:

張貼留言