前言

Android在进行横竖屏切换、修改系统语言等操作后,Activty会被自动销毁并重建。这样可以便于应用重新获取mipmap、string等系统资源,从而实现设置修改。

如何避免Activity被自动销毁

如果不想让系统重新创建Activity,可以给Activity指定configChanges属性,并且在Activity中重写onConfigurationChanged方法进行一些自定义操作。例如,横竖屏、语言变化时不想重启Activity,可这样写:

<activity
    android:name=".Main2Activity"
    android:configChanges="locale|orientation|layoutDirection" />

configChanges属性

“mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
“mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
“locale“ 所在地区发生变化。
“touchscreen“ 触摸屏已经改变。(这不应该常发生。)
“keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。
“keyboardHidden“ 用户打开手机硬件键盘
“navigation“ 导航型发生了变化。(这不应该常发生。)
“orientation“ 设备旋转,横向显示和竖向显示模式切换。
“fontScale“ 全局字体大小缩放发生改变

注意事项

在过滤横竖屏切换设置时,Android 4.0之前,设置orientation即可,Android 4.0之后,除了设置orientation之外,你还必须设置ScreenSize

<!--4.0以下-->
android:configChanges="orientation"
<!--4.0以上-->
android:configChanges="orientation|screenSize"

如何在Activity被销毁时进行数据缓存

当某些业务场景必须要Activity重建时,需要对于页面当前数据、部分控件状态进行缓存,这样可以避免部分bug、优化用户体验。

Activity重建时,系统会在销毁前调用onSaveInstanceState方法(调用时序在onStop之前),在重建时调用onRestoreInstanceState方法恢复缓存数据。我们可以重写onRestoreInstanceState方法恢复数据,也可以在onCreate中使用savedInstanceState来恢复数据(需要对savedInstanceState判空)。

实例如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    Log.d(TAG, "onCreate: ");

    //恢复数据位置1(需要对savedInstanceState判空)
    if (null != savedInstanceState) {
        String string = savedInstanceState.getString("cache");
        Log.d(TAG, "onCreate: " + string);
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    //恢复数据位置2(官方推荐)
    String string = savedInstanceState.getString("cache");
    Log.d(TAG, "onRestoreInstanceState: " + string);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("cache", "Cicada");
}