任务栈
栈是一种常用的数据结构,栈只允许访问栈顶的元素。
任务栈分为前台任务栈后后台任务栈,每个Activity被一一放入任务栈。是一种“后进先出”的栈结构
Task
Task是与Activity相关的一个重要概念,它密切联系着Activity栈,它简单的说,就是一组以栈的模式聚集在一起的Activity组件集合。Activity在Task中的顺序是可以控制的,在Activity跳转时用到Intent Flag可以设置新建activity的创建方式。
启动模式
四种启动模式:standard、singleTop、singleTask、singleInstance
-
standard:标准模式
是默认的启动模式,每次启动一个Activity都会创建一个实例。典型的多实例实现,一个任务栈可以有多个实例,不同实例可以属于不同任务栈。
比如ActivityA启动了ActivityB,那么B就进入到A所在的任务栈
-
singleTop:栈顶复用模式
如果Activity已经位于栈顶,这时候启动它,不会新建实例,同时onNewIntent被回调,通过此方法可以取出当前请求的信息。如果不是位于栈顶,则Activity还是被重建
-
singleTask:栈内复用模式
只要当前栈中存在该Activity实例,那么多次启动也不会重建,同时onNewIntent被回调。
比如具有singleTask模式的ActivityA请求启动时候
- 系统先寻找是否存在有A想要的任务栈,没有则新建任务栈并将A放入
- 如果已经存在A所需的任务栈,则看是否已经存在A实例
如果实例存在,那么系统就会将A调到栈顶并调用它的onNewIntent方法,同时singleTask默认具有clearTop的效果,会将栈内A上面的Activity全部出栈
没有则新建A并压入栈中。
-
singleInstance:单实例模式
除了具有singleTask所有特性外,具有此模式的Activity只能单独位于一个任务栈,所有Activity栈中只有存在一个实例
ActivityA启动ActivityB(SingleInstance模式):
该模式不区分ActivityA与ActivityB是否位于同一个应用
所有任务栈中不存在ActivityB,则ActivityB会在新的任务栈中创建,并且该任务栈始终只有ActivityB,ActivityB启动其他Activity会被放到另外的任务栈
某个任务栈中存在ActivityB,则直接利用。
什么是Activity所需的任务栈?
参数TaskAffinity
任务相关性,标识了Activity所需的任务栈名字,默认为包名,为空时候不属于任何任务栈
使用TaskAffinity
- 与singleTask模式配对使用
android:taskAffinity="不同于包名的属性"
android:launchMode="singleTask"
- 与allowTaskReparenting属性配对使用
android:taskAffinity="不同于包名的属性"
android:allowTaskReparenting="true"
如何指定启动模式
- Menifest中声明android:launchMode
<activity
android:name=".MainActivity"
android:launchMode="singleTask"
/>
- Intent中设置addFlags(优先级更高)
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Activity的Flags
标记位有的设定Activity启动模式,有的影响Activity运行状态
- Intent.FLAG_ACTIVITY_NEW_TASK (默认)
同singleTask- FLAG_ACTIVITY_SINGLE_TOP
同singleTop- FLAG_ACTIVITY_CLEAR_TOP
当被启动的ActivityA实例已经存在,如果和singleTask启动模式一起出现,则调用它的onNewIntent并清除A上面的所有实例;如果被启动的Activity采用standard模式,那么它连同它之上的都出栈,系统创建新的实例放入栈中- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
标记的Activity不会出现在历史列表中,等同于Menifest中指定android:excludeFromRecents="true"- ...
清晰描述onNewIntent调用的场景
在singleTop、singleTask、singleInstance下....
网友评论