Android 的生命周期及启动模式

时间:2024-03-30 13:28:08

Android 的生命周期额启动模式

一、基础

Android 的生命周期主要包括七个方法,分别是:
1. onCreate:表示 Activity 正在创建,是生命周期中的第一个方法。在这个方法中可以做一些初始化的工作,如:加载布局界面,初始化数据。
2. onStart:表示 Activity 正在被启动,即将开始,则个收 Activity 已经可见,但是还未出现在前台,无法和用户交互。
3. onRestart:表示 Activity 正在重新启动,也就是当用户启动了一个不是透明主题的 Activity 后,又重新返回该 Activity 时就会调用此方法,然后调用 onResart。
4. onResume:表示 Activity 已经可见,出现在前台,可以与用户进行交互。
5. onPause:表示 Activity 正在停止,正常情况下,紧接着 onStop 就会被调用,这里可以做一些轻量级操作,不能做重量级的否则会影响到下一个 Activity 的显示。
6. onStop:表示 Activity 即将停止,可以做一些稍微重量级的工作,不能做耗时的工作。
7. onDestroy:表示 Activity 即将被销毁,这是生命周期中的最后一个回调方法,可以做一些回收和最终的资源释放。
基础的最后商使要上一张经典的生命周期图:
Android 的生命周期及启动模式

二、几种情况分析

正常的情况
  • 正常的:
    启动
    onCreate > onStart > onResume
    销毁
    onPause > onStop > onDerstoy

  • 打开新的正常的 Activity 然后再回来
    onPause > onStop > onRestart > onStart > onResume

  • 打开了一个透明主题的 Activity 然后再回来
    onPause > onResume

  • Activity 在后台是被系统杀死然后重启动
    onStop > onCreate > onStart > onResume

    为什么 Activity 再后台会被杀死?在内存不足的情况下系统会杀死按照优先级排序杀死优先级低的组件。

特殊的情况
  • 资源相关系统配置发生改变(主要是屏幕旋转和语言):
    onPause > onSaveInstanceState(可能在 onPause 之前之后) > onStop > onDestory > onCreate > onRestoreInstanceState
    再这里中情况下我们需要早 onSaveInstanceState 中对我们需要的数据进行保存,然后再 onRestoreInstanceState 方法中进行数据恢复。* 再清单文件中添加 configChanges 字段可以防止屏幕旋转造成 Activity 重新创建

问题 1 、当前 Activity A ,启动了另一个 Activity B 那么 B 的 onResume 和 A 的 onPause 哪一个先执行?
答:A 的 onPause 先执行,然后 B 的 onResume 再执行。

三、Activity 的启动模式

需要理解的点:什么是启动模式,为什么需要启动模式、什么是标志位

(一)启动模式
1、为什么需要启动模式

默认情况下启动新的 Activity 回创建新的实例,每次都是如此,而且都会进入回退栈进行管理,重复创建实例太傻,可以进行复用等其他使用模式。所以有了启动模式来对这一块进行利用。

2、四大启动模式
  • standard 标准模式:系统默认的模式,每次启动都会创建一个新的实例。那个 Activity 启动了它那么就在该 Activity 的栈中。

  • singleTop 栈顶复用模式:在这种模式下,新的 Activity 位于任务栈栈顶,那么此 Activity 不会被重新创建,而是调用 onNewIntent 方法,如果不在栈顶那么还是会新建一个 Activity 实例。

  • sinleTask 栈内复用:一种单实例模式,只要 Activity 在一个栈中存在,哪儿买多次启动次 Activity 都不会重新创建实例,会调用 onNewItent 方法。而位于该 Activity 栈之上的 Activity 都会直接被弹出销毁。

  • singleInstance 单实例模式:加强版的 sinleTask ,拥有 sinleTask 的特性,且自能单独的位于一个任务栈中。也就是系统会为其建一个新的任务栈,让其运行在其中。

3、TaskAffinity 任务相关性

这个属性可以指定 Activity 运行的任务栈,值为一个字符串,Activity 默认的任务栈是应用的包名。
* allowTaskReparenting * 该属性通常与 TaskAffinity 配合使用,可以指定该 Activity 启动时是否可以重新排列任务栈的目录,也就是可以将该 Activity 的任务栈排到系统任务栈中,当该栈的 Activity 全部退出以后就会直接到系统的桌面,如:A \ B 两个应用,A 启动了 B 的一个 Activity C 那么这时按下会返回键会直接回到系统桌面。我得理解是如果一个 Activity 指定了属性 * allowTaskReparenting * 那么在再次启动(也就是之前启动了,没有销毁被在位于后台了)时,会将其所在任务栈位于其之上得所有 Activity 全部弹出销毁。

4、Flags Activity 的标记位

Activity 的标志位可以设定 Activity 的启动模式、运行状态等,关于这块不是很清除,《Android 开发艺术探索》一书也未详解,使用时可以取查阅官方文档。

总结:Activity 的生命周期还是比较简单的,稍微难点的是几种不一样的情况,如:系统相关配置改变导致 Activity 生命周期改变、Activity 被系统杀死 、以及 Dialog 的弹出和以 startActivityForResult 方式启动 Activity 。
四种启动模式单个的理解也是比较简单的,稍微困难的就是 singleTask 配合 TaskAffinity 与 allowTaskRepareting 一起使用,关于这一点我建议大家大一多注意平时使用微信和支付宝时候的体验,在分享和调用支付应用支付方面是最好的例子。