urlname
type
Post
password
SyncToConfluence
category
Android
date
May 30, 2024
slug
01HZ4TN0AK09BPCKXCXSRKYBZ6
icon
Button
catalog
summary
tags
Android
读书笔记
cover
Status
BusyTime
Status 1
status
Published
Activity 的生命周期
典型情况下的生命周期分析
在正常情况下,Activity 会经历如下生命周期:
- onCreate:
- 表示 Activity 正在被创建,这是生命周期的第一个方法。
- 在这个方法中,可以做一些初始化工作,比如调用
setContentView去加载界面布局资源、初始化 Activity 所需数据等。
- onRestart:
- 表示 Activity 正在重新启动。
- 当 Activity 从不可见重新变为可见状态时,
onRestart就会被调用。 - 这种情况一般是由于用户按 Home 键切换到桌面或者用户打开了一个新的 Activity,当前的 Activity 暂停(
onPause和onStop被执行),用户又回到这个 Activity 时发生。
- onStart:
- 表示 Activity 正在启动,即将开始,这时 Activity 已经可见了,但还无法和用户交互。
- onResume:
- 表示 Activity 已经可见并且出现在前台开始活动。
- 与
onStart的区别在于,onStart时 Activity 还在后台,而onResume时 Activity 已经显示到前台。
- onPause:
- 表示 Activity 正在停止,通常紧接着
onStop就会被调用。 - 在这种情况下,可以做一些数据存储或动画停止的工作,但要注意不能太耗时,因为这会影响到新 Activity 的显示,
onPause必须先执行完,新 Activity 的onResume才会执行。
- onStop:
- 表示 Activity 即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
- onDestroy:
- 表示 Activity 即将被销毁,这是 Activity 生命周期中的最后一个回调,在这里可以做一些回收工作和最终的资源释放。
异常情况下的生命周期分析
在异常情况下,Activity 可能由于系统资源变化或者内存不足被回收并重新创建。
- 资源相关的系统配置发生改变:
- 当设备的配置发生变化,比如屏幕旋转时,系统会销毁并重新创建 Activity。
- 此时系统会调用
onSaveInstanceState方法保存当前 Activity 的状态,在onStop之前调用。 - 在
onRestoreInstanceState中恢复保存的数据。
- 系统内存不足:
- 当系统内存不足时,系统会按照优先级杀死一些后台 Activity,并在后续通过
onSaveInstanceState和onRestoreInstanceState来恢复数据。 - 优先级从高到低为:
- 前台 Activity:正在和用户交互的 Activity,优先级最高。
- 可见但非前台 Activity:例如弹出对话框的 Activity。
- 后台 Activity:已经被暂停的 Activity,优先级最低。
总结
典型情况下,Activity 会依次经历
onCreate、onStart、onResume、onPause、onStop 和 onDestroy,这六个方法构成了 Activity 的生命周期。而在异常情况下,如系统配置变化或内存不足时,系统会额外调用 onSaveInstanceState 和 onRestoreInstanceState 来保存和恢复 Activity 的状态。IntentFilter 的匹配规则
IntentFilter 的匹配规则
IntentFilter 用于定义 Activity 可以响应的 Intent 类型,通过定义 IntentFilter,系统可以根据 Intent 的属性(如 action、category 和 data)来决定是否启动某个 Activity。
- Action 匹配:
- 每个 Intent 都包含一个 action,IntentFilter 可以包含一个或多个 action。
- 只有当 Intent 的 action 与 IntentFilter 中定义的 action 之一匹配时,才会继续匹配后续条件。
- Category 匹配:
- Intent 可以包含一个或多个 category,而 IntentFilter 也可以包含一个或多个 category。
- 匹配时,Intent 中的每个 category 都必须在 IntentFilter 中存在,才能算匹配成功。
- Data 匹配:
- Data 匹配包括 URI 和 MIME 类型。
- Intent 可以包含一个 URI 和一个 MIME 类型,IntentFilter 也可以包含多个 URI 和 MIME 类型。
- 匹配时,Intent 的 URI 和 MIME 类型必须与 IntentFilter 中定义的 URI 和 MIME 类型之一匹配,才算匹配成功。
示例
注意事项
Action 必须匹配
- IntentFilter 至少需要定义一个 action。
- Intent 的 action 必须与 IntentFilter 的 action 之一匹配,否则 Intent 将不会被该 IntentFilter 捕获。
注意: 定义多个 action 可以增加组件的灵活性,但也可能导致意外的行为。
Category 匹配是所有类别的逻辑“与”
- 匹配时,Intent 中的每个 category 都必须在 IntentFilter 中存在,才能算匹配成功。
- 这意味着,Intent 中定义的所有 category 必须与 IntentFilter 完全匹配,缺一不可。
注意: 常见的 category 包括
android.intent.category.DEFAULT,这是一个通用 category,通常需要包含在所有的 IntentFilter 中,除非你明确知道不需要。Data 匹配需要精确
Data 匹配包括 URI 和 MIME 类型。Intent 中的 data(URI 和 MIME 类型)必须与 IntentFilter 中定义的 data 之一匹配,才算匹配成功。
注意: Data 匹配时需要注意以下几点:
scheme、host、port和path的组合要匹配。
- MIME 类型的匹配需要注意通配符的使用,例如
image/*可以匹配所有图片类型。
使用通配符要小心
使用通配符可以增加 IntentFilter 的灵活性,但也可能导致过多的匹配,捕获到不期望的 Intent。例如,
<data android:mimeType="*/*" /> 会匹配所有 MIME 类型,这可能导致意外的结果。注意: 使用通配符时应尽量精确,以避免意外行为。
IntentFilter 的优先级
Android 系统在多个 IntentFilter 都匹配同一个 Intent 时,会根据以下规则确定优先级:
- Explicit Intent 优先:明确指定组件名称的 Intent(Explicit Intent)优先级最高。
- 多级匹配优先:匹配层级越多的 IntentFilter 优先级越高。例如,匹配了 action、category 和 data 的 IntentFilter 优先级高于只匹配了 action 的 IntentFilter。
- 最新安装的应用优先:如果存在多个同等优先级的 IntentFilter,最新安装的应用将会优先匹配。
注意: 避免在同一应用中定义过多可能相互冲突的 IntentFilter,以减少匹配时的混淆。
动态注册的 IntentFilter
- 通过代码动态注册的 IntentFilter(如使用
registerReceiver方法注册的广播接收器)只能接收显式的广播 Intent,即必须明确指定接收器。
- 动态注册的 IntentFilter 不会被系统缓存,生命周期受组件的生命周期限制。
注意: 动态注册的 IntentFilter 在组件销毁时应及时取消注册,避免内存泄漏。
不要滥用 IntentFilter
过多或不合理的 IntentFilter 可能导致应用行为不明确,增加调试难度。应根据实际需求合理设置 IntentFilter,确保其只匹配预期的 Intent。
注意: 在调试过程中,可以使用 adb 命令查看 Intent 传递情况,帮助定位和解决问题。
匹配规则总结
IntentFilter 的匹配规则是:首先匹配 action,其次匹配 category,最后匹配 data(URI 和 MIME 类型)。只有在三个条件都匹配时,系统才会认为 Intent 与 IntentFilter 匹配,从而启动相应的 Activity。
通过这些规则,开发者可以精确控制哪些 Intent 可以启动他们的 Activity,从而提高应用的灵活性和安全性。
- Author:CoderWdd
- URL:https://www.wuinsights.top//article/01HZ4TN0AK09BPCKXCXSRKYBZ6
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts