Activity的生命周期和启动模式

一、Activity生命周期全面解析

1、典型情况下的生命周期分析

正常情况下Activity会经历以下生命周期:

  • (1)onCreate():表示Activity正在创建,这是生命周期的第一个方法,进行一些初始化操作,比如说加载界面布局资源、初始化Activity所需数据。

  • (2)onRestart():表示Activity正在重新启动。一般情况下,当前Activity从不可见变为可见状态时,此方法会被调用。这种情况一般是用户行为所导致。

  • (3)onStart():Activity正在被启动,此时可见(Activity已经显示出来了但是还是看不见)但是不能和用户交互。

  • (4)onResume():Activity可见且处于前台可以进行交互

  • (5)onPause():表示Activity正在停止,正常情况下onStop()方法会调用。特殊情况下,如果快速回到当前Activity,onResume()会被调用。此时可以做一些存储数据、停止动画等操作,但是不能太耗时。

  • (6)onStop():Activity即将停止,可以做一些稍微重量级的回收操作,同样不能太耗时。

  • (7)onDestroy():Activity即将被销毁,Activity最后的一个生命周期,可以做一些回收和最终资源释放。

    Activity声明周期和切换过程

特殊情况:

(1)针对一个特定的Activity,第一次启动会调用:onCrate() -> onStart() -> onResume()
(2)当用户打开新的Activity或者切换到桌面时,回调如下:onPause() -> onStop(),特殊情况,如果新打开的Activity是一个透明主题或者是对话框,则并不会调用onStop()
(3)当用户再次回到原Activity时,回调如下:onRestart() -> onStart() -> oonResume()
(4)当用户按back键回退时,回调如下:onPause() -> onStop() -> onDestory()
(5)当Activity被回收后再次打开,生命周期回调和(1)相同
从一个Activity跳转到另一个Activity生命周期:当前Activity生命周期会先onPause先执行,另一个的onResume后执行。

Activity启动流程简单理解

启动Activity的请求会由Instrumentation处理,然后通过Binder向AMS发请求,AMS内部维护了一个Activity栈并负责栈内Activity的状态同步,AMS通过ActivityThread去同步Activity状态,从而完成生命周期方法调用。

异常情况下的声明周期分析

1、资源相关的系统配置发生改变导致Activity被杀死并重新创建

默认情况下,如果Activity不做特殊处理,那么当系统配置发生改变之后Activity就会被销毁,并重新创建。

异常情况下,Activity重建过程

当系统配置发生改变后,Activity会被销毁,其onPause,onStop,onDestroy均会被调用,同时由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState方法来保存当前Activity状态,状态数据保存到Bundle对象中。这个方法调用时机是在onStop方法之前,和onPause方法没有既定的时序关系。onSaveInstanceState方法只有在Activity被异常终止的情况下调用。Activity被重建过后,系统会调用onRestoreInstanceState(),并且把onSaveInstanceState方法保存的Bundle对象作为参数传递给此方法和onCreate()方法,然后在判断Activity是否被重建了,如果重建了就取出数据并恢复。从时序上看onRestoreInstanceState方法会在onStart方法之后。

在onSaveInstanceState和onRestoreInstanceState方法中,系统自动做了一定的恢复工作。当Activity在异常情况下重新创建时,系统会默认保存当前Activity视图结构,并且在Activity重建过后恢复这些数据

保存和恢复View层次结构,系统工作流程:
  • 保存过程:Activity被意外终止时,Activity会调用onSaveInstanceState保存数据,然后Activity会委托window去保存数据,接着window再委托它上面的顶层容器去保存数据。顶层容器是一个ViewGroup,一般来说是一个DecorView,最后顶层容器会通知它的子元素来保存数据
  • 恢复过程:恢复数据时,可以在onRestorInstanceState或者在onCreate方法中(二者区别是onRestoreInstance方法一旦被调用,其参数Bundle,一定是有值的,不需要额外的判空;但是onCreate不行,需要进行判空),这两个方法任选一个进行数据恢复,但官方建议onRestoreInstanceState方法。

2、资源内存不足导致低优先级的Activity被杀死

数据存储和恢复和情况1一致。
Activity优先级,Activity按照优先级从高到低,可分为如下三种情况:
(1)前台Activity——正在和用户交互的Activity,优先级最高
(2)可见但非前台——Activity可见,但是位于后台不能交互
(3)后台Activity——已经暂停了Activity,比如执行了onStop,优先级最低

当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在进程,并通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。如果一个进程中没有四大组件在执行,那么这个进程就会很快被杀死。

如果配置了android:configChanges = "Orientation|ScreenSize"属性,那么就不需要系统重新创建Activity,而是配置过后,系统调用onConfigChange()方法,进行一个特殊的处理

configChanges的属性值

Activity启动模式

Activity栈(任务栈):一种先进后出的栈结构,进行交互的Activity位于任务栈栈顶,每按一下back键,就会有一个Activity出栈,直到栈为空时,系统就会回收这个栈

standard(标准模式)

系统默认模式。每启动一个Activity都会重新创建一个新的实例,不管这个实例是否存在。被创建的Activity生命周期符合正常情况下的生命周期。一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。谁启动这个Activity就会运行在启动它的Activity的任务栈中

singleTop(栈顶复用)

如果新启动的Activity的实例为任务栈的栈顶,那么就不会重新创建,同时他的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。需要注意的是,这个Activity的onCreate、onStart不会被系统调用,因为它并没有发生改变。如果新启动的Activity的实例不位于栈顶就会重新创建。

singleTask(栈内复用)

栈内复用是一种单例模式,只要新启动的Activity在任务栈中存在实例就不会创建直接使用,如果不是位于栈顶就会把这个实例上面的所有Activity实例全部出栈(默认的clearTop效果),同时回调onNewIntent方法
TaskAffinity参数:可翻译为任务相关性,标识了一个Activity所需要的任务栈名字,默认情况下都是应用的包名。这个属性主要和singleTask启动模式和allowTaskReparenting配对使用,在其他情况下没有任何意义。

singleInstance(单实例模式)

加强的singleTask,此种模式的Activity实例只能单独位于一个Activity栈中。

Activity的Flags,Activity常用标记位

  • FLAG_ACTIVITY_NEW_TASK:对应singleTask模式
  • FLAG_ACTIVITY_SINGLE_TOP:对应singleTop模式
  • FLAG_ACTIVITY_CLEAR_TOP:具有此标记位的Activity,当它启动时,在同一任务栈中所有位于它上面的Activity都要出栈。一般和singleTask配合使用
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有此标记的Activity不会出现在历史的Activity列表中,等同于XML中指定Activity的属性:android:excludeFromRecents= “true”

IntentFilter的匹配规则

IntentFilter的过滤信息有:action、category、data
为了匹配过滤列表,需要同时匹配过滤列表中的过滤信息,否则匹配失败。一个过滤列表的action、category、data可以有多个,所有的action、category、data构成不同类别,同一类别的信息共同约束当前类别的匹配过程。一个Activity的IntentFilter可以有过个,一个Intent只要匹配任何一组IntentFilter就能够启动Activity

1、action的匹配规则

action是一个字符串,系统预定义了一些action,同时我们也可以自定义action。action的匹配规则是Intent的action必须能够和IntentFilter中的action匹配(字符串值完全一样,需要区分大小写)。一个IntentFilter可以有多个action,只要匹配一个action都能匹配成功。如果intent中没有指定action,那么匹配失败

2、category匹配规则

category是一个字符串,系统预定义了一些category,我们也可以自定义。category匹配规则:要求Intent中如果含有category,那么所有的category都必须和IntentFilter中其中一个category相同。也就是,Intent中出现了category,不管有几个,对于每个category来说,它必须是IntentFilter中已经定义的category

3、data匹配规则

data匹配规则和action相似,如果IntentFilter中定义了data,那么Intent中必须定义可匹配的data,data使用mimeType指定媒体类型。

data语法

data由两部分组成:mimeType和URI。mimeType指定媒体类型,URI包含以下结构:

URI结构

  • scheme:URI模式,如果没有指定scheme,那么整个URI都无效
  • host:URI主机名,如果没有指定host,那么整个URI都无效
  • post:URI端口号,仅当URI制定了scheme和host参数时才有效
  • path、pathPattern和pathPrefix:这三个参数表示路径信息,path表示完整路径信息;pathParttern也表示完成的路径信息,但是它可以包含通配符“ * ”(表示0个或多个任意字符,需要注意的是,如果想表示真是的字符串则需要改成“\*,“\”则要写成“\\”);pathPrefix表示路径的前缀信息。

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题
图片

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值