文章目录
一、android任务栈
- android任务栈又称为Task,它是一个栈结构,具有后进先出的特性,用于存放我们的Activity组件
- 我们每次打开一个新的Activity或者退出当前Activity都会在一个称为任务栈的结构中添加或者减少一个Activity组件, 一个任务栈包含了一个activity的集合, 只有在任务栈栈顶的activity才可以跟用户进行交互
- 在我们退出应用程序时,必须把所有的任务栈中所有的activity清除出栈时,任务栈才会被销毁。当然任务栈也可以移动到后台, 并且保留了每一个activity的状态. 可以有序的给用户列出它们的任务, 同时也不会丢失Activity的状态信息
- android通过
ActivityRecord
、TaskRecord
、ActivityStack
、ActivityStackSupervisor
,ProcessRecord
有序地管理每个activity
二、启动模式
1、标准启动模式 — Standard
该模式是启动的默认模式,每次启动Activity都会创建一个新的Activity实例,activity会被一次顺序压入栈中
2、栈顶复用模式 — SingleTop
如果要启动的Activity已经在栈顶,则不会重新创建Activity,只会调用该该Activity的onNewIntent()方法。
如果要启动的Activity不在栈顶,则会重新创建该Activity的实例
应用场景
登录页面、WXPayEntryActivity、WXEntryActivity、推送通知栏
3、栈内复用模式 — SingleTask
如果要启动的Activity已经存在于它想要归属的栈中,那么不会创建该Activity实例,将栈中位于该Activity上的所有的Activity出栈,同时该Activity的onNewIntent()方法会被调用
应用场景
程序模块逻辑入口:主页面、WebView页面、扫一扫页面、购物界面、确认订单界面、付款界面
4、全局唯一模式 — SingleInstance
要创建在一个新栈,然后创建该Activity实例并压入新栈中,新栈中只会存在这一个Activity实例
如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒
应用场景
来电显示、呼叫界面、锁屏等
三、设置启动模式方式
1、Manifest中静态设置
android:launchMode="singleTask"
2、动态设置
intent.setFlags(...);
几种常见标记位flag
FLAG_ACTIVITY_NEW_TASK
此标记位作用是为Activity指定“singleInstance”启动模式,其效果和在XML中指定相同android:launchMode="singleInstance"
FLAG_ACTIVITY_SINGLE_TOP
此标记位作用是为Activity指定“singleTop”启动模式,其效果和在XML中指定相同android:launchMode="singleTop"
FLAG_ACTIVITY_CLEAR_TOP
具有此标记位的Activity,当它启动时,在同一个任务栈中位于它上面的Activity都要出栈。此标记位一般会和singleTask启动模式一起出现,此情况下,若被启动的Activity实例存在,则系统会调用它的onNewIntent,其效果和在XML中指定相同android:launchMode="singleTask"