异常情况下Activity数据的保存和恢复
2016-03-08 19:18
344 查看
异常情况下Activity数据的保存和恢复
如何保存和恢复数据
如何防止Activity重建
首先从这种情况下Activity的生命周期说起,当横竖屏切换时,Activity会被销毁,onPause,onStop,onDestory均会被调用,但是由于Activity是异常情况下终止的,所以系统会调用onSaveInstanceState方法对Activity的状态进行保存,该方法在onStop之前调用,与onPause没有既定的时序关系。当Activity被重新创建后,系统会调用onRestoreInstanceState,将之前onSaveInstanceState保存的数据Bundle传递给onRestoreInstanceState和onCreate方法,因此我们可以通过onRestoreInstanceState和onCreate方法判读Activity是否被重建了,如果被重建了,那么我们就可以取出之前保存的数据并进行恢复,onRestoreInstanceState的调用时机在onStart之后。需要注意的是:在正常情况下Activity的创建和销毁不会调用onSaveInstanceState和onRestoreInstanceState方法。
接下来我们看下使用方法:
我们只需要在onSaveInstanceState中保存需要存储的参数,然后再onRestoreInstanceState获取保存的数据并进行设置即可。
我们平时在重写onCreate方法时,会发现会有一个Bundle参数,如下所示:
这个参数其实和onRestoreInstanceState中的Bundle参数是一样的,不过需要我们自己进行判断,而onRestoreInstanceState如果Bundle为Null时则不会调用。因此我们也可以对onCreate方法的Bundle参数进行判断,当Bundle不为null时对数据进行恢复。
当有多个属性时,用|进行分隔。
虽然configChanges可以配置的选项有很多,但是我们使用比较多的有:
orientation:屏幕方向发生了改变,例如横竖屏切换;
locale:设备的本地位置发生了改变,例如切换了系统语言;
keyboard:键盘类型发生了改变,例如插入了外接键盘;
keyboardHidden:键盘的可访问性发生了改变,例如移除了外接键盘;
注意:如果当我们的minSdkVersion和targetSdkVersion有一个大于13时,为了防止旋转屏幕时Activity重启,我们还需要加上screenSize。
如何保存和恢复数据
如何防止Activity重建
异常情况下Activity数据的保存和恢复
如何保存和恢复数据
正常情况下Activity的生命周期比较简单,不再赘述,但是在某些情况下,例如横竖屏的切换,我们知道Activity会被销毁重建,这个时候用户可能已经填写了一些信息,当横竖屏切换时,如果不进行处理,填写的信息就会消失,这种情况下我们需要怎么处理呢?首先从这种情况下Activity的生命周期说起,当横竖屏切换时,Activity会被销毁,onPause,onStop,onDestory均会被调用,但是由于Activity是异常情况下终止的,所以系统会调用onSaveInstanceState方法对Activity的状态进行保存,该方法在onStop之前调用,与onPause没有既定的时序关系。当Activity被重新创建后,系统会调用onRestoreInstanceState,将之前onSaveInstanceState保存的数据Bundle传递给onRestoreInstanceState和onCreate方法,因此我们可以通过onRestoreInstanceState和onCreate方法判读Activity是否被重建了,如果被重建了,那么我们就可以取出之前保存的数据并进行恢复,onRestoreInstanceState的调用时机在onStart之后。需要注意的是:在正常情况下Activity的创建和销毁不会调用onSaveInstanceState和onRestoreInstanceState方法。
接下来我们看下使用方法:
@Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState, outPersistentState); outState.putString("editText",myEdit.getText().toString()); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState, persistentState); String str = savedInstanceState.getString("editText"); myEdit.setText(str); }
我们只需要在onSaveInstanceState中保存需要存储的参数,然后再onRestoreInstanceState获取保存的数据并进行设置即可。
我们平时在重写onCreate方法时,会发现会有一个Bundle参数,如下所示:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }
这个参数其实和onRestoreInstanceState中的Bundle参数是一样的,不过需要我们自己进行判断,而onRestoreInstanceState如果Bundle为Null时则不会调用。因此我们也可以对onCreate方法的Bundle参数进行判断,当Bundle不为null时对数据进行恢复。
如何防止Activity重建
不仅仅当屏幕方向切换时会重建Activity,当系统配置发生改变的时候Activity都会被重建,例如用户插入外接键盘,运营商改变,界面模式(例如开启夜间模式)等都会导致Activity重建。如果我们不希望当系统配置发生变化界面重建,那么我们需要在AndroidManifest.xml中对Activity的configChange属性进行配置。例如我们不希望屏幕旋转时重建,则需要如下设置:android:configChanges="orientation"
当有多个属性时,用|进行分隔。
虽然configChanges可以配置的选项有很多,但是我们使用比较多的有:
orientation:屏幕方向发生了改变,例如横竖屏切换;
locale:设备的本地位置发生了改变,例如切换了系统语言;
keyboard:键盘类型发生了改变,例如插入了外接键盘;
keyboardHidden:键盘的可访问性发生了改变,例如移除了外接键盘;
注意:如果当我们的minSdkVersion和targetSdkVersion有一个大于13时,为了防止旋转屏幕时Activity重启,我们还需要加上screenSize。
相关文章推荐
- 胡庆龙
- Android Bundle
- 作业2 个人项目-数组求和
- 就拿胖子说事
- 313. Super Ugly Number
- Redis应用场景
- ML2分层端口绑定技术在SDN开发中的应用(一)
- 通过JVM 参数 实现spring 应用的二进制代码与配置分离。
- 学期博客:学习进度条
- 作业2
- Codeforces 630N - Forecast
- 【HDU5638 BestCoder Round 74 (div1)C】【贪心 线段树or树套树or队列】Toposort n点m边删k边使得拓扑序最小
- docker 学习笔记3
- 项目--Firebug使用小结
- cd 切换当前目录至dirName
- ABAP 通过视图取数到内表函数
- BZOJ3052: [wc2013]糖果公园
- grep正则表达式
- 让CentOS能用yum自动安装rar和unrar
- 【一起学AngularJS】第四章、Angular模版技术