【android面试】一个知识点-Activity的生命周期

Activity的生命周期

特殊的生命周期执行路径,一般分两种,一种屏幕发生旋转。一种,configration发生了变化,例如:

先来看,屏幕旋转发生变化:

屏幕旋转,Activity一定会销毁后,重新实例化。这里,activity会走这样的流程:

ActivityActivity
⬇️⬇️
发生意外情况(例如屏幕旋转)
⬇️⬇️
onSaveInstanceState()(重新创建)-> onCreate()
⬇️⬇️
onDestroy()onRestoreInstanceState()

流程1 屏幕发生旋转,activity的生命周期的变化

不信看log,代码中,仅仅打印了 onCreate, onStart, onResume, onRestoreInstanceState, onSaveInstanceState, onStop, onDestroy这几个方法:

日志-1

06-29 22:18:20.931   I/--act: onCreate -->graphic.com.texiao.lifecycle.LifeCycleActivity@545c35c
06-29 22:18:20.948   I/--act: onResume -->graphic.com.texiao.lifecycle.LifeCycleActivity@545c35c
06-29 22:18:25.254   I/--act: onPause -->graphic.com.texiao.lifecycle.LifeCycleActivity@545c35c
06-29 22:18:25.254   I/--act: onSaveInstanceState -->graphic.com.texiao.lifecycle.LifeCycleActivity@545c35c
06-29 22:18:25.254   I/--act: onStop -->graphic.com.texiao.lifecycle.LifeCycleActivity@545c35c
06-29 22:18:25.254   I/--act: onDestroy -->graphic.com.texiao.lifecycle.LifeCycleActivity@545c35c
06-29 22:18:25.301   I/--act: onCreate -->graphic.com.texiao.lifecycle.LifeCycleActivity@62ffd1d
06-29 22:18:25.305   I/--act: onRestoreInstanceState -->
06-29 22:18:25.305   I/--act: onResume -->graphic.com.texiao.lifecycle.LifeCycleActivity@62ffd1d

上面这段日志,展示了,activity从启动,到屏幕发生旋转后的日志。可以看到首先,出现2个activity实例:

  • LifeCycleActivity@545c35c
  • LifeCycleActivity@62ffd1d

其次,执行了 onSaveInstanceState, onRestoreInstanceState

注意:

  • onSaveInstanceStateonPause 之后执行。这点要注意。
  • 视图控件,也有 onSaveInstanceState方法,并且会被调用。所以数据得以保存。

加上configChange配置

系统的配置参数发生变化,也会调用Activity的生命周期方法:onConfigChanged()
屏幕旋转时,方向,屏幕尺寸这两个值会发生变化。如果不希望 旋转时,actvity重建,可以在 manifest的该activity中设置:

android:configChanges="orientation"

如此,activity就不会重建。

配置参数有非常多种,我们常用的是 locale, orientation, keyboardHidden, screenSize, smallScreenSize。

  • screenSize - 根targetSdkVersion有关,sdkVersion 在13以下屏幕旋转,会变化,13以上就不变了
  • smallScreenSize - 和 screenSize类似。

下面,我加上android:configChanges=“orientation|screenSize”,再看看打印的log:

日志-2

06-29 23:02:45.187  I/--act: onCreate -->graphic.com.texiao.lifecycle.LifeCycleActivity@fb489e7
06-29 23:02:45.195   I/--act: onResume -->graphic.com.texiao.lifecycle.LifeCycleActivity@fb489e7

其实,我旋转了2次,什么都没执行。
接着,我要给activity加上一个方法: onConfigChanges():

override fun onConfigurationChanged(newConfig: Configuration?) {
    super.onConfigurationChanged(newConfig)
    Log.i("--act","onConfigurationChanged->" + this@LifeCycleActivity)
}

然后,再旋转一下屏幕,看看发生了什么?

日志-3

06-29 23:07:18.765 I/--act: onCreate -->graphic.com.texiao.lifecycle.LifeCycleActivity@fb489e7
06-29 23:07:18.776 I/--act: onResume -->graphic.com.texiao.lifecycle.LifeCycleActivity@fb489e7
06-29 23:07:21.413 I/--act: onConfigurationChanged->graphic.com.texiao.lifecycle.LifeCycleActivity@fb489e7

嗯,onConfigurationChanged方法被执行了。

总结一下:

所以总结一下,就是:

  1. 没有设置 configChanges = "orientation|screenSize"时:

从创建activity,屏幕旋转操作,会重建activity,执行方法 onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onRestoreInstanceState -> onResume ,参考日志-1

  1. 设置 configChanges = "orientation|screenSize"时:
    从创建activity,屏幕旋转,不会重建activity,执行方法: onCreate -> onResume -> onConfigrationChanged重复执行。参考日志-2日志-3

上面一段,基本参考任玉刚的《Android 开发艺术探索》一书自己写代码验证了一把。最后表扬一下:玉刚写书确实真牛逼。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值