天天看點

singleTop和singleTask有什麼差別

singleTop要求如果建立intent的時候棧頂已經有要建立的Activity的執行個體,則将intent發送給該執行個體,而不發送給新的執行個體。(注意是棧頂,不在棧頂照樣建立新執行個體!)

singleTask模式:當intent到來,需要建立singleTask模式Activity的時候,系統會檢查棧裡面是否已經有該Activity的執行個體。如果有直接将intent發送給它。

Activity的四種加載模式:

1、standard :系統的預設模式,一次跳轉即會生成一個新的執行個體。假設有一個activity命名為Act1,執行語句:

startActivity(new Intent(Act1.this, Act1.class));

後Act1将跳轉到另外一個Act1,也就是現在的棧裡面有 Act1 的兩個執行個體。按傳回鍵後你會發現仍然是在Act1(第一個)裡面。

2、singleTop:singleTop 跟standard 模式比較類似。唯一的差別就是,當跳轉的對象是位于棧頂的activity(應該可以了解為使用者眼前所 看到的activity)時,程式将不會生成一個新的activity執行個體,而是直接跳到現存于棧頂的那個activity執行個體。拿上面的例子來說,當Act1 為 singleTop 模式時,執行跳轉後棧裡面依舊隻有一個執行個體,如果現在按傳回鍵程式将直接退出。這個貌似用得比較少。

3、singleTask: singleTask模式和後面的singleInstance模式都是隻建立一個執行個體的。在這種模式下,無論跳轉的對象是不是位于棧頂的activity,程式都不會生成一個新的執行個體(當然前提是棧裡面已經有這個執行個體)。這種模式相當有用,在以後的多activity開發中, 經常會因為跳轉的關系導緻同個頁面生成多個執行個體,這個在使用者體驗上始終有點不好,而如果你将對應的activity聲明為 singleTask 模式,這種問題将不複存在。不過前陣子好像又看過有人說一般不要将除開始頁面的其他頁面設定為 singleTask 模式,原因暫時不明,哪位知道的可以請教下。

4、singleInstance: 設定為 singleInstance 模式的 activity 将獨占一個task(感覺task可以了解為程序),獨占一個task的activity與其說是activity,倒不如說是一個應用,這個應用與其他activity是獨立的,它有自己的上下文activity。拿一個例子來說明吧:

現在有以下三個activity: Act1、Act2、Act3,其中Acti2 為 singleInstance 模式。它們之間的跳轉關系為: Act1 -- Act2 -- Act3 ,現在在Act3中按下傳回鍵,由于Act2位于一個獨立的task中,它不屬于Act3的上下文activity,是以此時将直接傳回到Act1。這就是singleInstance模式。

SingleTask,一個Activity最多隻能有一個執行個體對象。如A啟動B,B再啟動A,不建立新執行個體對象,而是使用原來的A執行個體對象。SingleTop,如果目前Task頂層的Activity執行個體對象,是你要打開的Activity時,不建立新的執行個體對象,而是使用原來的。如果不是,則建立一個新執行個體對象。比如A啟動B,B再啟動A,Task中就有了兩個A的執行個體對象,因為Task的頂層是B。

singleTop要求如果建立intent的時候棧頂已經有要建立的Activity的執行個體,則将intent發送給該執行個體,而不發送給新的執行個體。當intent到來,需要建立singleTask模式Activity的時候,系統會檢查棧裡面是否已經有該Activity的執行個體。如果有直接将intent發送給它。

single task 一定會建立一個新的task,single top不會。

繼續閱讀