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模式。