文章目录
Android之生命周期
前言
Android的生命周期算是安卓入门必要了解的东西,相信下面的生命周期图大家已经见过很多次了,具体每个方法是什么,就不细细的说了,挑着重点说一说.
注: 此图摘录Android开发艺术探索
1. Android的生命周期
按我的理解来说, onStart和onResume, onPause和onStop的区别如下:
onStart和onStop代表这个活动是否可见,而onResume和onPause代表这个这个活动是否可以与用户交互.
1.1正常情况下的生命周期
上图为正常情况下的生命周期,大致分为以下几种情况:
- 在刚打开一个活动时,它的生命周期为
- 在正常按下返回键之后,它的生命周期为onPause()------>onStop()------->onDestory()
- 如果进入一个活动后,通过按Home键的方式把程序放到后台,它的生命周期为onPause()------>onStop(),如果从后台再次打开,它的生命周期为---->onRestart()—>onStart()—>onResume().
- 当你进入一个活动后直接杀进程它的生命周期为onPause()------>onStop()-------->onDestory(),一般活动回调onDestory的条件是该Activity被弹出的任务栈.
其中onPause()------>onStop()这两个方法的调用时机是在杀进程前(在程序进入后台时回调) - 在Activity的生命周期中,onPause方法的执行不要消耗太长的时间
原因如下:
当Activity1启动了Activity2时,它们的生命周期输出如下:
Activity2会在Activity1的onPause方法执行完才会执行Activity2的oncreate方法,等Activity2可以与用户交互了Activity1才会执行它的onStop方法.
如果在Activity2通过返回键返回Activity1,同样的道理,不可以在Activity2中的onPause2方法中花费太长的时间,因为当我们返回后,生命周期如下:
所以如果在onPause方法中执行的程序太浪费时间,我们活动的跳转就会发生卡顿.非常影响用户的体验
- 当我们启动了Activity1,然后通过Activity1,启动了Activity2,这时直接杀进程,会从任务栈中依次走完每个活动的生命周期.
1.2异常情况下的生命周期-----onSaveInstanceState(Bundle outState)方法和onRestoreInstance(Bundle savedInstanceState)方法
上面分析了正常情况下的生命周期, 下面说一说异常情况下的,异常情况下一般有两种情况
- 资源相关的系统配置导致活动被杀死
- 系统内存不足导致系统资源被杀死
关于onSaveInstanceState和onRestoreInstanceState这两个方法的调用时机
onSaveInstanceState的调用时机:
- 操作后,Activity还在任务栈中,这时就会调用onSaveInstanceState方法,(比如startActivity了另一个活动或者按下home键)
- 导致出栈的操作不会调用该方法,比如按下了back键位或者执行了该活动的finish()方法.
onRestoreInstanceState方法的调用时机:
- 更换资源时,比如更换字体或者字体大小的时候
- 旋转屏幕的时候
- 当系统内存不足的时候,会优先杀死在后台运行的活动的所在进程,如果该进程被杀死了,用户同过后台再次进入APP,那么这时目标活动机会调用此方法来恢复数据
当没有OverRide这两个方法时,其实安卓会自动的帮助Activity保存和恢复数据,比如在用户在文本框中输入的文字,ListView的进度条等等.当你旋转屏幕时,虽然完成了活动的销毁与重建,但你会发现这些数据都在.
onSaveInstanceState在onStop()方法执行后调用,onRestoreInstanceState()方法在onStart()方法之后调用
总之,onSaveInstanceState(Bundle outState)方法的本质是往Bundle对象中存储数据,而onRestoreInstanceState(Bundle saveInstanceState)方法是使用Bundle对象中的数据.一般onCreate方法和onRestoreInstanceState方法都会得到这个Bundle对象,但是谷歌更加建议使用onRestoreInstanceState,因为只要onRestoreInstanceState被回调,Bundle实例必然不为null,而onCreate方法就不一定了,需要对这个Bundle对象做一个是否为null的判断.
在Android开发中,如果一个进程中没有四大组件在运行,那么这个进程极容易被回收,所以一些后台工作(非主线程中的操作),最好放在Service中进行,这样可以让进程有一些优先级,从而不被杀死.
1.3 Activity的 configChanges属性
从上面的内容可以知道,旋转屏幕时活动的生命周期会先onDestory然后重新onCreate. Android中也提供了制止这种recreate行为的操作. 需要在AndroidMainFest文件中给Activity标签内添加以下属性.
android:configChanges="orientation|screenSize">
orientation|screenSize被设施后,旋转屏幕后,活动也不会再recreate,并且onSaveInstanceState和onRestoreInstanceState方法将不会被系统回调,取而代之的是调用了onConfigurationChanged方法,并且可以通过该方法的参数去得到当前屏幕是横屏还是竖屏.
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Log.d("t", "onConfigurationChanged: " + "横屏");
} else {
Log.d("t", "onConfigurationChanged: " + "竖屏");
}
}
总而言之,Activity的configChanges属性的值的作用就是当标注的事件被触发时,将不会影响Activity的生命周期,并且会回调onConfigurationChanged(@NonNull Configuration newConfig) 方法.
除以上用法之外android:configChanges属性还有其他的值.常用的参数如下:
参数 | 作用 |
---|---|
locale | 切换了系统语言 |
orientation | 屏幕方向发生了改变,比如宣传了屏幕 |
keyboardHidden | 键盘的可访问性发生变化,比如用户吊起了键盘 |
keyboardHidden | 键盘的可访问性发生变化,比如用户吊起了键盘 |
screenSize | 屏幕尺寸发生改变,比如屏幕旋转,SDk版本大于13时,此参数才会导致Activity重建 |
smallestscreenSize | 物理屏幕尺寸发生改变,SDk版本大于13时,此参数才会导致Activity重建 |
**注:**screenSize代表的屏幕尺寸变化是逻辑上的改变,比如屏幕旋转之后,以前的长变成了宽, 宽变成了长.