任务栈
任务栈(ActivityTask)由framework层的ActivityServiceManager管理的一个栈,在默认情况下,一个Application只维护一个任务栈,并以包名命名。每次系统需要启动一个Activity,要先将Activity入栈,然后才开始进行Activity的生命周期
启动模式
在manifest中Activity标签下的"android:launchMode"属性中设置,分为四种:
Standard
Activity启动的默认模式,使用该模式启动Activity时,系统并不会考虑之前是否会有相同的Activity进入任务栈;每次入栈都会创建新的Activity实例,不管栈中是否有相同Activity存在
任务栈 | 添加 Activity A | 添加Activity A | 添加Activity A |
---|---|---|---|
栈顶 | Activity A | ||
↓ | Activity A | Activity A | |
栈底 | Activity A | Activity A | Activity A |
SingleTop
使用此模式时,系统向任务栈中加入Activity前,会先检查任务栈中栈顶是否为该Activity的实例,如果是的则直接使用该Activity,不是则创建新的实例并入栈
栈顶为要添加的Activity实例
任务栈 | 添加 Activity B | 添加Activity A | 添加Activity A |
---|---|---|---|
栈顶 | |||
↓ | Activity A | Activity A | |
栈底 | Activity B | Activity B | Activity B |
栈顶不是要添加的Activity实例
任务栈 | 添加 Activity B | 添加Activity A | 添加Activity B |
---|---|---|---|
栈顶 | Activity B | ||
↓ | Activity A | Activity A | |
栈底 | Activity B | Activity B | Activity B |
SingleTask
当栈顶为需要创建的Activity实例时,其表现形式与SingleTop模式相同;当栈顶不是需要创建的Activity时,则会检查任务栈中是否存在该Activity实例,如果存在,就将处于Activity上方的其他Activity都出栈,将该Activity置于栈顶
栈顶为要添加的Activity实例
任务栈 | 添加 Activity B | 添加Activity A | 添加Activity A |
---|---|---|---|
栈顶 | |||
↓ | Activity A | Activity A | |
栈底 | Activity B | Activity B | Activity B |
栈顶不是要添加的Activity实例
任务栈 | 添加 Activity B | 添加Activity A | 添加Activity B |
---|---|---|---|
栈顶 | |||
↓ | Activity A | ||
栈底 | Activity B | Activity B | Activity B |
SingleInstance
使用此模式时,系统会为使用该模式的Activity创建一个新的任务栈并将该Activity入栈,并且该任务栈中只能存在该Activity。也就是说如果有多个Activity使用了该模式,那么系统会为每一个使用该模式创建的Activity创建一个任务栈
其中Activity C为使用SingleInstance模式启动的Acitivity
默认任务栈 | 添加 Activity A | 添加Activity C | 添加Activity B | 点击Back按钮 | 点击Back按钮 | 点击Back按钮 | |
---|---|---|---|---|---|---|---|
栈顶 | |||||||
↓ | Activity B | ||||||
栈底 | Activity A | Activity A | Activity A | Activity A | |||
SingleInstance任务栈 | Activity C | Activity C | Activity C | Activity C |
应用场景
- Standard 默认启动模式
- SingleTop 适合接受通知的页面,如新闻客户端,如果好几条通知都是同一条新闻,那么每次点击通知跳转到应用时都调用同一张页面即可
- SingleTask 适合作为应用的主页面,例如浏览器,当应用需要退出时,只要跳转到主页面,并finish主页面即可关闭全部打开的网页Activity
- SingleInstance 适合作为共享页面,例如QQ或微信的第三方登录页面
参考资料
Android应用程序的Activity启动过程
Android入门:Activity四种启动模式