highlight.js

星期六, 9月 08, 2012

Android 的 process、activity、task 與 back 鈕的關係

在 Android 系統中, 一個 App 主要是以畫面為單位來切分程式單元, 每個程式單元就稱為一個「活動 (Activity)」, 負責處理單一畫面的工作, 包含畫面本身的構成、顯示以及該畫面與使用者的互動。以 Gmail 內建 App 為例, 就具有信件清單、信件內容、編寫新郵件等不同的畫面, 每一個畫面就由一個活動來處理。活動一開始的工作, 就是將畫面顯示出來, 例如 Gmail 的信件清單畫面, 就要擺個能夠切換不同標籤信件的按鈕, 並且放置一個列表元件顯示信件清單。畫面顯示出來之後, 活動也必須負責像是使用者按了清單中的某一封信件時要跳轉到信件內容畫面的動作。在同一個 App 的所有活動之中, 必須指定其中一個為「主活動 (main activity)」, 也就是 App 一開始時要最先執行的活動。

由上可知, 當我們使用 Android 系統時, 畫面的跳轉實際上就是從一個活動跳到另一個活動, 系統會幫我們把活動跳轉的過程記錄下來, 當我們按了 Back 按鈕時, 系統就會依照跳轉的歷程, 結束目前的活動, 返回到前一個活動。舉例來說, 如果你在 Gmail 的信件清單中按了某一封信件, 這時處理信件清單畫面的活動就會跳轉到顯示信件內容的活動, 由該活動將信件內容顯示出來, 此時如果按了 Back 鈕, 就會結束顯示信件內容的活動, 回到前一個活動, 也就是顯示信件清單的活動。活動跳轉的歷程是紀錄在一個堆疊中, 稱為「返回堆疊 (back stack)」, 而返回堆疊裡的這一串活動, 就統稱為是一個「任務 (task)」, 任務中第一個推入到返回堆疊中的活動稱為「根活動 (root activity)」。

一個任務是由使用者在 Home 畫面或是應用程式列表中點選了某個 App 的圖示開始, 假設此 App 名稱為 A1, 此時 A1 的主活動就會推入返回堆疊中成為根活動, 隨著使用者的操作切換畫面, 並將對應的活動堆入返回堆疊。如果使用者按了 Back 鈕回到根活動, 並再次按下 Back 鈕從根活動回到 Home 畫面, 那麼整個任務就結束了。如果在任務尚未結束的情況下, 使用者按了 Home 鈕回到 Home 畫面, 並點選執行了另外一個 App, 假設名稱為 A2, 此時系統就會建立一個新的任務, 配置一個新的返回堆疊, 並以 A2 的主活動為根活動。這個時候, 系統中同時存在兩個任務, 如果長按 Home 鈕, 就可以在兩個任務之間切換。

要特別注意的是長按 Home 鈕時會看到的 App 圖示是以任務為單位, 而不是以活動為單位。舉例來說, 如果你執行了瀏覽器, 接著在瀏覽器的網頁瀏覽畫面中使用分享的功能進入 Gmail 編寫新郵件的畫面, 此時的任務是由瀏覽器開始, 因此若是長按 Home 鈕, 只會看到瀏覽器的圖示, 而不會看到 Gmail 的圖示。另外, 如果已經有以某個 App 開始的任務在執行, 那麼在 Home 畫面點選該 App 圖示時會直接切換到該任務, 而不會建立新的任務。


在 Android 系統中, 編譯好的 App 經過安裝後就存在檔案系統中, 當使用者點觸某個 App 的圖示執行時, 系統就會將 App 相關的程式碼載入到記憶體中執行, 在系統中執行的 App 就稱為是「行程 (Process)」, 系統會紀錄相關的資訊。當行程執行, 完成初始動作後, 就會執行主活動, 開始與使用者互動。


沒有留言: