旋转屏幕时数据的保存与恢复

本章内容参考《Android开发艺术探索》


Activity重新创建:

当屏幕发生旋转的时候,系统会调用onSaveInstanceState为我们保存当前Activity的状态,这个方法的调用发生在onStop()方法之前,和onPause()没有准确的前后关系。当Activity被重建后会调用onRestoreInstanceState方法,将保存的数据传递进来,这个方法是在onStart之后。
在这个方法中,系统会自动帮助我们做一定的恢复工作,就是保存当前Activity的视图结构,所以我们要做的就是恢复数据。
这里保存视图结构涉及到了一个委托思想:Activity->Window->顶层容器(很可能是DectorView),然后顶层容器在通知子元素去保存数据。

这里写图片描述

@Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.e(TAG, "MainActivity-onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edit = (EditText) findViewById(R.id.edit);

    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        Log.e(TAG, "MainActivity-onSaveInstanceState");
        super.onSaveInstanceState(outState);
        outState.putString("extra_text", edit.getText().toString().trim());
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        Log.e(TAG, "MainActivity-onRestoreInstanceState");
        super.onRestoreInstanceState(savedInstanceState);
        test = savedInstanceState.getString("extra_text");
        if (test != null) {
            edit.setText(test);
        }
    }


在onSaveInstanceState中保存数据,然后在onCreate和onRestoreInstanceState中获取数据,但是在onRestoreInstanceState中获取数据比较好,不用再onCreate中去判断传来的Bundle是否为null,只要是调用了onRestoreInstanceState则一定是有值得。


如果不希望Activity重新创建,则需要在然后就会在AndroidManifest.xml中配置Activity:

<activity android:name="com.xiey94.aty.MainActivity" android:configChanges="orientation" >

然后回调Activity的onConfigurationChanged()方法。然而当我们在手机上调试的时候就会发现,其实并没有执行onConfigurationChanged()方法,依旧销毁当前Activity并创建新的Activity实例。

  Why?因为这个属性在低版本上是可以起作用。在android 4.0 以上不起作用,还要加上screenSize,即android:configChanges=”orientation|screenSize”,才能起效果 。

参考:Android疑难杂症之android:configChanges=”orientation” 无效


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值