1.Task是我们常说的任务栈,BACK Stack是返回栈 2.启动模式: 声明启动模式有两种方式 1.在Manifest文件中声明待启动的Activity的launchMode属性 2.代码中通过intent启动Activity时,设置flag
standard: 标准启动模式: 也是默认的启动模式,每次启动 Activity 都会新建一个新的实例。待启动 Activity 会进入源 Activity 所属任务栈。
singleTop: 栈顶复用模式:
待启动 Activity 已经位于源 Activity 所属的任务栈的栈顶时,不会创建新的 Activity,而是直接使用栈顶的 Activity,并回调它的 onNewIntent 方法,onCreate 和 onStart 不会被调用,直接回调 onResume 。否则的话,在栈顶创建一个新的Activity实例
singleTask:栈内复用模式:
全局单实例,首先会寻找要启动的 Activity 想要的任务栈(默认或者 taskAffinity 属性指定),如果没有找到,则创建新的任务栈并将 Activity 实例放入。如果找到了想要的任务栈,这时候要判断栈中是否已经存在该 Activity 的实例,如果已经存在,会将该 Activity 以上的其他 Activity 实例弹出,把自己放到栈顶,同样也是回调 onNewIntent 和 onResume。如果实例不存在,创建新的实例并压入栈中。
singleInstance:单实例模式
全局单实例,首次启动时会创建新的 Activity 实例,并放入一个新的任务栈中,且这个任务栈中只会有这一个实例。 后续启动不会再新建实例。
默认的 standard 模式其实已经满足大部分情况下的需求,但是 同一个 Activity 会创建多次实例 在某些情况下肯定是不合适的,返回栈也会很突兀。这时候就需要复用已经存在的 Activity 实例,所以有了 singleTop 和 singleTask 两种不同的复用方式。而 singleInstance 则更加直接,Activity 实例和任务栈都是全局唯一的。
taskAffinity 前面提到了 Activity 想要的任务栈, taskAffinity 的作用就是指定想要的任务栈。但它并不会在任何场景下都会起作用。 未显式声明 taskAffinity 的 Activity 都具有默认的任务栈,该任务栈的名称是应用包名。 当启动模式设置为 standard 或 singleTop 时,它是不起作用的。待启动的 Activity 会跟随源 Activity 的任务栈,即使你显式声明了不一样的 taskAffinity 。 当启动模式设置了 singleTask 或者singleInstance 时,它就会新建任务栈来存储待启动的 Activity 实例。
返回栈的意义:
任务栈和返回栈是独立存在的,用户页面的返回依赖的是返回栈,而不是任务栈。一个返回栈中可能会包含来自不同任务栈的 Activity ,以维护正确的回退栈关系。这就是返回栈存在的意义。
|