1、Activity界面数据恢复:分两种
第一种:当切换进程,过一段时间,再次进入,activity页面被杀死,进程没有结束,会重新绘制activity,原先输入的数据都不存在:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = findViewById(R.id.main_et_input); if(savedInstanceState!=null){ //获取onSaveInstanceState保存的数据,并设置进ediText里面 String text = savedInstanceState.getString("editText",""); editText.setText(text); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); String text = editText.getText().toString(); outState.putString("editText",text); }
第二种:按home键清理进程,进程被结束,这种情况onSaveInstanceState保存了数据,也没用,再次进入保存的数据也不存在。那么怎么解决,个人介意是使用SharedPreferences保存数据,当切换页面的时候在onSaveInstanceState中这么用
private EditText editText; private SharedPreferences sharedPreferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sharedPreferences = getSharedPreferences("a.txt",MODE_PRIVATE); editText = findViewById(R.id.main_et_input); if(sharedPreferences.getString("editText",null)!=null){ //获取onSaveInstanceState保存的数据,并设置进ediText里面 String text = sharedPreferences.getString("editText",""); editText.setText(text); //当恢复数据之后,清空里面的数据 SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("editText",null); editor.commit(); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); String text = editText.getText().toString();//获取状态值 SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("editText",text); editor.commit(); }
效果图:
2、在讲onCreate带两个参数的跟一个参数的区别之前,首先我们需要知道activity的两个方法onSaveInstanceState跟onRestoreInstanceState:
1)onSaveInstanceState在什么时候被执行:
1、当用户按下HOME键时。
2、长按HOME键,选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从activity A中启动一个新的activity时。
5、屏幕方向切换时,例如从竖屏切换到横屏时。
2)onRestoreInstanceState在什么时候被执行:
onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建activity的情况下才会被调用。
onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume
onCreate带两个参数的跟一个参数的区别:
3、onCreate带一个参数的::当我们的Activity非正常销毁之后,例如手机旋转,内存不足导致的后台自动销销毁。为了保护我们的数据可以将数据保存在savedInstanceState中,当Activity重启数据依旧不会消失。我们可以通过onCreate方法中的savedInstance参数拿到我们的数据。做法很简单只要重载onSaveInstanceState或者onRestoreInstance就可以了:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
4、onCreate带两个参数的:
手机由于过热,没电或者第三方定制Rom由于卡顿而异常关机的情况、当用户在操作前台数据的时候手机突然关机了,他能帮你找回之前前台的数据。他实际上是一种数据持久化的Activity
使用:
首先,我们需要在Android 的清单文件的Activity中指定如下属性:
android:persistableMode="persistAcrossReboots"
接着重载onSaveInstanceState或者onRestoreInstance:
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onRestoreInstanceState(savedInstanceState, persistentState);
}
他们对应着一个PersistableBundle类型的persistentState。进行操作就OK了。