Android探索:全面分析Activity的生命周期IntentFilter匹配规则

本文主要是介绍Android探索:全面分析Activity的生命周期IntentFilter匹配规则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

全面分析Activity的生命周期&IntentFilter匹配规则

转载请注明出处: https://blog.csdn.net/sange77/article/details/79922503

引言
1、Activity 的启动流程
2、生命周期的两种情况
 2.1、正常情况
 2.2、异常情况
3、如何在系统配置发生改变后,让Activity不重建?
4、隐式调用的IntentFilter匹配规则
5、想一想

引言

Android四大应用组件之一的Activity,是我们开发时最常用、最重要的,它具有多种运行状态,可你了解这些状态是如何转换的吗?它们之间有着怎样的关系呢?本文就是对Activity 生命周期工作方式的全面阐述。

1、 Activity 的启动流程

首先我们先简单了解一下Activity 的启动流程:
Activity启动请求 ——> Instrumentation通过Binder ——> ActivityManagerService通过ActivityThread ——> 生命周期不同状态
(1) 首先Activity的启动请求会交给Instrumentation来处理,然后它再通过Binder(进程通讯机制)向AMS(ActivityManagerService)发送请求;
(2) AMS内部维护着一个ActivityStack,并负责栈内Activity的状态同步,AMS通过ActivityThread去同步Activity的状态,从而完成了生命周期方法的调用。

2、生命周期的两种情况

生命周期分两种情况:正常情况下和异常情况下,不同情况下的生命周期表现会发生变化。

2.1、正常情况

Activity的生命周期
正常情况下 如上图所示,Activity一般都会经历这七个状态方法,这里可以分为三组:
- Activity的创建与销毁
onCreate:表示正在创建Activity,可以做些初始化的工作,例如 设置加载的XML布局、初始化控件和数据等;
onDestroy:表示正在销毁Activity,可以做些资源的释放和回收工作。
- Activity的可见与不可见
onStart:这时Activity已经可见,但是在后台,我们还看不到;
onStop:这时Activity已经不可见,也是在后台,可以做些不太耗时的回收工作。
- Activity的前台与后台
onResume:表示Activity可见,并且在前台,可以看到了;
onPause:表示Activity可见,切换至后台,可以做些停止动画,存储数据等不耗时的工作,跳转Activity时只有onPause方法执行完毕后,新Activity的onResume方法才会执行,然后原Activity会紧接着会执行onStop。

注意:有一种特殊情况,如果新Activity是透明主题,那么就不会执行onStop。

2.2、异常情况
  • 情况1:资源相关的系统配置发生改变时,导致Activity被杀死并重新创建

    什么意思呢?比如当前的Activity处于竖屏状态下,这时突然旋转屏幕,由于系统配置发生变化,Activity默认会被销毁然后重建。在这种情况下,系统默认会调用onSaveInstanceState方法为我们保存当前Activity的视图结构,并在Activity重启后调用onRestoreInstanceState方法为我们恢复这些数据,比如文本框输入的数据。这两个方法只会在Activity异常终止的时候调用。

  • 情况2:资源内存不足时,导致低优先级的Activity被杀死
    这种情况 方法执行过程和情况1相同,Activity的优先级从高到低是:前台Activity > 可见但非前台Activity > 后台Activity

3、如何在系统配置发生改变后,让Activity不重建?

如果不想Activity不想被重建,可以给Activity配置configChanges属性,如:

<activity
    android:name=""android:configChanges="orientation | screenSize"
></activity>

注意:从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。因此,在开发针对 API 级别 13 或更高版本(正如 minSdkVersion 和 targetSdkVersion 属性中所声明)的应用时,若要避免由于设备方向改变而导致运行时重启,则除了 “orientation” 值以外,您还必须添加 “screenSize” 值。 也就是说,您必须声明 android:configChanges=”orientation|screenSize”。但是,如果您的应用面向 API 级别 12 或更低版本,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重启 Activity)。

多个值使用“|”分隔 例如,“locale|navigation|orientation”。

configChanges 配置参数说明

说明
“mcc”IMSI 移动国家/地区代码 (MCC) 发生了变化 - 检测到了 SIM 并更新了 MCC。
“mnc”IMSI 移动网络代码 (MNC) 发生了变化 - 检测到了 SIM 并更新了 MNC。
“locale”语言区域发生了变化 — 用户为文本选择了新的显示语言。
“touchscreen”触摸屏发生了变化。(这种情况通常永远不会发生。)
“keyboard”键盘类型发生了变化 — 例如,用户插入了一个外置键盘。
“keyboardHidden”键盘无障碍功能发生了变化 — 例如,用户显示了硬件键盘。
“navigation”导航类型(轨迹球/方向键)发生了变化。(这种情况通常永远不会发生。)
“screenLayout”屏幕布局发生了变化 — 这可能是由激活了其他显示方式所致。
“fontScale”字体缩放系数发生了变化 — 用户选择了新的全局字号。
“uiMode”用户界面模式发生了变化 — 这可能是因用户将设备放入桌面/车载基座或夜间模式发生变化所致。 此项为 API 级别 8 中新增配置。
“orientation”屏幕方向发生了变化 — 用户旋转了设备。如果您的应用面向 API 级别 13 或更高级别(按照 minSdkVersion 和 targetSdkVersion 属性所声明的级别),则还应声明 “screenSize” 配置,因为当设备在横向与纵向之间切换时,该配置也会发生变化。
“screenSize”当前可用屏幕尺寸发生了变化。它表示当前可用尺寸相对于当前纵横比的变化,因此会在用户在横向与纵向之间切换时发生变化。 不过,如果您的应用面向 API 级别 12 或更低级别,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重新启动 Activity)。此项为 API 级别 13 中新增配置。
“smallestScreenSize”物理屏幕尺寸发生了变化。它表示与方向无关的尺寸变化,因此只有在实际物理屏幕尺寸发生变化(如切换到外部显示器)时才会变化。 对此配置的变更对应于smallestWidth 配置的变化。 不过,如果您的应用面向 API 级别 12 或更低级别,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重新启动 Activity)。此项为 API 级别 13 中新增配置。
“layoutDirection”布局方向发生了变化。例如,从从左至右 (LTR) 更改为从右至左 (RTL)。 此项为 API 级别 17 中新增配置。

具体的configChanges选项配置 请参考官方文档

4、隐式调用的IntentFilter匹配规则

启动Activity有两种方式:显示调用和隐式调用。 一般我们用的最多的是显示调用,如:startActivity(Intent(this,A.class))。
使用起来比较简单。隐式调用要求Intent必须匹配IntentFilter中的过滤信息才可以成功启动Activity,过滤信息包含:action、category、data。下面针对它们分析。

1、action的匹配规则
action的匹配规则是Intent的action必须配置,且和过滤信息中的action完全匹配(大小写必须一致)。
2、category的匹配规则
Intent中的配不配置都可以,默认系统在调用startActivity或startActivityForResult的时候会为Intent加上“android.intent.category.DEFAULT”这个category,所以Intent中不配置,只要在intentFilter中配置“android.intent.category.DEFAULT”就可以匹配成功。如果intent中要配置category,数量可以不同,但必须是过滤信息中已存在的。
3、data的匹配规则
data和action的匹配规则类似,由两部分组成:mimeType(媒体类型)和URI。其中URI部分的schema默认值为content 和 file。

注意:IntentFilter匹配规则 对于Service和BroadcastReceiver规则一样,但系统建议Service使用显示调用来启动。

5、想一想

(1)dialog,fragment的工作方式又是怎样的呢?
(2)今后写Activity如何让它高效的运行?
我们明白了它的工作原理,才能更好的使用它!

致谢《Android开发艺术探索》

这篇关于Android探索:全面分析Activity的生命周期IntentFilter匹配规则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/303350

相关文章

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad