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

当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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值