弄懂Activity四大启动模式
demo地址
https://github.com/jjbheda/activitylaunchmodel/blob/master/README.md
1. 易混概念
image.pngActivity 属于Application,Task属于Android操作系统,独立于应用存在。
Task 并不依附于Application存在,一个task中可包含多个应用的Activity。
Home键旁边那个方形键(navigation)键中看到的,是task列表,不是Application列表。
查看当前正在运行的task列表:
adb shell dumpsys activity activities | sed -En -e '/Stack #/p' -e '/Running activities/,/Ruan #0/p'
2. Task 启动模式
- launcher 启动: 例如点击app 图标,未拉起的话,新建task (通过startActivity),点击后,未必一定拉起主页面
- navigation键启动 : 恢复
- 通知栏 :未拉起的话,新建task (通过startActivity)
- 其他app scheme 跳转:未拉起的话,新建task (通过startActivity)
3. Activtiy 生命周期
image.pngonStart方法和onResume方法有什么区别?
(1)是否在前台。onStart: 可见但不在前台,不可交互;onResume:在前台。(2)职责不同,onStart:主要还是进行初始化工作,onResume:根据官方的建议,可以做开启动画和独占设备的操作。
onPause方法和onStop方法有什么区别?
(1)是否可见。onPause:可见,onStop:不可见,但Activity对象还在内存中。(2)在系统内存不足的时候可能不会执行onStop方法,因此程序状态的保存、独占设备和动画的关闭、以及一些数据的保存最好在onPause中进行,但要注意不能太耗时。
4. 启动模式与启动FLAG
4种启动模式只能在Manifest中定义,是为开发者提供的限定Activity启动模式的方式。 Flag 是调用方启动Activity 时,提供的API,是给调用方提供的,启动对方Activity的启动模式。
5. 启动模式一般架构
image.png5.1 Standard 与SingleTop 是一类
如果想要指定新task中启动Activity,必须同时满足:
- 指定另外的affinity
- 指定启动模式为new task
如果未指定affinity,仅仅使用new task 是无效的,还是会在本task中新建一个实例。
affinity
简单的可看成代表task的名字,默认是包名。
如果一个Activity有TaskAffinity但是没有singleTask/FLAG_ACTIVITY_NEW_TASK时,那TaskAffinity无效。
如果一个Activity没有singleTask/FLAG_ACTIVITY_NEW_TASK,那么启动它后它会存在于启动它的那个Task内(如果允许的话)。
作者:hyzhang98
链接:https://www.jianshu.com/p/a3958f0a60f6
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- Standard
典型的多实例实现,一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。在这种模式下,谁启动了这个 Activity,那么这个 Activity 就运行在启动它的那个 Activity 所在的栈中。 - SingleTop
栈顶复用模式。 已在栈顶,不会重新创建,而是直接复用。
5.2 SingleTask 与SingleInstance 是一类
与New Task Flag 无关
其他Flag 会正常执行,比如CLEAR_FLAG 之类
SingleTask: 栈内有的话,直接将其他Activity 出栈,保证该实例处于栈顶位置。 如果不存在,则在当前栈重建一个实例(指定affinity除外)。
SingleInstance: 独门独户,只能启动在独立的task。但如果已存在,不在启动新task。
6. OnNewIntent
- standard 每次都new,不会执行OnNewIntent (唯一例外:从app图标启动后,再回到桌面点击。这种情况下,系统设置了特殊flag,不会new,而是直接回复)
-
SingleTop, SingleTask,SingleInstance 都会走OnNewIntent
注:Navigation 切换回来,走的是OnRestart--Onstart---onResume 不走OnNewIntent
image.png
7. 适合场景
7.1 singleTop
适合启动同类型的 Activity,例如:
•接收通知启动的内容显示页面
•登录页面
7.2 singleTask
适合作为程序入口,例如:
•WebView页面
•扫一扫跳转页
•确认订单界面
7.3 singleInstance
适合需要与程序分离开的页面,例如:
•闹铃的响铃界面
•来电页面
•锁屏页