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入栈。