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 暂停(onPauseonStop 被执行),用户又回到这个 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,并在后续通过 onSaveInstanceStateonRestoreInstanceState 来恢复数据。
    • 优先级从高到低为:
      • 前台 Activity:正在和用户交互的 Activity,优先级最高。
      • 可见但非前台 Activity:例如弹出对话框的 Activity。
      • 后台 Activity:已经被暂停的 Activity,优先级最低。

总结

典型情况下,Activity 会依次经历 onCreateonStartonResumeonPauseonStoponDestroy,这六个方法构成了 Activity 的生命周期。而在异常情况下,如系统配置变化或内存不足时,系统会额外调用 onSaveInstanceStateonRestoreInstanceState 来保存和恢复 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 匹配时需要注意以下几点:
  • schemehostportpath 的组合要匹配。
  • 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,从而提高应用的灵活性和安全性。
OpenGL学习-基础概念Activity-启动模式、启动标志位、Task Affinity
Loading...