android设备设置改变时的数据保留和恢复

来源:互联网 发布:广电网络机顶盒安装app 编辑:程序博客网 时间:2024/05/22 11:39


1.利用其生命周期

如在onPause()中可以做一些储存数据,停止动画等工作,但是注意不能太耗时,因为这会影响到新Activity的显示,onPause必须先执行完,新的Activity才会启动(新的Activity的onResume才会执行)。

2.onSaveInstanceState(...)和onRestoreInstanceState(...)

onSaveInstanceState()的调用时机是在onStop()之前,但既可能在onPause()之前,也可能在onPause()之后。

onSaveInstanceState(...)只会在Activity被异常终止的情况下被回调,正常情况下系统不会回调这个方法。

每个View都有onSaveInstanceState和onRestoreInstanceState方法,系统会在activity被异常终止和恢复activity现场时自动恢复View组件的数据

当activity被重新创建时,onSaveInstanceState所保存的Bundle对象会作为参数同时传递给onRestoreInstanceState和onCreate方法。onRestoreInstanceState方法中获取到的Bundle对象一定是有值的,而onCreate中获取到的Bundle对象则要进行非空判断。

3.系统配置发生改变时数据的恢复

当系统配置,比如系统语言的变化,系统字体的缩放比例的变化,或者屏幕的横竖屏发生改变时,activity会被销毁并重新创建。

(1) 以下为解决因屏幕旋转而导致的Activity重建的问题:

禁止旋转屏幕,即指定当前Activity的屏幕方向,在AndroidManifest.xml中的activity中指定属性

android:screenOrientation="portrait"
在Activity中添加configChanges属性并指定orientation这个值

android:configChanges="orientation|screenSize|keyboardHidden"
多个值可用|连接。其中orientation表示屏幕方向的改变,screenSize表示屏幕的尺寸信息发生了改变,当编译选项的中的minSdkVersion或者targetSdkVersion中有一个的值大于13时,必须指定此项,keyboardHidden表示键盘的可访问性发生了改变,如用户调出了键盘。

另外还可以在activity中重写onConfigurationChanged(...)方法,如:

 @Override    public void onConfigurationChanged(Configuration newConfig) {        super.onConfigurationChanged(newConfig);        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {            Log.i("Screen_orientation", "LANDSCAPE");        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {            Log.i("Screen_orientation", "PORTRAIT");        }    }

(2)已被舍弃的方法,onRetainNonConfigurationInstance()

(3)通过设置activity内部的fragment方法,保留fragment对象

如果是以Activity托管Fragment的方式,可以通过调用Fragment的setRetainInstance(true)方法设置Fragment的属性,从而实现在系统配置发生改变以及Activity对象被销毁和重建时保留Fragment对象。

@Overridepublic void onCreate(Bundle saveInstanceState) {super.onCreate(onSavedInstanceState);setRetainInstanceState(true);}
但是使用此方法,需记住,只有当activity因设备发生改变被销毁时fragment才会短时间处于被保留状态,如果activity是因操作系统需要回收内存而被销毁,则所有被保留的fragment也会被随之销毁。


1 0