我們知道,在Android中,launchMode在多個Activity跳轉的過程中扮演著重要的角色,它可以決定是否生成新的Activity實例,是否重用已存在的Activity實例,是否和其他Activity實例公用一個task里。這里順帶簡單介紹一下task的概念,task也叫活動棧,數據結構是棧,它用來管理Activity,一個task可以管理多個Activity,啟動一個應用,也就創建一個與之對應的task。
Activity中共有四種啟動模式:
*1.standard
*2.singleTop
*3.singleTask
*4.singleInstance
上述四中啟動模式可以在AndroidManifest.xml中通過的android:launchMode屬性進行配置
1.standard
該啟動模式是系統默認的啟動模式,如果你新建一個Activity并且不設置它的啟動模式(模式為standard),那么當其他Activity啟動這個Activity的時候就會重新創建一個實例,不管之前的task中是否有這個Activity的實例。
比如:A、B、C三個Activity的啟動順序為A->B->C,三者的啟動模式均為standard,那么,在C中啟動C的時候,,tsak中會重新生成一個新的A的實例,task中的順序將變為A->B->C1->C2。(C1,C2表示同一Activity的不同實例)
2.singleTop
該啟動模式與standard不同之處在于,如果被啟動的Activity的啟動模式被設置為singleTop的話,如果在task中有該Activity的實例并且該Activity處于棧頂的話,那么系統不會重新創建新的Activity,而是會復用之前的Activity實例,同時回調Activity中的onNewIntent()方法,否則的話系統還是會和與standard一樣創建新的實例。比如:A->B->C,C啟動模式為singleTop,在C中啟動C,由于C在棧頂,task中依舊為A->B->C,如果設置A啟動模式為singleTop,那么在C中啟動A,A不在棧頂,則系統會重新創建實例,task中會變為A1->B->C->A2。
3.singleTak
singleTask模式和后面的singleInstance模式都是只創建一個實例的。
該啟動模式是singleTop的加強版,如果發現所在Activity棧中有對應的Activity實例,則使此Activity實例之上的其他Activity實例統統出棧,使此Activity實例成為棧頂對象,顯示到幕前。比如:A->B->C,C啟動模式為singleTop,在C中啟動C,由于C在棧頂,task中依舊為A->B->C,如果設置A啟動模式為singleTop,那么在C中啟動B,B不在棧頂,則系統清除B上面的所有實例,讓其置于棧頂,task中會變為A->B。
4.singleInstance
這種啟動模式比較特殊,因為它會啟用一個新的棧結構,將Acitvity放置于這個新的棧結構中,并保證不再有其他Activity實例進入。
簡單點理解,singleInstance所標識的Activity,當被啟動時,系統會首先判斷系統其他棧中是否已經存在此Activity實例,有則直接使用,并且其所在的Activity棧理論上只有它一個Activity元素。
關于Activity的taskAffinity和Intent的幾種常見的FLAG是以及task相關屬性會在下一篇文中詳細介紹
參考鏈接:Android之四種加載方式(http://blog.csdn.net/tiancizhenai/article/details/7037787).