Activity的啟動模式可以通過AndroidManifest.xml文件中的元素的屬性來指定,一共有4中模式:
1 standard
2 singleTop
3 singleTask
4 singleInstance
這4中模式又分兩類,standard和signleTop屬于一類, singleTask和signleInstance屬于另一類。
standard和singleTop屬性的 Activity 的實例可以屬于任何任務(Task),并且可以位于Activity堆棧的任何位置。比較典型的一種情況是,一個任務的代碼執行 startActivity(),如果傳遞的 Intent 對象沒有包含 FLAG_ACTIVITY_NEW_TASK 屬性, 指定的 Activity 將被該任務調用,從而裝入該任務的Activity 堆棧中。 standard和singleTop的區別在于:standard模式的Activity在被調用時會創建一個新的實例,所有實例處理同一個 Intent對象; 但對于singleTop模式的Activity,如果被調用的任務已經有一個這樣的Activity 在堆棧的頂端,那么不會有新的實例創建, 任務會使用當前頂端的Activity實例來處理Intent對象,換句話說,如果被調用的任務包含一個不在堆棧頂端的 singleTop Activity, 或者堆棧頂端為 singleTop 的Activity的任務不是當前被調用的任務,那么,仍然會有一個新的Activity對象被創建。
singleTask 和 singleInstance模式的Activity 僅可用于啟動任務的情況, 這種模式的Activity總是處在Activity堆棧的最底端,并且一個任務中只能被實例化一次。兩 者的區別在于:對于 singleInstance模式的Activity, 任務的Activity堆棧中如果有這樣的Activity,那它將是堆棧中的唯一的 Activity, 當前任務收到的 Intent 都由它處理, 由它開啟的其他 Activity 將在其他任務中被啟動; 對于 SingleTask模式的Activity,它在堆棧底端,其上方可以有其他Activity被創建, 但是,如果發給該Activity的Intent對象到來時該Activity不在堆棧頂端,那么該Intent對象將被丟棄,但是界面還是會切換到當前 的Activity。
在多Activity開發中,有可能是自己應用間的activity 跳轉,或者夾帶其他應用的可復用activity。可能會希望跳轉到原來某個activity實例,而非產生多個重復的activity。我們可借助 activity 四種啟動模式來實現不同的需求:
standard 默認模式 --------- 來了intent,每次都創建新的實例。
singleTop -------- 來了intent, 每次都創建新的實例,僅一個例外:當棧頂的activity 恰恰就是該
activity的實例(即需要創建的實例)時,不再創建新實例。這解決了棧頂復用問題,想一想,你按兩次back鍵,退出的都是同一個activity,這感覺肯定不爽。
singleTask ---------- 來了intent后,檢查棧中是否存在該activity的實例,如果存在就把intent發送給它,否則就創建一個新的該activity的實例,放入 一個新的task棧的棧底。肯定位于一個task的棧底,而且棧中只能有它一個該activity實例,但允許其他activity加入該棧。解決了在一 個task中共享一個activity。
singleInstance ----------- 肯定位于一個task的棧底, 并且是該棧唯一的activity。解決了多個task共享一個activity。
應用場景:
singleTop適合接收通知啟動的內容顯示頁面。例如,某個新聞客戶端的新聞內容頁面,如果收到10個新聞推送,每次都打開一個新聞內容頁面是很煩人的。
singleTask適合作為程序入口點。例如瀏覽器的主界面。不管從多少個應用啟動瀏覽器,只會啟動主界面一次,其余情況都會走onNewIntent,并且會清空主界面上面的其他頁面。之前打開過的頁面,打開之前的頁面就ok,不再新建。
singleInstance適合需要與程序分離開的頁面。例如鬧鈴提醒,將鬧鈴提醒與鬧鈴設置分離。singleInstance不要用于中間頁面,如果用于中間頁面,跳轉會有問題,比如:A -> B (singleInstance) -> C,完全退出后,在此啟動,首先打開的是B。