Android——横竖屏切换以及数据保存
生命周期的故事
横竖屏切换时候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)); } }
更多相关文章
- Eclipse中编译Android工程时出现的问题解决方法。
- activity生命周期及横竖屏切换
- android基于UDP协议发送数据的demo
- Android Intent 程序之间进行通信 传输数据
- Android studio获取证书指纹 (SHA1)的方法
- 【阿里聚安全·安全周刊】一种秘密窃取数据的新型 Android 木马|
- Android中的Activity生命周期
- 使用adb工具访问sqlite数据库