生命周期的故事

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

随机推荐

  1. Android(安卓)Intent机制实例详解(Activi
  2. RecyclerView竖直和水平的瀑布流布局
  3. android handler正确写法
  4. android开发环境_反编译
  5. 完美解决Android SDK Manager无法更新
  6. 屏蔽EditText自动获取焦点
  7. Android Q&A | setOnItemClickListener(A
  8. Android 设置控件不可见且不占用空间
  9. 转:Android世界的15款开源的游戏开发引擎
  10. android native socket correspond