系统配置发生变更时,系统会 (重启 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对象提供了一系列的put和get方法,用于保存不同的数据
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("变量名");
}