第1章 Activity 的生命周期和启动模式
1.1 Activity 的生命周期全面分析
- 典型情况下生命周期
- 异常情况下生命周期:Activity 被系统回收、当前 Configuration 发生改变导致 Activity 被销毁重建。
1.1.1 典型情况下的生命周期分析
- onCreate:正在被创建,初始化工作。
- onRestart:正在重新启动,Activity 从不可见变为可见。
- onStart:正在被启动,Activity 已经可见,还没有出现在前台,无法与用户交互。
- onResume:已经可见,可以交互。
- onPause:正在停止,存储数据、停止动画等操作,不能太耗时,onPause 必须执行完,新的 Activity 的 OnResume 才会执行。
- onStop:即将停止,稍微重量级的回收工作,但不能太耗时。
- onDestroy:即将被销毁,回收工作和最终资源释放。
- onStart 和 onStop 是从 Activity 是否可见的角度
- onResume 和 onPause 是从 Activity 是否位于前台的角度
- 一个 Activity 启动另一个 Activity 时候,旧 Activity 先 onPause ,然后新 Activity 再启动。
1.1.2 异常情况下的生命周期分析
- 资源相关的系统配置发生改变导致 Activity 被杀死并重新创建(系统配置)
1.onSaveInstanceState 调用在 onStop 之前,和 onPause 没有固定顺序
2.onRestoreInstanceState 调用在 onStart 之后
3.Activity -> Window -> ViewGroup(DecorView) -> 通知子元素
4.系统能够自动做一些 View 层级结构方面的数据存储和恢复
5.onRestoreInstanceState 一旦被调用,Bundle 一定有值,onCreate 不一定
6.系统异常终止才会调用 onSaveInstanceState 和 onRestoreInstanceState 方法
- 资源内存不足导致低优先级的 Activity 被杀死(内存不足)
1.优先级:前台 Activity 、 可见但非前台 Activity 、 后台 Activity
- android:configChanges
1.不重新创建 Activity
2.locale、orientation、keyboardHidden 常用三个选项
3.onConfigurationChanged()
1.2 Activity 的启动模式
- standard:标准模式
- singleTop:栈顶复用模式、如果在栈顶调用 onNewIntent()
- singleTask:栈内复用模式、onNewIntent、默认有 clearTop 效果
- singleInstance:单实例模式、单独一个栈中
- Activity 所需任务栈:TaskAffinity
- 任务栈:前台任务栈、后台任务栈
- 方式
1.activity:launchMode -> 优先级低 无法设置 FLAG_ACTIVITY_CLEAR_TOP
2.intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 无法设置 singleInstance
1.2.2 Activity 的 Flags
- FLAG_ACTIVITY_NEW_TASK:singleTask
- FLAG_ACTIVITY_SINGLE_TOP:singleTop
- FLAG_ACTIVITY_CLEAR_TOP:配合 FLAG_ACTIVITY_NEW_TASK 使用
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:android:excludeFromRecents=“true” 不会出现在 Activity 列表中
1.3 IntentFilter 的匹配规则
- 一个 Activity 中可以有多个 intent-filter,匹配一组,则启动成功
- Activity 启动方式
1.显式调用
2.隐式调用:配合 IntentFilter(action 必须一样、category 一旦有必须相同、data(mimeType、scheme) 必须一样)
3.setDataAndType(指定完整的 data 必须使用这个,不能使用 setData、setType)
4.使用 PM 的 queryIntentActivity 或 resolveActivity 判断匹配信息 flag:MATCH_DEFAULT_ONLY
- 匹配规则
1.action
action是一个字符串,匹配是指与action的字符串完全一样,区分大小写。
一个intent-filter可以有多个aciton,只要Intent中的action能够和任何一个action相同即可成功匹配。Intent中如果没有指定action,那么匹配失败。
2.category
category是一个字符串。Intent可以没有category,但是如果你一旦有category,不管有几个,每个都必须与intent-filter中的其中一个category相同。系统在 startActivity 和 startActivityForResult 的时候,会默认为Intent加上 android.intent.category.DEFAULT 这个category,所以为了我们的activity能够接收隐式调用,就必须在intent-filter中加上 android.intent.category.DEFAULT 这个category。
3.data
data的匹配规则与action一样,如果intent-filter中定义了data,那么Intent中必须要定义可匹配的data。由两部分组成:mimeType和URI。mimeType是指媒体类型,比如
image/jpeg、audio/mpeg4-generic和video/等,可以表示图片、文本、视频等不同的媒体格式。