弄懂Activity四大启动模式

2020-03-01  本文已影响0人  瀚海网虫

demo地址
https://github.com/jjbheda/activitylaunchmodel/blob/master/README.md

1. 易混概念

image.png

Activity 属于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 启动模式

  1. launcher 启动: 例如点击app 图标,未拉起的话,新建task (通过startActivity),点击后,未必一定拉起主页面
  2. navigation键启动 : 恢复
  3. 通知栏 :未拉起的话,新建task (通过startActivity)
  4. 其他app scheme 跳转:未拉起的话,新建task (通过startActivity)

3. Activtiy 生命周期

image.png

onStart方法和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.png

5.1 Standard 与SingleTop 是一类

如果想要指定新task中启动Activity,必须同时满足:

  1. 指定另外的affinity
  2. 指定启动模式为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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

5.2 SingleTask 与SingleInstance 是一类

与New Task Flag 无关
其他Flag 会正常执行,比如CLEAR_FLAG 之类

SingleTask: 栈内有的话,直接将其他Activity 出栈,保证该实例处于栈顶位置。 如果不存在,则在当前栈重建一个实例(指定affinity除外)。

SingleInstance: 独门独户,只能启动在独立的task。但如果已存在,不在启动新task。

6. OnNewIntent

  1. standard 每次都new,不会执行OnNewIntent (唯一例外:从app图标启动后,再回到桌面点击。这种情况下,系统设置了特殊flag,不会new,而是直接回复)
  2. SingleTop, SingleTask,SingleInstance 都会走OnNewIntent
    注:Navigation 切换回来,走的是OnRestart--Onstart---onResume 不走OnNewIntent


    image.png

7. 适合场景

7.1 singleTop

适合启动同类型的 Activity,例如:
•接收通知启动的内容显示页面
•登录页面

7.2 singleTask

适合作为程序入口,例如:
•WebView页面
•扫一扫跳转页
•确认订单界面

7.3 singleInstance

适合需要与程序分离开的页面,例如:
•闹铃的响铃界面
•来电页面
•锁屏页

上一篇下一篇

猜你喜欢

热点阅读