android中四種啟動模式

Activity的啟動模式可以通過AndroidManifest.xml文件中的<activity>元素的屬性來指定,一共有4中模式:
 
<activity android:name="ActivityMain" android:launchMode="singleTask"></activity>
standard
singleTop
singleTask
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。

 

摘自 卡基斯專欄

發佈留言