从四个视角理解Activity启动模式

268 阅读3分钟

前言

每天进一点点,这篇文章其实我不太想写,因为感觉理解的并不深刻,所以暂且作知识储备吧。很多图片都借助网上的

四个视角理解Activity启动

其实我个人觉得直观视角就用户视角、程序员视角,至于操作系统视角、架构师视角暂时还没get到。

1.Task

网上的图,很直观,就是一系列Activity的集合?而且task可以有多个应用的Activity,所以说task是属于整个Android操作系统的,Activty代码是属于Application。

2.怎么查看Task?

2.1用户角度

2.2 程序员角度

使用adb查看当前Android系统启动了哪些Tasks,以及每个Task保护哪些Actvity:

adb shell dumpsys activity activities | sed -En -e ‘/Stack #/p’ -e ‘/Running activities/,/Run #0/p’

3.启动方式

3.1 用户角度

  • 1.通过系统消息通知点击(会新建)
  • 2.通过luacher,也就是点击图标(会新建)
  • 3.通过其他应用内部跳转过来(会新建)
  • 4.这种是通过点击菜单键、选中自己的想要的应用(不会新建,会走onRestart流程)

3.2 程序员角度

我个人觉得其实就是四种启动模式了。这里提一句,Fragment是依附于Activity上的。讲到四种启动模式之前,需要说清楚Activity的生命周期

4.Activity的生命周期

1.onCreate和onStart之间有什么区别?

(1)可见与不可见的区别。前者不可见,后者可见。
(2)执行次数的区别。onCreate方法只在Activity创建时执行一次,而onStart方法在Activity的切换以及按Home键返回桌面再切回应用的过程中被多次调用。因此Bundle数据的恢复在onStart中进行比onCreate中执行更合适。
(3)onCreate能做的事onStart其实都能做,但是onstart能做的事onCreate却未必适合做。如前文所说的,setContentView和资源初始化在两者都能做,然而想动画的初始化在onStart中做比较好。

2.onStart方法和onResume方法有什么区别?

(1)是否在前台。onStart方法中Activity可见但不在前台,不可交互,而在onResume中在前台,可交互。
(2)职责不同,onStart方法中主要还是进行初始化工作,而onResume方法,根据官方的建议,可以做开启动画和独占设备的操作。

3.onPause方法和onStop方法有什么区别?

(1)是否可见。onPause时Activity可见,onStop时Activity不可见,但Activity对象还在内存中。
(2)在系统内存不足的时候可能不会执行onStop方法,因此程序状态的保存、独占设备和动画的关闭、以及一些数据的保存最好在onPause中进行,但要注意不能太耗时。
(3)新Activity并不是百分百启动成功的,启动新Activity的过程中可能crash掉,这时旧Activity的onStop方法是不会调用的。

4.1Activity之间跳转生命周期流程

5.onNewIntent的生命周期

1、只对singleTop,singleTask,singleInstance有效,因为standard每次都是新建,所以不存在onNewIntent(后半句不绝对,standard存在onNewIntent场景);
2、只对startActivity有效,对于从Navigation切换回来的恢复无效,即从Navigation切换回来时不会调用onNewIntent;
3. 当调用到onNewIntent(intent)的时候,需要在onNewIntent(intent) 中使用setIntent(intent)赋值给Activity的Intent,否则,后续的getIntent()都是得到老的Intent。

Standard等4种启动模式

其实发现写写写 ,写到最后跟这篇博客基本上就是一回事了,就实在是懒得写了。这篇文章没有讲到Activity的FLAG,Activity的FLAG可参考这篇