一.先領(lǐng)會(huì)棧的觀念(安置Activity范例的容器)
1.Task(線性表)
工作棧Task,用來安置Activity范例的容器,進(jìn)步后出,重要有2個(gè)基礎(chǔ)操縱:壓棧和出棧,其所寄存的Activity是不扶助從新排序的,只能按照壓棧和出棧操縱變動(dòng)Activity的程序。
2.app啟用時(shí),體例會(huì)為它默許創(chuàng)造一個(gè)對應(yīng)的Task,用來安置根Activity
ps:Activity之間不妨彼此啟用,暫時(shí)運(yùn)用的Activity不妨去啟用其余運(yùn)用的Activity(相機(jī)),那么即是說棧的功效不妨把其它app的activity介入到本人app的棧里.
以是Task不妨領(lǐng)會(huì)為控制處置一切用到的Activity范例的棧,然而.android5.0之后跨過程挪用activity,這個(gè)activity會(huì)被放入到一個(gè)新的棧中。
二.啟用形式(只能按照壓棧和出棧操縱變動(dòng)Activity的程序,以是是啟用形式是以哪種模樣入棧)
經(jīng)過在AndroidManifest文獻(xiàn)中的屬性andorid:launchMode來樹立大概經(jīng)過Intent的flag來樹立
1.standard(慣例模樣入棧)
默許形式。在這個(gè)形式下,城市默許創(chuàng)造一個(gè)新的范例。所以,在這種形式下,不妨有多個(gè)溝通的范例,也允很多個(gè)溝通Activity疊加。運(yùn)用場景:絕大普遍Activity。
2.singleTop(棧頂復(fù)用模樣入棧)==FLAG_ACTIVITY_SINGLE_TOP
棧頂復(fù)用形式,即使要打開的activity在工作棧的頂部仍舊生存,就不會(huì)創(chuàng)造新的范例,而是挪用onNewIntent()本領(lǐng)。制止棧頂?shù)腶ctivity被反復(fù)的創(chuàng)造。運(yùn)用場景:在報(bào)告欄點(diǎn)擊收到的報(bào)告,而后須要啟用一個(gè)Activity,這個(gè)Activity就不妨用singleTop,要不歷次點(diǎn)擊城市興建一個(gè)Activity。某個(gè)場景下貫串趕快點(diǎn)擊,啟用了兩個(gè)Activity。即使這個(gè)功夫待啟用的Activity運(yùn)用singleTop形式也是不妨制止這個(gè)Bug的。
3.singleTask(棧內(nèi)復(fù)用模樣入棧)==FLAG_ACTIVITY_CLEAR_TOP
棧內(nèi)復(fù)用形式,activity只會(huì)在工作棧內(nèi)里生存一個(gè)范例。即使要激活的activity,在工作棧內(nèi)里仍舊生存,就不會(huì)創(chuàng)造新的activity,而是復(fù)用這個(gè)仍舊生存的activity,挪用onNewIntent()本領(lǐng),而且清空這個(gè)activity工作棧上頭一切的activity(CLEAR_TOP回到棧頂)。運(yùn)用場景:大普遍App的網(wǎng)頁。對于大局部運(yùn)用,當(dāng)咱們在主界面點(diǎn)擊回退按鈕的功夫都是退出運(yùn)用,那么當(dāng)咱們第一次加入主界面之后,主界面坐落棧底,此后盡管咱們翻開了幾何個(gè)Activity,只有咱們再次回到主界面,都該當(dāng)運(yùn)用將主界面Activity上一切的Activity移除的辦法來讓主界面Activity居于棧頂,而不是往棧頂新加一個(gè)主界面Activity的范例,經(jīng)過這種辦法不妨保護(hù)退出運(yùn)用時(shí)一切的Activity都能報(bào)廢棄。
4.singleInstance(不入棧)
簡單范例形式,所有大哥大操縱體例內(nèi)里惟有一個(gè)范例生存。各別的運(yùn)用去翻開這個(gè)activity共享公用的同一個(gè)activity。他會(huì)運(yùn)轉(zhuǎn)在本人獨(dú)立,獨(dú)力的工作棧內(nèi)里,而且工作棧內(nèi)里惟有他一個(gè)范例生存。運(yùn)用場景:呼喚復(fù)電界面。這種形式的運(yùn)用情景比擬常見,在Launcher中大概運(yùn)用。大概你決定你須要使Activity惟有一個(gè)范例。倡導(dǎo)精心運(yùn)用。
5.FLAG_ACTIVITY_NO_HISTORY
Activity運(yùn)用這種形式啟用Activity,當(dāng)該Activity啟用其余Activity后,該Activity就消逝了,不會(huì)保持在Activity棧中。
三.FLAG_ACTIVITY_NEW_TASK這個(gè)屬性規(guī)則是:樹立此狀況,開始會(huì)搜索能否生存和被啟用的Activity具備溝通的親和性的工作棧(即taskAffinity,同一個(gè)運(yùn)用步調(diào)中的activity的親和性一律),即使有,則徑直把這個(gè)棧完全挪動(dòng)到前臺,并維持棧中的狀況靜止,即棧中的activity程序靜止,即使沒有,則興建一個(gè)棧來寄存被啟用的activity。1.getTaskId();獲得暫時(shí)activity所處的棧
2.同一個(gè)運(yùn)用步調(diào)中的activity的親和性一律(taskAffinity),也即是說Actviityaintent時(shí)setFalg(Intent.FLAG_ACTIVITY_NEW_TASK)到Activityb然而Actviitya和Activityb仍舊一個(gè)棧
在各別的運(yùn)用中跳轉(zhuǎn)才會(huì)創(chuàng)造新的Task。
3.在Activity左右文除外啟用Activity須要給Intent樹立FLAG_ACTIVITY_NEW_TASK標(biāo)記,否則會(huì)報(bào)特殊。
四FLAG_ACTIVITY_CLEAR_TASK(必需和FLAG_ACTIVITY_NEW_TASK一道運(yùn)用)
清空棧內(nèi)activity,只留住這個(gè)activity