前言
本文将从Activity生命周期涉及到的基本概念,如:返回栈,活动状态,活动的生存期以及异常情况下的生命周期分析等几个方面来分析。
目录
基本概念
1、返回栈
01 Android是使用任务来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈。
02 栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的活动,
它会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或调用finish()
方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动会重新处于栈顶的位置。
系统总是会显示处于栈顶的活动给用户。
复制代码
2、活动状态
每个活动在其生命周期中最多可以有4种状态:
01 运行状态
活动位于返回栈的栈顶。
02 暂停状态
活动不再位于返回栈栈顶,但依然可见。
03 停止状态
活动不再位于栈顶位置,并且完全不可见。
04 销毁状态
活动从返回栈中移除。
复制代码
3、活动的生存期
Activity中定义了7个回调方法,覆盖了活动生命周期的每一个环节。
01 onCreate();活动第一次被创建的时候调用。
02 onStart();活动由不可见变为可见的时候调用。
03 onResume();活动准备好和用户进行交互的时候调用。活动位于返回栈栈顶。
04 onPause();在系统准备去启动或者恢复另一个活动的时候调用。
可在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据。
这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
不能在onPause()中做重量级操作。
05 onStop();活动完全不可见的时候调用。
它和onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,
那么onPause()会得到执行,而onStop()并不会执行。
06 onDestroy();活动被销毁之前调用。
07 onRestart();活动由停止状态变为运行状态之前调用。
完整生存期:onCreate()--->onDestroy();
可见生存期:onStart()--->onStop();
前台生存期:onResume()--->onPause();
复制代码
异常情况下的生命周期分析
1、资源相关的系统配置发生改变导致Activity被杀死并重新创建
01 默认情况下,我们不对Activity做特殊处理的话,当系统配置发生改变后,
Activity就会被销毁并重新创建。
复制代码
02 Activity在异常终止的情况下,会调用onSaveInstanceState()来保存
当前Activity的状态(正常情况下系统不会回调这个方法)。
当Activity被重新创建后,系统会调用onRestoreInstanceState(),
并且把Activity销毁时onSaveInstanceState()保存的Bundle对象作为参数
同时传递给onRestoreInstanceState()和onCreate()。
从时序上来说,onSaveInstanceState()的调用时机是在onStop()之前,
onPause()没有既定的时序关系。onRestoreInstanceState()调用时机
是在onStart()之后。
03 例:旋转屏幕造成的Activity异常销毁
04 当系统配置发生改变后,Activity会被重新创建,有没有办法不重新创建呢?
如果系统配置发生改变后,我们不想重新创建Activity,可以给Activity指定
configChanges属性。比如不想让Activity在屏幕旋转的时候重新创建,就可以
给configChanges添加属性:
复制代码
android:configChanges="keyboardHidden|orientation|screenSize"
复制代码
此时系统会调用Activity的onConfigurationChanged(),我们就可以做一些我们自己的特殊处理了。
复制代码
@Override
public void onConfigurationChanged(Configuration newConfig){
super(onConfigurationChanged(newConfig));
Log.d(TAG,"onConfigurationChanged,newOrientation:"+newConfig.orientation);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
setContentView(R.layout.portrait_layout);
} else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
setContentView(R.layout.landscape_layout);
}
}
复制代码
优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。
复制代码
如果你想更加完全的掌控监听屏幕旋转变化,可以结合OrientationEventListener,自定义旋转监听设置:
private OrientationEventListener mOrientationListener;
mOrientationListener = new OrientationEventListener(this) {
@Override
public void onOrientationChanged(int rotation) {
if (((rotation >= 0) && (rotation <= 45)) || (rotation >= 315)||((rotation >= 135)&&(rotation <= 225))) {
//portrait
Log.d(TAG, "Screen orientation is Portrait!");
} else if (((rotation > 45) && (rotation < 135))||((rotation > 225) && (rotation < 315))) {
//landscape
Log.d(TAG, "Screen orientation is Landscape!");
}
}
};
mOrientationListener.enable();
复制代码
2、资源内存不足导致低优先级的Activity被杀死
01 Activity的优先级情况:从高到低
(1)前台Activity --- 正在和用户交互的Activity,优先级最高。
(2)可见但非前台 --- 比如Activity中弹出了一个对话框,导致Activity可见
但是位于后台无法和用户直接交互。
(3)后台Activity --- 已经被暂停的Activity,比如执行了onStop,优先级最低。
当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,
并在后续通过onSaveInstanceState()和onRestoreInstanceState()来存储和恢复数据。
复制代码