Activity 生命周期两三事

典型情况下的生命周期

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” 值。

现在,当其中一个配置发生变化时,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()。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值