生命周期的故事

横竖屏切换时候activity的生命周期  

总结:

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

在一些特殊的情况中,你可能希望当一种或者多种配置改变时避免重新启动你的activity。你可以通过在manifest中设置android:configChanges属性来实现这点。
你可以在这里声明activity可以处理的任何配置改变,当这些配置改变时不会重新启动activity,而会调用activity的
onConfigurationChanged(Resources.Configuration)方法。如果改变的配置中包含了你所无法处理的配置(在android:configChanges并未声明),
你的activity仍然要被重新启动,而onConfigurationChanged(Resources.Configuration)将不会被调用。

其次:android:configChanges=""中可以用的值:keyboard|mcc|mnc|locale|touchscreen|keyboardHidden|navigation|orientation……
Configuration 类中包含了很多种信息,例如系统字体大小,orientation,输入设备类型等等.(如上图)
比如:android:configChanges="orientation|keyboard|keyboardHidden"

 

当Configuration改变后,ActivityManagerService将会发送"配置改变"的广播,会要求ActivityThread 重新启动当前focus的Activity.
这是默认情况,我们不做任何处理,如果我们android:configChanges来配置Activity信息,那么就可以避免对Activity销毁再重新创建,而是调用
onConfigurationChanged方法。

通过查阅Android API可以得知android:onConfigurationChanged实际对应的是Activity里的onConfigurationChanged()方法。
在AndroidManifest.xml中添加上诉代码的含义是表示在改变屏幕方向、弹出软件盘和隐藏软键盘时,不再去执行onCreate()方法,
而是直接执行onConfigurationChanged()。如果不申明此段代码,按照Activity的生命周期,都会去执行一次onCreate()方法,而onCreate()方法通常会在显示之前做一些初始化工作。所以如果改变屏幕方向这样的操作都去执行onCreate()方法,就有可能造成重复的初始化,降低程序效率是必然的了,而且更有可能因为重复的初始化而导致数据的丢失。这是需要千万避免的。



横竖屏切换的过程,会经历onDestroy和onCreate。通俗点说,就是这个activity关闭了,有新起来一个activity。那么,前一个activity的数据肯定都不存在了。虽然这样的切换,你的EditText上输入的内容还在,但是一定要记得,成员变量都是空的啦。数据保存成了一个问题。

保存整个activity的方案

在Manifest里对于的activity加上这个配置就不会重走销毁和创建了,如下:

android:configChanges="orientation|keyboardHidden|screenSize"
  • 1

不要高兴的太早,除非你不需要改变横竖屏的布局,否则这个方案仍然要有很多工作要做。

还是乖乖的保存数据吧

onRetainNonConfigurationInstance()被弃用了,我们还是用onSaveInstanceState吧。针对横竖屏不同的布局,我们只需在创建一个layout-land文件夹,里面放同名的布局文件,onCreate时会自动加载相对应的横竖屏布局。 
在横竖屏切换的过程中会经历onSaveInstanceState,给你一个保存数据的机会:

    @Override    public void onSaveInstanceState(Bundle outState) {        Log.i("linc", "onSaveInstanceState(Bundle)");        super.onSaveInstanceState(outState);        outState.putString(TEXT_ONE, ""+editText1.getTag(R.id.tag_first));//avoid null point//        outState.putSerializable();//object    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在onCreate中把数据取出来:

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_land_port_switch);        Log.e("linc","oncreate");        editText1 = (EditText)findViewById(R.id.txt1);                // Restore saved state.        if (savedInstanceState != null) {            editText1.setTag(R.id.tag_first,savedInstanceState.getString(TEXT_ONE));        }        }

更多相关文章

  1. activity生命周期及横竖屏切换
  2. android:configChanges属性
  3. Android中的Activity生命周期
  4. ionic cordova build android 打包巨慢,一直在Running command的
  5. Ubuntu下使用adb和USB连接的方式进行android设备调试
  6. Android之JNI初级篇
  7. Android生命周期学习笔记
  8. 安装APK文件到Android模拟器
  9. Android(安卓)Activity生命周期

随机推荐

  1. 在Android中查看和管理sqlite数据库
  2. 学习Content Provider
  3. Android(安卓)SDK 国内镜像
  4. 玩转Jenkins - Android发布自动版本号
  5. 关于android:configChanges="keyboardHid
  6. 1 mkfile
  7. Android(安卓)源码查看
  8. Android蓝牙操作
  9. Android(安卓)性能优化之数据库优化(一)
  10. Android(安卓)呼吸灯流程分析(一)