美文网首页
Android修改系统设置后Activity被重新创建

Android修改系统设置后Activity被重新创建

作者: 寒_蝉 | 来源:发表于2019-05-13 00:31 被阅读0次

    前言

    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");
    }
    

    相关文章

      网友评论

          本文标题:Android修改系统设置后Activity被重新创建

          本文链接:https://www.haomeiwen.com/subject/rrlkaqtx.html