第一章:Activity的生命周期和启动模式
Activity是Android中四大组件之首,所以需要重视,尤其是启动方式,在AndroidManifest.xml中的注册信息
(一)Activity的生命周期
1.1.1 正常情况下的生命周期

说明
(1)针对一个特定的Activity,第一次启动顺序:onCreate->onStart->onResume.
(2)当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause->onStop
(3)返回原Activity时,回调如下:onRestart->onStart->onResume.
(4)当用户按back返回是,回调如下:onPause->onStop->onDestroy
*onStart和onStop是从Activity是否课件这个角度来回调的,二onResume和onPause是从Activity是否位于前台这个角度来回调
*Activity的启动涉及Instrumention,ActivityThread和ActivityManagerService(简称AMS).
启动Activity的请求会由Instrumention来处理,然后它通过Binder向AMS发请求,AMS内部维护这一个ActivityStack并负责栈内的Activity的状态同步,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用
(Android官方文档对onPause解释中,提醒不能再onPause中进行重量级的操作,因为必须onPause执行完之后新Activity才能Resume)
1.1.2 异常情况下的生命周期分析
(1)配置文件改变导致异常

说明:当系统配置发声改变后,Activity会被销毁,其onPause,onStop,onDestroy均会被调用,同时由于Activity是在异常情况下终止的,系统会调用onSaveInsatnceState来保存当前Activity的状态
(正常情况下是不会调用onSaveInsatnceState)
出现异常,系统的工作流程:Activity会调用onSaveInsatnceState去保存数据,然后Activity会委托Window去保存数据,接着Window再委托它上面的顶级容器去保存数据.
顶层容器是一个ViewGroup,一般来说它很可能是DecorView.最后顶级容器再去通知它的子元素来保存数据(委托思想,上层委托下层,容器委托子元素去处理事件)
(2)资源内存不足导致优先级低的Activity被杀死
解决方法:将后台工作放入Service中保证进程有一定的优先级,不会让系统杀死
*当配置文件改变时,Activity会重新创建,通过给activity指定configChanges属性.(哎AndroidMainfest.xml中加入声明)
*常用的三个选项:
- locale:设备的本地位置发生改变,一般指切换了系统语言
- orientation:屏幕方向发生了改变,这个是最常用的
- keyboardHidden:键盘的可访问性发生了改变,比如用户调出了键盘
1.2 Activity的启动模式
1.2.1 Activity的LaunchMode
- standard:标准模式,每次启动一个Activity都会重新建一个新的实例,不管这个实例是否已经存在
- singleTop:栈顶复用模式,如果新Activity已经位于任务站的栈顶,那么次Activity不会被重新创建,同时它的onNewIntent方法会被调用,通过此方法的参数我们可以去取当前请求的信息.
- singleTask:栈内复用模式,这是一种单实例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,和singleTop一样,系统也会调用其onNewIntent
- singleIntance:单实例模式,一种加强的singleTask模式,除了具有singleTask模式的所有特性,还具有此种模式的Activity只能单独地位于任务栈中,由于栈内复用的特性,后续的请求均不会创建新的Activity,除非这个任务栈被系统销毁
*Activity所需的任务栈,与TaskAffinity(任务相关性),这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有的Activity所需的任务栈的名字为应用的包名.
*可以为每个Activity都单独指定TaskAffinity属性,不同的名字代表不同的任务栈android:taskAffinity="属性值为字符串"
*任务栈分为前台任务栈和后台任务栈
*给Activity指定启动模式有如下两种方法:
- 在AndroidManifest.xml中通过android:launchMode="singleTask"
- 通过Intent中设定标志位为Activity指定启动模式
栗子:intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
*第一种的优先级比第二种的要高
1.2.2 Activity的Flags
列出常用的:
- FLAG_ACTIVITY_NEW_TASK:为Activity指定"singleTask"启动模式
- FLAG_ACTIVITY_SINGLE_TOP:指定"singleTop"启动模式
- FLAG_ACTIVITY_CLEAR_TOP:在同一个任务栈中所有位于它上面的Activity都要出栈
- FLAG_ACTIVIT_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity的列表中
1.3 IntentFilter的匹配规则
Activity的启动分为两种:显式调用和隐式调用.尽量使用隐式调用
显式调用:
需要明确地指定被启动对象的组件信息,包括包名和类名
隐式调用: 需Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,IntentFilter中的过滤信息有action,category,data
不需要明确指定组件信息
*一个Intent同时匹配action类型,category类型,data类型才算完全匹配,才能启动目标Activity,一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功启动对应的activity
匹配规则
- action的匹配规则
action的匹配要求Intent中的action存在且必须和过滤规则中的其中一个action相同.
2. category的匹配规则
Intent中可以没有category,如果有的话,每一个都需要能够和匹配过滤规则中的任何一个category相同.
*startActivity或者startActivityForResult的时候会默认为Intent加上"android.intent.category.DEFAULT"这个category
3. data的匹配规则
与action类似,如果过滤规则中定义了data,那么Intent中必须也要定义可匹配的data
data的语法:(由两部分组成,mimeType指的是媒体类型,和URI,结构:<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
<data android:scheme="string"
android:host="string"
port/path/pathPattern/pathPrefix/mimeType="string">
*栗子:在<intent-filter>中设定<data android:mimeType="image/*">匹配标签,那么Intent中的mimeType属性必须思维"image/*"才能匹配.
建议使用intent.setDatAndType,如果单独使用setData和setType,会互相清除对方的值
匹配栗子:
Intent intent = new Intent("");
intent.addCategory("");
intent.setDataAndType(Uri.parse(data), type);
startActivity(intent);
第一章:Activity的生命周期和启动模式的更多相关文章
- 《Android开发艺术探索》读书笔记 (1) 第1章 Activity的生命周期和启动模式
第1章 Activity的生命周期和启动模式 1.1 Activity生命周期全面分析 1.1.1 典型情况下生命周期分析(1)一般情况下,当当前Activity从不可见重新变为可见状态时,onRes ...
- Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式
Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...
- Android开发艺术探索(一)——Activity的生命周期和启动模式
Activity的生命周期和启动模式 生命周期有? 1.典型情况下的生命周期—>指有用户参与的情况下,Activity所经过的生命周期改变 2.异常情况下的生命周期—>指Activity被 ...
- Activity的生命周期和启动模式
Activity的生命周期分析 典型情况下的生命周期.是指在用户参与的情况下,Activity所经过的生命周期的改变. 异常情况下的生命周期.是指Activity被系统回收或者由于当前设备的Confi ...
- 一、Activity的生命周期和启动模式
1.Activity的生命周期 1.1.典型情况下的生命周期 在有用户参与的情况下,Activity所经过的生命周期的改变. Activity会经历如下生命周期: onCreate-onRestart ...
- 十分钟掌握Activity的生命周期与启动模式
1. Activity的生命周期 正常情况下的Activity生命周期如下图所示(来自Android Developer): 当资源相关的系统配置变更时(比如设备屏幕方向改变,键盘可见性变化),会导致 ...
- 第一章——Activity的生命周期
问题总结: 1.Activity完整的生命周期 2.当打开第二个Activity并关闭时候的生命周期. ①.解释为什么onPause()方法不要有耗时操作 3.Activity发生异常重启的时候问题: ...
- android activity的生命周期和启动模式
activity是android开发的基本中的基本每一个项目都会有activity.activity有自己的生命周期,在网上有很多博客和资料,在这里我也只是印证一下. 一个activity: 在打开a ...
- 复习篇(一)Activity的生命周期和启动模式
(一)关于<intent-filter>中的<data> 当设置<data>过滤器的时候,使用intent的时候必须要设置响应的匹配,否则无法匹配成功.不过不设置则 ...
随机推荐
- Android安全初学笔记
安全概述 安全主要解决4类问题 保密:不希望第三方窥探 鉴别:与你通信的人可以被确认 完整性:不能被随意篡改,或者能鉴别是否被篡改 不可否认性:能确认产生信息的人,并且产生该信息的人在何时都无法否认产 ...
- Beta冲刺<9/10>
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第九天(05.27) 作业正文 如下 其他参考文献 ... B ...
- 微服务配置中心 Apollo 源码解析——Admin 发送发布消息
内容参考:https://www.toutiao.com/a6643383570985386509/ 摘要: 原创出处http://www.iocoder.cn/Apollo/admin-server ...
- 在采用K8S之前您必须了解的5件事情
作者简介 Christopher Tozzi,自2008年来以自由职业者的身份对Linux.虚拟化.容器.数据存储及其相关主题进行报道. 时至今日,Kubernetes已然成为风靡一时的容器编排调度工 ...
- Vue数据更新页面没有更新问题总结
Vue数据更新页面没有更新问题总结 1. Vue无法检测实例别创建时不存在于data中的property 原因: 由于Vue会在初始化实例时对property执行getter/setter转化,所以p ...
- ASP.NET Core Blazor Webassembly 之 渐进式应用(PWA)
Blazor支持渐进式应用开发也就是PWA.使用PWA模式可以使得web应用有原生应用般的体验. 什么是PWA PWA应用是指那些使用指定技术和标准模式来开发的web应用,这将同时赋予它们web应用和 ...
- 深入理解RocketMQ(一)---阅读源码准备
本文主要描述使用Idea获取rocketMQ源码及源码的读取. 在演示搭建源码环境前,先简要描述一下RocketMQ的设计目标. 1.架构模式 和大多数消息中间件一样,采用的是发布订阅模式,基本组件包 ...
- egret的WebView实现
需求 在egret中嵌入网页,类似 . 网上大概有两种思路吧,一种是直接在body里面加入iframe,如:[Egret]里使用iframe标签达到内嵌多个web界面;另一种就是通过模仿htmlinp ...
- 深入探究ASP.NET Core异常处理中间件
前言 全局异常处理是我们编程过程中不可或缺的重要环节.有了全局异常处理机制给我们带来了很多便捷,首先我们不用满屏幕处理程序可能出现的异常,其次我们可以对异常进行统一的处理,比如收集异常信息或者 ...
- 一文说通MongoDB via Python操作
Python并不仅仅是一个做Machine Learning的语言. 说到Python,一般都会感觉它关联着ML,如果不是做ML开发,就会觉得离自己很远.而实际上,作为一门语言,Python在应用 ...