Activity 生命周期详解

Activity的生命周期

Activity的重要性,可以说Activity是app的基石,一个应用必不可缺少的组件,提供与用户交互的可视化界面。既然Activity这么重要我们来深入了解下Activity相关知识Activity的生命周期。

Activity的生命周期可以分为两部分内容

  1. 典型的生命周期
  2. 异常的生命的周期

典型的生命周期

典型的生命周期会走完整个生命周期的方法

这里写图片描述

盗图一张

方法说明
onCreate表示生命周期正在创建,是生命周期的第一个方法,主要做一些初始化的操作比如加载布局文件初始化布局文件中的View
onRestart标识生命周期正在启动,一般当Activity从不可见的到可见的时候调用,比如按Home键盘或者跳转到其他Activity的就会到暂停状态,生命周期的onPause和onStop就会被调用,当重新回到之前的Activity就会调用此生命周期的方法
onStartActivity正在被启动,这时候处于可见了,但是还没展现在前台
onResumeActivity处于可见状态,已经展现到前台且可以和用户进行交互了
onPauseActivity正在停止,当前Activity的onpause方法执行完之后才会执行要启动Activity的onResume方法,所以此方法不能做耗时操作,只能做一些轻量的操作比如:数据存储和动画停止等
onStop表示Activity即将停止,同样不能做耗时操作,比onPasuse稍微松一点
onDestoryActivity即将被销毁,主要做一些释放资源的事情

1.我们先来分析Activity启动过程中所调用的生命周期方法

onCreate--->OnStart--->onResume

2.,按Home键回到主屏

onPause---->onStop

3.当我们点击Home键回到主界面后,再次点击App回到Activity时

onRestart--->onStart--->onResume

4.当我们跳转到新的Activity的时候

onPause(A)-->onCreate(B)--->onStart(B)---->onResume(B)---->onStop(A)

当前一个Activity执行onPause之后才会执行另外一个的Activity的生命周期方法,所以onPause中不能执行耗时操作

5.当按back键

onPause-->onStop--->onDestory

异常的生命周期

什么情况下是异常的呢?我的理解有两种原因
1.相关的系统配置发生改变导致Activity被杀死并重新创建比如:横竖屏
当横竖屏切换的时候生命周期为
正常启动

onCreate-->onStart-->onResume

横竖屏切换的时候

onPasue-->onSaveInstanceState--->onStop-->onDestory--重新启动-->onCrete-->onStart
-->onRestoreInstanceState--->onResume

onSaveInstanceState:保存当前Activity的状态信息,因此我们可以在onSaveInstanceState方法中存储一些数据以便Activity重建之后可以恢复这些数据,当然这个方法的调用时机必须在onStop方法之前,也就是Activity停止之前。至跟onPause方法的调用时机可以随意

onRestoreInstanceState:把Activity销毁时通过onSaveInstanceState方法保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法,因此我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重新创建,倘若被重建了,我们就可以对之前的数据进行恢复。上边分析,我们可以看出onRestoreInstanceState方法的调用时机是在onStart之后的

注意:
onSaveInstanceState和onRestoreInstanceState只有在Activity异常终止时才会被调用的,正常情况是不会调用这两个方法的。

问题一:onRestoreInstanceState和onCreate方法都可以进行数据恢复,那个比较好?

onRestoreInstanceState:方法如果走了,那就是Activity一定异常终止过,不用判断直接进行数据回复。在onCreate执行之后

onCreate 是数据恢复之前就需要判断Activity是否异常终止过,判断Bundle参数是否为空

当系统配置发生变化的时候就会Activity的生命周期就会重走,那有什么办法避免生命周期重走?

只要在Activity配置上 android:congigChange="orientation" 就可以避免当系统配置发生变化的时候,Activity生命周期重走。如果需要设置多个值的话需要用|隔开

图表为configChange的定义

项目含义
mccSIM卡唯一标识IMSI(国际移动用户标识码)中的国家代码,由三位数字组成,中国为:460 这里标识mcc代码发生了改变
mncSIM卡唯一标识IMSI(国际移动用户标识码)中的运营商代码,有两位数字组成,中国移动TD系统为00,中国联通为01,电信为03,此项标识mnc发生了改变
locale设备的本地位置发生了改变,一般指的是切换了系统语言
touchscreen触摸屏发生了改变
keyboard键盘类型发生了改变,比如用户使用了外接键盘
keyboardHidden键盘的可访问性发生了改变,比如用户调出了键盘
navigation系统导航方式发生了改变
screenLayout屏幕布局发生了改变,很可能是用户激活了另外一个显示设备
fontScale系统字体缩放比例发生了改变,比如用户选择了个新的字号
uiMode用户界面模式发生了改变,比如开启夜间模式-API8新添加
orientation屏幕方向发生改变,比如旋转了手机屏幕
screenSize当屏幕尺寸信息发生改变(当编译选项中的minSdkVersion和targeSdkVersion均低于13时不会导致Activity重启)-API13新添加
smallestScreenSize设备的物理屏幕尺寸发生改变,这个和屏幕方向没关系,比如切换到外部显示设备-API13新添加
layoutDirection当布局方向发生改变的时候,正常情况下无法修改布局的layoutDirection的属性-API17新添加

2.内存不足导致低优先级的Activity被杀死
在内存不足的时候,Acitivity走的生命周期和系统配置是一样的,这里不能特意的去浮现。但是我们要知道什么情况下Acticity容易被杀死简单了解下。当系统内存不足的时候,系统就会按照一定的优先级去杀死目标Acitivity的进程来回收内存,所以为了Activity所在进程尽量不被杀死,我们应该尽量让其保持高的优先级。

首先了解5中进程(优先级逐渐降低)

1. Foreground Processes(前台进程)

简单说就是处于栈顶正与用户交互的Activity或者被这个Activity绑定Server,在或者说处于活动状态的Activity,更直接的说就是生命周期执行了onResume方法,但是没执行onPause,这种情况下,几乎是不会被系统回收的,除非你的手机简直是个例外。

2. Visible Processes(可视进程)
知道前台进程之后,可视进程也很好理解,那就是当前Activity处于可见状态但是不能和用户进行交互。简单说当Activity失去焦点时,或被一个新的非全屏的Activity,或被一个透明的Activity放置在栈顶时,Activity就转化为Paused状态

3. Service Processes(服务进程)
如果你的进程不属于以上两种类别,而你有一个启动的服务(started service),那么它被看作是一个服务进程。对于许多在后台做处理(如加载数据)而没有立即成为前台服务的应用都属于这种情况。

4. Background Processes(后台进程)

Activity 一开始是前台 Activity,但是用户点了 home 键导致 onStop() 方法被调用。假设你之前一直是高优先级进程类别,这时你的进程将变为后台进程类别

5. Empty Processes(空进程)

在任何层次中,空进程都是最低优先级的。如果不属于以上类别,那它就是这种。这里没有活跃的组件,只是出于缓存的目的而被保留(为了更加有效地使用内存而不是完全释放掉),只要 Android 需要可以随时杀掉它们

参考资料
Android开发艺术探索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值