我們知道,在Android中喇完,launchMode在多個Activity跳轉(zhuǎn)的過程中扮演著重要的角色枚抵,它可以決定是否生成新的Activity實例柜候,是否重用已存在的Activity實例,是否和其他Activity實例公用一個task里灰羽。這里順帶簡單介紹一下task的概念驮履,task也叫活動棧,數(shù)據(jù)結(jié)構(gòu)是棧廉嚼,它用來管理Activity玫镐,一個task可以管理多個Activity,啟動一個應用怠噪,也就創(chuàng)建一個與之對應的task恐似。
Activity中共有四種啟動模式:
*1.standard
*2.singleTop
*3.singleTask
*4.singleInstance
上述四中啟動模式可以在AndroidManifest.xml中通過的android:launchMode屬性進行配置
1.standard
該啟動模式是系統(tǒng)默認的啟動模式,如果你新建一個Activity并且不設置它的啟動模式(模式為standard)傍念,那么當其他Activity啟動這個Activity的時候就會重新創(chuàng)建一個實例矫夷,不管之前的task中是否有這個Activity的實例。
比如:A憋槐、B双藕、C三個Activity的啟動順序為A->B->C,三者的啟動模式均為standard阳仔,那么忧陪,在C中啟動C的時候,近范,tsak中會重新生成一個新的A的實例嘶摊,task中的順序?qū)⒆優(yōu)锳->B->C1->C2。(C1顺又,C2表示同一Activity的不同實例)
2.singleTop
該啟動模式與standard不同之處在于更卒,如果被啟動的Activity的啟動模式被設置為singleTop的話,如果在task中有該Activity的實例并且該Activity處于棧頂?shù)脑捴烧眨敲聪到y(tǒng)不會重新創(chuàng)建新的Activity蹂空,而是會復用之前的Activity實例俯萌,同時回調(diào)Activity中的onNewIntent()方法,否則的話系統(tǒng)還是會和與standard一樣創(chuàng)建新的實例上枕。比如:A->B->C咐熙,C啟動模式為singleTop,在C中啟動C辨萍,由于C在棧頂棋恼,task中依舊為A->B->C,如果設置A啟動模式為singleTop锈玉,那么在C中啟動A爪飘,A不在棧頂,則系統(tǒng)會重新創(chuàng)建實例拉背,task中會變?yōu)锳1->B->C->A2师崎。
3.singleTak
singleTask模式和后面的singleInstance模式都是只創(chuàng)建一個實例的。
該啟動模式是singleTop的加強版椅棺,如果發(fā)現(xiàn)所在Activity棧中有對應的Activity實例犁罩,則使此Activity實例之上的其他Activity實例統(tǒng)統(tǒng)出棧,使此Activity實例成為棧頂對象两疚,顯示到幕前床估。比如:A->B->C,C啟動模式為singleTop诱渤,在C中啟動C丐巫,由于C在棧頂,task中依舊為A->B->C源哩,如果設置A啟動模式為singleTop鞋吉,那么在C中啟動B,B不在棧頂励烦,則系統(tǒng)清除B上面的所有實例谓着,讓其置于棧頂,task中會變?yōu)锳->B坛掠。
4.singleInstance
這種啟動模式比較特殊赊锚,因為它會啟用一個新的棧結(jié)構(gòu),將Acitvity放置于這個新的棧結(jié)構(gòu)中屉栓,并保證不再有其他Activity實例進入舷蒲。
簡單點理解,singleInstance所標識的Activity友多,當被啟動時牲平,系統(tǒng)會首先判斷系統(tǒng)其他棧中是否已經(jīng)存在此Activity實例,有則直接使用域滥,并且其所在的Activity棧理論上只有它一個Activity元素纵柿。
關于Activity的taskAffinity和Intent的幾種常見的FLAG是以及task相關屬性會在下一篇文中詳細介紹
參考鏈接:Android之四種加載方式(http://blog.csdn.net/tiancizhenai/article/details/7037787).