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

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me