当Activity非正常销毁时(典型:横屏竖屏切换时Activity会执行onPause,onStop,onDestroy方法,然后重新创建Activity);
但重新创建的Activity会保存之前Activity存储的数据(比如EditText中的内容在横屏竖屏切换后不会发生变化);
像横屏竖屏导致切换以及其他操作导致的系统配置发生变化,Activity都会被销毁,由于Activity是非正常情况下终止的,所以系统会调用onSaveInstanceState方法来保存当前Activity的状态,这个方法会在onPause方法之后onStop方法之前执行(注:Activity在正常终止时不会调用该方法),当Activity被重新创建后,系统会调用onRestoreInstanceState方法,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState方法和onCreate方法.因此,我们可以通过onRestoreInstanceState方法来和onCreate方法来取出之前Activity保存的数据,如果能够取出之前数据则证明Activity被重载,反之Activity没有被重载.
代码如下:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState!=null){ String test=savedInstanceState.getString("extra_test"); Log.e(TAG,"Oncreate"+test); }
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.e(TAG,"onSaveInstanceState"); outState.putString("extra_test","test"); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); String test = savedInstanceState.getString("extra_test"); Log.e(TAG,"onRestoreInstanceState:"+test); }
logcat如下:
01-12 10:20:33.622 17716-17716/com.eduask.practive E/MainActivity: onPause
01-12 10:20:33.647 17716-17716/com.eduask.practive E/MainActivity: onSaveInstanceState
01-12 10:20:33.652 17716-17716/com.eduask.practive E/MainActivity: onStop
01-12 10:20:33.652 17716-17716/com.eduask.practive E/MainActivity: onDestroy
01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: onCreate
01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: Oncreatetest
01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: onStart
01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: onRestoreInstanceState:test
01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: onResume
上面分析了系统的数据恢复机制,我们现在知道了系统配置发生改变后,Activity会被重新创建,但如果不想让Activity在系统配置发生改变时被重新创建,则需要在清单文件的Activity标签中指定configChanges属性.比如不想让Activity在横屏竖屏切换时重新创建,则可以给configChanges属性添加orientation这个值(更多configChanges属性可以去百度),如下图
然后重写一下方法,则可实现上述效果
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.e(TAG,"onConfigurationChanged:"+newConfig.orientation); }
logcat如下:
01-12 10:21:54.922 20431-20431/com.eduask.practive E/MainActivity: onConfigurationChanged:2 01-12 10:21:58.937 20431-20431/com.eduask.practive E/MainActivity: onConfigurationChanged:1 01-12 10:21:59.642 20431-20431/com.eduask.practive E/MainActivity: onConfigurationChanged:2 01-12 10:22:04.542 20431-20431/com.eduask.practive E/MainActivity: onConfigurationChanged:1