Android四種加載方式

Activity的4種加載模式: spa

1.standard:標準模式 xml

2.singleTop:Task頂單例模式 it

3.singleTask:Task內單例模式 後臺

4.singleInstance:全局單例模式 service

Task能夠理解爲Activity棧,Task以棧的形式管理Activity,先啓動的被放在Task棧底。 程序

1.standard:每次經過這種模式來啓動目標Activity時,Android 總會爲目標Activity建立一個新的實例, activity

並將該Activity添加到當前Task棧中-----這種模式不會啓動新的Task,新的Activity將被添加到原有的Task中。 時間

2.singleTop模式:這種模式與standard模式基本類似,但有一點不一樣:當將要被啓動的目標Activity已經位於Task棧頂時,系統不會從新建立Activity的實例,而是直接複用已有的Activity實例。不會調用oncreate(),而是響應onNewIntent() vi

3.singleTask模式:採用這種加載模式的Activity在同一個任務Task內只有一個實例,當系統採用singleTask模式啓動目標Activity時,可分爲三種狀況 單例模式

1):若是將要啓動的目標Activity不存在,系統將會建立目標Activity實例,將其加入到Task棧頂。

2):若是將要啓動的目標Activity已經位於Task棧頂,此時與singleTop模式行爲相同。

3):若是將要啓動的目標Activity已經存在,但沒有位於Task棧頂,系統將會把位於該Activity上面的全部Activity移除Task棧,從而使得目標Activity轉入棧頂。

4.singleInstance模式:這種加載模式下,系統保證不管從哪一個Task中啓動目標Activity,只會建立一個目標Activity實例,並會使用一個全新的Task棧啦裝載該Activity實例。

當採用singleInstance啓動目標Activity時,分爲兩種狀況:

1):若是將要啓動的目標Activity不存在,系統會先建立一個全新的Task,再建立目標Activity的實例,並將其加入新的Task的棧頂。

2):若是將要啓動的目標Activity已經存在,不管它位於哪一個應用程序中,不管它位於哪一個Task中,系統將會把該Activity所在的Task轉到前臺,從而使用該Activity顯示出來。

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

Intent的經常使用Flag參數:

FLAG_ACTIVITY_CLEAR_TOP:例如如今的棧狀況爲:A B C D 。D此時經過intent跳轉到B,若是這個intent添加FLAG_ACTIVITY_CLEAR_TOP 標記,則棧狀況變爲:A B。若是沒有添加這個標記,則棧狀況將會變成:A B C D B。也就是說,若是添加了FLAG_ACTIVITY_CLEAR_TOP 標記,而且目標Activity在棧中已經存在,則將會把位於該目標activity之上的activity從棧中彈出銷燬。這跟上面把B的Launch mode設置成singleTask相似。

FLAG_ACTIVITY_NEW_TASK:例如如今棧1的狀況是:A B C。C經過intent跳轉到D,而且這個intent添加了FLAG_ACTIVITY_NEW_TASK 標記,若是D這個Activity在Manifest.xml中的聲明中添加了Task affinity,而且和棧1的affinity不一樣,系統首先會查找有沒有和D的Task affinity相同的task棧存在,若是有存在,將D壓入那個棧,若是不存在則會新建一個D的affinity的棧將其壓入。若是D的Task affinity默認沒有設置,或者和棧1的affinity相同,則會把其壓入棧1,變成:A B C D,這樣就和不加FLAG_ACTIVITY_NEW_TASK 標記效果是同樣的了。      注意若是試圖從非activity的非正常途徑啓動一個activity,好比從一個service中啓動一個activity,則intent好比要添加FLAG_ACTIVITY_NEW_TASK 標記。

FLAG_ACTIVITY_NO_HISTORY:例如如今棧狀況爲:A B C。C經過intent跳轉到D,這個intent添加FLAG_ACTIVITY_NO_HISTORY標誌,則此時界面顯示D的內容,可是它並不會壓入棧中。若是按返回鍵,返回到C,棧的狀況仍是:A B C。若是此時D中又跳轉到E,棧的狀況變爲:A B C E,此時按返回鍵會回到C,由於D根本就沒有被壓入棧中。

FLAG_ACTIVITY_SINGLE_TOP:和上面Activity的 Launch mode的singleTop相似。若是某個intent添加了這個標誌,而且這個intent的目標activity就是棧頂的activity,那麼將不會新建一個實例壓入棧中。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Activity的主要屬性:

allowTaskReparenting:設置成true時,和Intent的FLAG_ACTIVITY_NEW_TASK 標記相似。

alwaysRetainTaskStat:   若是用戶長時間將某個task 移入後臺,則系統會將該task的棧內容彈出只剩下棧底的activity,此時用戶再返回,則只能看到根activity了。若是棧底的 activity的這個屬性設置成true,則將阻止這一行爲,從而保留全部的棧內容。

clearTaskOnLaunch:根activity的這個屬性設置成true時,和上面的alwaysRetainTaskStat 的屬性爲true狀況搞好相反。

finishOnTaskLaunch:對於任何activity,若是它的這個屬性設置成true,則當task被放置到後臺,而後從新啓動後,該activity將不存在了。

相關文章
相關標籤/搜索