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


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对象。

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


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值