參考:http://developer.android.com/guide/components/tasks-and-back-stack.html
在Android中,一個應用程式裡面,通常包含了多個相互結合的Activity。每個Activity通常被設計為可以為使用者執行某個特定的動作,Activity與Activity之間可以通過Intent相互的跳轉。甚至,可以通過Intent的action來啟動另外一個應用程式的Activity,這個過程給使用者的感覺就像這個Activity就是你的應用程式裡面一樣。Android把Activity的這種表現稱之為“無縫串連”。
在使用者的角度上看,它對某一個應用程式的操作,就是執行一個特定的task(任務),來完成某一個特定的操作。但是實際上在Android應用中,這可能是一個task或者是多個task之間相互結合。這就是Android的“多任務”機制。我們知道,一個應用程式表現給使用者的就是一個個的Activity,所以“多任務”機制就是Android系統對Activity的管理。
在Android中,通過使用“back stack(返回堆棧)”來實現對Activity的管理,每一個啟動的Activity都會儲存在“back stack”中,遵循著棧的基本原則:先進後出。無縫串連只是Activity管理的一部分表現而已。下面先看看Task和back stack的基本行為。
一、Task和back stack的基本行為
1、單個Task中的多個Activity
Home介面是啟動Task最多的地方。當使用者點擊一個應用程式圖示(或者是捷徑),這個應用程式的Task就會被調到前台(如果這個應用程式的Task不存在,那麼就會建立一個新的任務,而這個應用程式的“main”Activity就會作為back stack的root Activity)。
當這個Activity在去啟動其他的Activity,這個新的Activity就會被壓入到“back stack”的棧頂並且獲得焦點,之前的那個Activity仍然保留在棧中,但是卻會停止(Activity的生命週期)。當使用者按下Back(返回)鍵,當前的Activity就會彈出棧頂(被銷毀),而之前的那個Activity就會被恢複。
如:
如果使用者繼續按下返回鍵,那麼棧中的Activity會按照順序一個個彈出,知道退出到Home介面(或者退回到啟動這個Task的Activity(多Task))。此時,這個棧中的所有Activity全部被移除,這個Task就不存在了。
2、“back stack”永遠遵循先進後出的原則
在“back stack”返回堆棧中的Activity永遠都會遵循“棧”這種資料結構的基本原則——先進後出。永遠都不會被重新的排序,只會不斷的彈出或者壓入。
“back stack”中Activity的儲存和Activity的啟動模式密切相關,這點在後面會學到,這裡先來用這個知識舉個例子:在一個棧中有3個Activity:Activity1,Activity2,Activity3。並且Activity1的啟動模式為“singleTask”。如:
3、一個Task就是內聚單元
Android是一個“多任務”的系統,同一時刻會有多個Task的存在。一個Task是一個內聚單元,當使用者開始一個新的Task或者通過Home按鈕返回到Home介面的時候,該Task可以移動到後台(background)。當一個Task存在於背景時候,所有在這個Task中的Activity都處於Stopped狀態。但是這個Task的back stack仍然完好無損的儲存著——它僅僅是被別的Task搶佔了焦點。如:
當如上的情況下,使用者仍然可以在Home介面重新選擇TaskA的應用程式,讓TaskA擷取焦點,並且TaskA的棧頂的Activity Y會恢複,就像使用者之前離開它的時候一樣。
4、一個Activity可以被執行個體化多次
因為在“back stack”中的Activity永遠都不會重新排序,如果你的應用程式允許使用者在不止一個Activity去啟動另外一個指定的Activity,那麼系統就會去建立一個該Activity新的執行個體並把它壓入到棧頂(而不是把棧中之前的那個執行個體移動到棧頂)。因此,應用程式的Activity可能會被執行個體化多次(甚至是在不同的Task中),如:
然而,如果你不想一個Activity被執行個體化多次,我們可以去修改這種行為。這個將在後面的講到。
二、Activity、Task、Process的關係
用一張簡單的圖表示如下: