Monday, December 13, 2010

何謂Task和Back Stack

撰寫時間︰2010/12/13 12:38
修改時間︰2012/07/10 10:38
修改次數︰2

一、前言
假設今天我們的APP裡要寫一個新功能︰「撰寫e-mail連絡開發者」。
該怎麼做?
我們開發人員要寫一個全新的頁面才能做到嗎?

這個答案是否定的。

Android提供了好用的Intent,
我們只要簡單的使用它,
就可以叫出系統發送e-mail的畫面,
當使用者撰寫好並發送出去後,
畫面又回到原本觸發發送e-mail的畫面。

這件事很奇怪,
發送e-mail的頁面不是我們程式撰寫的,
但是為什麼使用體驗就好像是APP裡寫出來的東西?
原來,
這一切是因為Android系統背後,藏了一個Stack(堆疊)機制。

二、文章開始
一個APP通常來說,都擁有數個Activity。
每個Activity都能夠執行個自的任務,
甚至是啟動另一個Activity。
舉例來說,當使用者開啟了e-mail軟體,
他們看到條列式的e-mail列表清單,
當使用者點擊了列表清單,
一個新的Activity又會開出來,
顯示那些e-mail的內容。

使用者在看e-mail清單列表,
又看了裡面的e-mail內容,
一次一次的舉動,
每個Activity頁面都被存進了任務容器(collection of activities),
我們稱這個容器為背景堆疊(back stack)。

當一個Activity啟動了另一個Activity之後,
新的Activity就被放進堆疊的最頂層,
而之前的Activity則被保留在堆疊中,
但是屬於暫停的狀態。

一旦Activity遭暫停(stop),
系統就會自動將該頁面的使用狀態儲存起來。
當使用者從新頁面按下返回按鈕後,
新的頁面被消毀(destroy),
而舊的頁面在此時又會被恢復(resume)。
也因此,堆疊的特性是「後進先出」。
圖1. 這張圖表顯示出每一個新的Activity是如何被放進背景堆疊中。當使用者按下返回鍵,當下的Activity就會被消毀(destroy),然後會將前一個Activity恢復(resume)給使用者。

======底下文章為2010/12/13撰寫======
To the user, it will seem as if the map viewer is part of the same application as your activity, even though it's defined in another application and runs in that application's process. Android maintains this user experience by

keeping both activities in the same task. Simply put, a task is what the user experiences as an "application." It's a group of related activities, arranged in a stack.
Task是使用者在使用Application時的User Experiences。如果今天我們的APK功能要開啟Google map,也許我們程式會做連結直接開啟MAP。但這個MAP卻不是我們寫的。但從我們的程式到展開MAP卻感覺是一體的。那是因為Google想要照顧這部份的使用者經驗。
Task寫在Stack,也就是堆疊裡。

The root activity in the stack is the one that began the task — typically, it's an activity the user selected in the application launcher.

The activity at the top of the stack is one that's currently running — the one that is the focus for user actions. When one activity starts another, the new activity is pushed on the stack; it becomes the running activity. The previous activity remains in the stack. When the user presses the BACK key, the current activity is popped from the stack, and the previous one resumes as the running activity.
Task裡放的,就是我們在使用一隻應用程式時,所有和這隻應用程式相關的Activity的存放空間。
程式會依我們最先開啟的Activity,在堆疊裡,開出一個Task(任務)空間,然後呢,它被放在Task的最頂層。如果此時又開了一個新的Activity,就會把前一個Activity往下推,而成為你眼前看到的畫面。之前那個Activity還是在堆疊裡,所以如果此時你又按了[返回]鍵,目前的新畫面,會"彈出"這個堆疊,然後把之前的Activity,利用onResume()的方式,呼叫回來你面前。

A task is a stack of activities, not a class or an element in the manifest file.
Task是一個Activity的堆疊,而非類別或任何manifest檔裡你看的見的物件。

No comments: