系统配置发生变更时 activity状态保持

系统配置发生变更时,系统会 (重启 activity 对象 )

1、销毁原来的activity对象

2、重新创建 activity对象,初始化布局参数

1、限定屏幕方向
通常最容易遇到的系统配置发生变更,就是屏幕方向发生变化,可以通过限定屏幕方向来解决activity重启

在activity标签中添加screenOrientation属性  

android:screenOrientation="portrait"(禁止使用横屏)

2、系统处理配置变更

系统自动保存的状态:构成界面的每个视图状态(视图设置了ID)  系统不会保存成员变量状态的值
系统销毁activity时会调用onSaveInstanceState(Bundle onState)方法来保存activity状态
如:按下HOME键;被来电覆盖;屏幕旋转;锁屏;APP由前台转入后台时
重新恢复时就会重新调用onCreate(Bundle savedInstanceState)方法来创建视图,保存的状态就存储在Bundle对象中
然后调用onRestoreInstanceState(Bundle savedInstanceState)恢复视图状态

3、自定义处理配置变更

在activity标签中添加configChanges属性

 android:configChanges="orientation|screenSize|keyboardHidden"  //告诉系统我们自己来处理变更

当系统配置发生变更时会触发onConfigurationChanged()事件:可以检测到屏幕外设网络键盘语言等的变化,但是必须在activity标签中声明configChanges属性 以此来规定我们在程序中重写onConfigurationChanged方法,我们可以捕获到的事件类型,以此来做出相应的操作。

4、自定义保存视图状态
需要保存的状态:成员变量的值 构成界面的每个视图状态
条件:视图设置了ID

重写实现onSaveInstanceState(Bundle onState)方法
并且在重写方法中调用父类的onSaveInstanceState(outState)方法

   super.onSaveInstanceState(outState);

数据保存: 

Bundle对象提供了一系列的putget方法,用于保存不同的数据

onState.putXXX("变量名",值)

数据恢复:

恢复保存的数据可以在onCreate(Bundle savedInstanceState)方法中或者onSaveInstanceState(Bundle outState)中的Bundle对象调用get来获取保存的数据

savedInstanceState.getXXX("变量名")

5、保持fragment状态
扩展fragment对象,创建自己的碎片类

onCreate()调用setRetainInStance(true)告诉系统要保持fragment对象

setRetainInStance(true);

把保存的fragment对象添加到Activity中

Activity重启时,通过FragmentManager获取保存的Fragment对象

setRetainInStance(true);
Fragment fragment;
FragmentManager fm=getSupportFragmentManager();
fragment =  fm.findFragmentByTag(TAG);
if(fragment!==null){
    fragment=new Fragment();
    fm.beginTransaction().replace(id,fragment,"TAG").commit();
}

6、保存和恢复fragment状态(注意保持保存的区别)
fragment中并没有onRestoreInstanceState()方法

系统状态发生变更时也会调用onSaveInstanceState(Bundle onState)方法,将状态保存Bundle对象当中

onState.putXXX("变量名",值)

onActivityCreated()收到Bundle对象,可以在这个方法回调中读取恢复保存的状态
或者在onCreate(Bundle savedInstanceState)恢复

if(savedInstanceState!=null){
savedInstanceState.getXXX("变量名");
}

 

你可能感兴趣的:(Android开发日记)