典型情况下的生命周期
Activity生命周期基本切换过程,如图
需要说明的是:
1、当用户再次回到原 Activity 时,回调如下:onRestart -> onStart -> onResume
2、从Activity A 启动 Activity B,如果 B 是透明主题,A 的 onStop 不会回调
场景:假设当前Activity为A,如果这时用户打开一个新Activity B,那么B的onResume和A的onPause哪个先执行呢?
执行顺序如下:
A: onPause -> B: onCreate -> B: onStart -> B: onResume -> A: onStop
onPause和onStop都不能执行耗时操作,尤其是onPause,这也意味着,我们应当尽量在onStop中做操作,从而使得新Activity尽快显示出来并切换到前台
异常情况下的生命周期
场景:资源相关的系统配置发生改变导致Activity被杀死并重新创建(如横竖屏切换)
onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onRestoreIntanceState
指定在某些配置改变时 Activity 不重建
我们可以在 AndroidManifest.xml 中配置 android:configChanges 来指定该 Activity 在哪些系统配置改变时不重新建立。
配置项很多,常用的是这四个:
android:configChanges="screenSize|orientation|keyboardHidden|locale"
screenSize|orientation 指的是在屏幕旋转和尺寸改变时不重新创建
keyboardHidden 指的是可用键盘的改变
locale 指的是系统语言切换
注意:
从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。
因此,在开发针对 API 级别 13 或更高版本(正如 minSdkVersion 和 targetSdkVersion 属性中所声明)的应用时,若要避免由于设备方向改变而导致运行时重启,则除了 “orientation” 值以外,您还必须添加 “screenSize” 值。
从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。
因此,在开发针对 API 级别 13 或更高版本(正如 minSdkVersion 和 targetSdkVersion 属性中所声明)的应用时,若要避免由于设备方向改变而导致运行时重启,则除了 “orientation” 值以外,您还必须添加 “screenSize” 值。
现在,当其中一个配置发生变化时,Activity 不会重启。相反,Activity 会调用 onConfigurationChanged()方法,并且向此方法传递 Configuration 对象,这个对象代表当前所有配置,你可以根据不同配置进行不同的处理:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
如果在配置改变时仍使用旧的状态,则可以不实现 onConfigurationChanged()。