Android Intent Flag詳解

Android 的一個特色就是 application A的activity可以啓動 application B 的 activity,儘管 A 和 B 是毫無干系的,而在用戶看來,兩個場景緊密聯繫,視覺上二者構成了一個整體。Android 就是把這種誤覺定義爲 Task,它既不是 class,也不是 AndroidMainifest.xml 中的一個元素。從表現上看 Task 就像是一個 stack,一個一個的 activity 是構成 stack 的元素,做着入棧 (push) 和出棧 (pop-up)這樣簡單重複性的勞動。

默認的規則總是滿足大多數的應用場景,但是也總會有一些例外打破習以爲常的慣例。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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章