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