一.先领会栈的观念(安置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),也即是说 Actviitya intent时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