27
2017
09

Activity生命周期再探

近期看到讲述Activity生命周期的帖子,秉着复习的精神,再来亲自探索下activity的生命周期,这次不只是看正常的启动和关闭流程,而是考虑更多其他的操作,比如锁屏,旋转等。测试平台红米Note4,系统版本Android6.0,国际惯例,先来一张经典图
官方Activity生命周期图
一般的流程是这样,启动一个activity
onCreate->onStart()->onResume,从准备视图到用户可见再到可获得焦点。
关闭一个activity
onPause()->onStop()->onDestory(),从视图焦点到不可见直到销毁
现在考虑这几种情况,
1.在当前界面启动了一个Dialog
这里写图片描述
看一下执行了什么
这里写图片描述
之前一直有误解,以为只要弹出来dialog就会执行onPause()方法,结果发现这次并没有触发,只是执行了onWindowFocusChanged(),关闭dialog也会再次执行onWindowFocusChanged()这个回调会在activity焦点发生变化的时候被调用,至于onPause()为什么没调用,再看另一个实验。
2.当前界面启动一个dialog风格的activity
准备启动的activity配置如下
这里写图片描述
看一下执行了什么方法
这里写图片描述
这次执行了onpause(),在API中onPause()调用会发生在启动一个新的activity,当前的activity准备进入后台
* Called as part of the activity lifecycle when an activity is going into
* the background, but has not (yet) been killed.

When activity B is launched in front of activity A, this callback will
* be invoked on A. B will not be created until A’s {@link #onPause} returns。
所以说并不是出现dialog就会触发onPause,而是启动一个dialog风格的activity才会触发,但是启动一个dialog会触发实验1的回调,说明窗口焦点发生了变化,但是并没有暂停前台的activity,关掉dialog风格的activity会触发
这里写图片描述

3.锁屏的生命周期,这次先放完整的调用,锁屏到恢复显示
这里写图片描述
锁屏触发了:onPause()->onStop()->onWindowFocusChanged()
恢复显示触发:onRestart()->onStart()->onResume()->onWindowChanged()

其实在这里我们可以发现,生命周期方法是成对存在的
onCreate()配对onDestroy()
onResume()配对onPause()
onStart()配对onStop()
每一对生命周期方法都是在做着相反的操作,一个创建一个销毁,一个获取焦点一个失去焦点,也可以看到每次焦点变化都会触发onWindowFocusChanged().

4.按Home键回到主屏幕
这里写图片描述
按Home触发:onWindowFocusChanged()->onPause()->onStop()
点击app图标回到app触发: onRestart()->onStart()->onResume()->onWindowFocusChanged()
结果发现和锁屏触发的周期很像,只是onWindowFocusChanged()方法调用的顺序有点不同

5.屏幕旋转
①竖屏转横屏
这里写图片描述
屏幕旋转我们发现会造成Activity被销毁重建,同时会发现onSavaeInstanceState()和onRestoreInstanceState()被调用,前者可以保存临时数据,比如当前activity中的控件ID和控件中的其他文本信息等,在重建activity的时候会调用后者重新将临时数据填充

②横屏转竖屏
和竖屏转横屏完全一样的调用

6.配置configChange属性后转屏
分3种设置
不设置configChange属性
android:configChanges=”orientation”
android:configChanges=”orientation|keyboardHidden”
事实发现3种情况触发的回调和上图一致。横转竖和竖转横都会执行上图的整个回调,发现并没有像其他博客写的触发onConfigChanged()方法,这是因为我们测试环境是6.0,在android3.2(API 13)之后,转屏会造成屏幕尺寸变化,试一试另一个配置
android:configChanges=”orientation|screenSize”
转屏调用
这里写图片描述
发现每次转屏都只会调用onConfigChanged()方法,并不会销毁activity,其实不只是转屏可以触发这个回调,语言,地区变化都可以触发这个。

7.配置screenOrientation属性

portrait表示设置为竖屏
landscape表示横屏
设置了这个属性,并且给定了方向,手机就不会发生转屏,一般在游戏中设定横屏,设置这个由于不会再出发转屏,所以如果同时设置了实验6的配置,那么onConfigChanged就不会触发

如有错误,欢迎指出!!!

上一篇:Android实例程序中Gallery报错:R.styleable unresolved解决办法 下一篇:阿里移动安全_验证码对抗之路及现有验证机制介绍