Activity的突发情况下退出恢复数据

Activity的突发情况下退出恢复数据

前言

在APP中除了按back键和home键,启动另一个Activity属于正常退出,其他情况下基本都属于Activity的非正常退出。但是出现这种情况后,之前edittext等控件的信息全部不见了。我们有什么方法可以把数据恢复过来。那就需要onSaveInstanceState这个方法了

转载附上地址:http://blog.csdn.net/sinat_17314503/article/details/51760926

实践

    public class MainActivity extends AppCompatActivity {
    private final static  String TAG = "Test";
    private EditText mEditTest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mEditTest = (EditText) findViewById(R.id.editTest);
        if(savedInstanceState!=null){

            String str = (String) savedInstanceState.get("temp");
            Log.d(TAG, str);
            mEditTest.setText(str);

        }
        Log.d(TAG,"onCreate");
    }


//    被动执行的 用户主动按back键 和 home键不触发
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState");
        outState.putString("temp", mEditTest.getText().toString().trim());
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG,"onStart");
    }


//    无论出现怎样的情况,比如程序突然死亡了,能保证的就是onPause方法是一定会调用的
    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG,"onPause");
    }


//    onRestart 当处于非栈顶状态的活动需要再次返回栈顶,展现给用户的时候,触发该方法。
//    也就是说执行了onStop()且没有执行onDestroy()的Activity被重新激活时,就会调用onRestart()方法。

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG,"onRestart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"onResume");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG,"onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"onDestroy");
    }

    public void showotheractivity(View v){
        Intent intent = new Intent();
        intent.setClass(this,MainActivityTwo.class);
        startActivity(intent);
    }
}

xml如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
    android:orientation="vertical">
    <Button
        android:onClick="showotheractivity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <EditText
        android:id="@+id/editTest"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

初始启动的时候

06-25 12:24:59.841 854-854/com.example.administrator.af D/Test: onCreate
06-25 12:24:59.841 854-854/com.example.administrator.af D/Test: onStart
06-25 12:24:59.865 854-854/com.example.administrator.af D/Test: onResume

然后旋转屏幕

06-25 12:25:50.177 854-854/com.example.administrator.af D/Test: onSaveInstanceState
06-25 12:25:50.177 854-854/com.example.administrator.af D/Test: onStop
06-25 12:25:50.177 854-854/com.example.administrator.af D/Test: onDestroy
06-25 12:25:50.213 854-854/com.example.administrator.af D/Test: onCreate
06-25 12:25:50.213 854-854/com.example.administrator.af D/Test: onStart
06-25 12:25:50.217 854-854/com.example.administrator.af D/Test: onResume

onSaveInstanceState 调用了,因为旋转屏幕需要重心创建Activity符合非正常退出所以进行了调用

我们有一个EditText控件但是系统已经帮我们实现好了恢复方法,所以旋转屏幕EditText的值依然还是在的,但是我们也可以从onCreate方法里面取到之前的值证明了这里可以保存突发事件退出时的数据

我在onSaveInstanceState里面加如
outState.putString("temp", mEditTest.getText().toString().trim()+"TEST");这个用来打印log
在onPause上加入Log.d(TAG,mEditTest.getText().toString());这个

06-25 12:49:12.409 22458-22458/? D/Test: onCreate
06-25 12:49:12.409 22458-22458/? D/Test: onStart
06-25 12:49:12.409 22458-22458/? D/Test: onResume
06-25 12:49:23.281 22458-22458/com.example.administrator.af D/Test: onPause
06-25 12:49:23.281 22458-22458/com.example.administrator.af D/Test: qwer123
06-25 12:49:23.285 22458-22458/com.example.administrator.af D/Test: onSaveInstanceState
06-25 12:49:23.285 22458-22458/com.example.administrator.af D/Test: onStop
06-25 12:49:23.285 22458-22458/com.example.administrator.af D/Test: onDestroy
06-25 12:49:23.349 22458-22458/com.example.administrator.af D/Test: qwer123TEST
06-25 12:49:23.349 22458-22458/com.example.administrator.af D/Test: onCreate
06-25 12:49:23.349 22458-22458/com.example.administrator.af D/Test: onStart
06-25 12:49:23.349 22458-22458/com.example.administrator.af D/Test: onResume

从上面可以看到Log.d(TAG,mEditTest.getText().toString());
后获取的字符串有TEST证明了可以进行数据的恢复。

补充:

1.onSaveInstanceState方法会在onStop之前调用
2.什么样的数据属于临时数据呢?举个例子,比如EditText中输入的内容,CheckBox是否勾选,ScrollView的滑动位置,目前视频的播放位置等等。
3.Android的View本身自己就实现了onSaveInstanceState方法,控件自己就具有保存临时数据和恢复临时数据的能力
4.无论出现怎样的情况,比如程序突然死亡了,能保证的就是onPause方法是一定会调用的,而onStop和onDestory方法并不一定,所以这个特性使得onPause是持久化相关数据的最后的可靠时机。当然onPause方法不能做大量的操作,这会影响下一个Activity入栈。

参考:http://mp.weixin.qq.com/s?__biz=MzA4NTQwNDcyMA==&mid=2650661673&idx=1&sn=b79ed39eb4669721e197e5c7a2ca2491&scene=23&srcid=0625my79fNB9w57B9n00WGWh#rd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值