啟動任務
當一個activity被指定一個“android.intent.action.MAIN”做為動作,以及“android.intent.category.LAUNCHER”做為類別的intent過濾器之後,它就被設定為一個任務的進入點。這樣的過濾器設定會在應用程式載入器中為此activity顯示一個表徵圖和標籤,以供使用者載入任務或載入之後在任意時間回到這個任務。
第二個能力相當重要:使用者必須可以離開一個任務,並在一段時間後返回它。出於這個考慮,載入模式被設定為“singleTask”和“singleInstance”的activity總是會初始化一個新任務,這樣的activity僅能用於指定了一個MAIN和LAUNCHER過濾器的情況之下。我們來舉例說明如果沒指定過濾器的情況下會發生的事情:一個intent載入了一個“singleTask”的activity,初始化了一個新任務,使用者在這個任務中花費了一些時間來完成工作。然後使用者按下了HOME鍵。於是任務被要求轉至後台並被主畫面所掩蓋。因為它並沒有在應用程式載入器中顯示表徵圖,這將導致使用者無法再返回它。
類似的困境也可由FLAG_ACTIVITY_NEW_TASK標記引起。如果此標記使一個activity啟動了一個新任務繼而使用者按下了HOME鍵離開了它,則使用者必須要有一些方法再次回到這個任務。一些實體(諸如通知管理器)總是在另外的任務中啟動新activity,而不是做為它們自己的一部分,所以它們總是將FLAG_ACTIVITY_NEW_TASK標記包含在intent裡面並傳遞給startActivity()。如果你寫了一個能被外部實體使用這個標記調用的activity,你必須注意要給使用者留一個返回這個被外部實體啟動的任務的方法。
當你不想讓使用者再次返回一個activity的情況下,可以將 <activity> 元素的 finishOnTaskLaunch設定為“true”。參見下面的“清理堆棧”。
清理堆棧
如果使用者離開一個任務很長一段時間,系統會清理該任務中除了根activity之外的所有activity。當使用者再次回到這個任務的時候,除了只剩下初始化activity尚存之外,其餘都跟使用者上次離開它的時候一樣。這樣做的原因是:在一段時間之後,使用者再次回到一個任務的時候,他們更期望放棄他們之前的所作所為,做些新的事情。
這些屬於預設行為,另外,也存在一些activity的屬性用以控制並改變這些行為:
alwaysRetainTaskState 屬性
如果一個任務的根activity中此屬性設定為“true”,則上述預設行為不會發生。任務將在很長的一段時間內保留它堆棧內的所有activity。
clearTaskOnLaunch屬性
如果一個任務的根activity中此屬性設定為“true”,則每當使用者離開這個任務和返回它的時候,堆棧都會被清空至只留下rootactivity。換句話說,這是alwaysRetainTaskState的另一個極端。哪怕僅是過了一小會兒,使用者回到任務時,也是見到它的初始狀態。
finishOnTaskLaunch屬性
這個屬性與clearTaskOnLaunch屬性相似,但它僅作用於單個的activity,而不是整個的task。而且它可以使任意activity都被清理,甚至根activity也不例外。當它設定為“true”的時候,此activity僅做為任務的一部分存在於當前回話中,一旦使用者離開並再次回到這個任務,此activity將不複存在。
此外,還有別的方式從堆棧中移除一個activity。如果一個intent對象包含FLAG_ACTIVITY_CLEAR_TOP標記,而且目標任務的堆棧中已經存在了一個能夠響應此intent的activity類型的執行個體。則這個執行個體之上的所有activity都將被清理以使它位於堆棧的頂部來對intent做出響應。如果此時指定的activity的載入模式為“standard”,則它本身也會從堆棧中移除,並載入一個新的執行個體來處理到來的intent。這是因為載入模式為“standard”的activity總會建立一個新執行個體來處理新的intent。
FLAG_ACTIVITY_CLEAR_TOP與FLAG_ACTIVITY_NEW_TASK經常合并使用。這時,這些標記提供了一種定位其它任務中現存的activity並將它們置於可以對intent做出響應的位置的方法。
轉帖:http://dev.wo.com.cn/bbs/viewthread.jsp?tid=12272