您的位置:首页 > 其它

Activity非正常销毁后重新创建问题

2016-01-11 15:57 274 查看
当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: onPause01-12 10:20:33.647 17716-17716/com.eduask.practive E/MainActivity: onSaveInstanceState01-12 10:20:33.652 17716-17716/com.eduask.practive E/MainActivity: onStop01-12 10:20:33.652 17716-17716/com.eduask.practive E/MainActivity: onDestroy01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: onCreate01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: Oncreatetest01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: onStart01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: onRestoreInstanceState:test01-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:201-12 10:21:58.937 20431-20431/com.eduask.practive E/MainActivity: onConfigurationChanged:101-12 10:21:59.642 20431-20431/com.eduask.practive E/MainActivity: onConfigurationChanged:201-12 10:22:04.542 20431-20431/com.eduask.practive E/MainActivity: onConfigurationChanged:1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: