默認的規則總是滿足大多數的應用場景,但是也總會有一些例外打破習以爲常的慣例。Task 的默認規則同樣並非牢不可破,修改的方法還是有的。
藉助 Intent 中的 flag 和 AndroidMainifest.xml 中 activity 元素的屬性,就可以控制到 Task 裏 Activity 的關聯關係和行爲。
在 android.content.Intent 中一共定義了20種不同的 flag,其中和 Task 緊密關聯的有四種:
1.FLAG_ACTIVITY_NEW_TASK
2.FLAG_ACTIVITY_CLEAR_TOP
3.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
4.FLAG_ACTIVITY_SINGLE_TOP
在使用這四個 flag 時,一個 Intent 可以設置一個 flag,也可以選擇若干個進行組合。默認情況下,通過 startActivity() 啓動一個新的 Activity,新的 Activity 將會和調用者在同一個 stack 中。但是,如果在傳遞給 startActivity() 的 Intent 對象裏包含了 FLAG_ACTION_NEW_TASK,情況將發生變化,–系統將爲新的 Activity “尋找”一個不同於調用者的 Task。不過要找的 Task 是不是一定就是 NEW 呢?如果是第一次執行,則這個設想成立,如果說不是,也就是說已經有一個包含此 Activity 的Task 存在,則不會再啓動 Activity。
如果 flag 是 FLAG_ACTIVITY_CLEAR_TOP,同時當前的 Task 裏已經有了這個 Activity,那麼情形又將不一樣。Android 不但不會啓動新的 Activity 實例,而且還會將 Task 裏 該 Activity 之上的所有 Activity 一律結束掉,然後將 Intent 發給這個已存在的 Activity。Activity 收到 Intent 之後,可以在 onNewIntent() 裏做下一步的處理,也可以自行結束然後重新創建自己。如果 Activity 在 AndroidMainifest.xml 裏將啓動模式設置成”multiple”,– 默認模式,並且 Intent 裏也沒有設置 FLAG_ACTIVITY_SINGLE_TOP,那麼它將選擇後者。否則,它將選擇前者。FLAG_ACTIVITY_CLEAR_TOP 還可以和 FLAG_ACTION_NEW_TASK 配合使用。如果 flag 設置的FLAG_ACTIVITY_SINGLE_TOP,則意味着如果 Activity 已經是運行在 Task 的 top,則該 Activity 將不會再被啓動。
參考文檔
http://my.oschina.net/u/1244156/blog/228483
時間:
2015-10-21