目录
一、相关知识
1.一个应用程序通常会有多个Activity,这些Activity都有一个对应的action(如MainActivity的action),可通过action来启动对应Activity(隐式启动)。
<action android:name="android.intent.action.MAIN" />
2.一个应用程序可以说由一系列组件组成,这些组件以进程为载体,相互协作实现App功能。
3.任务栈(Task Stack)或者叫退回栈(Back Stack)介绍:
任务栈用来存放用户开启的Activity
在应用程序创建之初,系统会默认分配给其一个任务栈(默认一个),并存储根Activity
同一个Task Stack,只要不在栈顶,就是onStop状态
任务栈的id自增长型,是Integer类型
新创建Activity会被压入栈顶。点击back会将栈顶Activity弹出,并产生新的栈顶元素作为显示界面(onResume状态)
当Task最后一个Activity被销毁时,对应的应用程序被关闭,清除Task栈,但是还会保留应用程序进程,再次点击进入应用会创建新的Task栈。
4.Activity的affinity:
affinity是Activity内的一个属性(在ManiFest中对应属性为taskAffinity)。默认情况下,拥有相同affinity的Activity属于同一个Task中
Task也有affinity属性,它的affinity属性由根Activity(创建Task时第一个被压入栈的Activity)决定
在默认情况下,所有的Activity的affinity都从Application继承。也就是说Application同样有taskAffinity属性
4Application默认的affinity属性为Manifest的包名。
二、Activity启动模式:
1.默认启动模式——standard
Activity的默认模式就是standard。在该模式下,启动的Activity会依照启动顺序被依次压入Task中:
2.栈顶复用模式——singleTop
在该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity。
3.栈内复用模式——singleTask
与singleTop模式相似,只不过singleTop模式是只是针对栈顶的元素,而singleTask模式下,如果task栈内存在目标Activity实例,将task内的对应Activity实例之上的所有Activity弹出栈, 将对应Activity置于栈顶,获得焦点。
4.全局唯一模式——singleInstance
在该模式下,我们会为目标Activity分配一个新的affinity,并创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task有且只有这一个Activity实例。 如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态)
三、动态设置启动模式
上述所有情况,在Manifest中通过launchMode属性设置,被称为静态设置,动态的设置Activity启动方式(如果同时有动态和静态设置,那么动态的优先级更高)。
动态设置是通过设置要启动的Activity的启动模式:
intent.setFlags(...);
几个常见的Flag:
1、NEW_TASK
Intent.FLAG_ACTIVITY_NEW_TASK
与singleInstance很相似:在给目标Activity设立此Flag后,会根据目标Activity的affinity进行匹配,如果已经存在与其affinity相同的task,则将目标Activity压入此Task。 反之没有的话,则新建一个task,新建的task的affinity值与目标Activity相同。然后将目标Activity压入此栈。
2、SINGLE_TOP
Intent.FLAG_ACTIVITY_SINGLE_TOP
与静态设置中的singleTop效果相同
2.3.CLEAR_TOP
Intent.FLAG_ACTIVITY_CLEAR_TOP
与singleTask相似当设置此Flag时,目标Activity会检查Task中是否存在此实例,如果没有则添加压入栈,如果有,就将位于Task中的对应Activity其上的所有Activity弹出栈,此时有以下两种情况:
如果同时设置Flag_ACTIVITY_SINGLE_TOP,则直接使用栈内的对应Activity,
没有设置,则将栈内的对应Activity销毁重新创建。