1、onSaveInstanceState方法的简单介绍
例如,如果activity B启用后位于activity A的前端,在某个时刻activity A因为系统回收资源的问题要被杀掉,A通过onSaveInstanceState将有机会保存其用户界面状态,使得将来用户返回到activity A时能通过onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢复界面的状态。
2、onSaveInstanceState方法调用的时机:
这个方法在一个activity被杀死前调用,当该activity在将来某个时刻回来时可以恢复其先前状态。例如,如果activity B启用后位于activity A的前端,在某个时刻activity A因为系统回收资源的问题要被杀掉,A通过onSaveInstanceState将有机会保存其用户界面状态,使得将来用户返回到activity A时能通onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢复界面的状态。
意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。这种可能性有哪些?通过重写一个 activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我 们可以清楚地知道当某个activity(假定为activity A)显示在当前task的最上层时,其onSaveInstanceState方法会在什么时候被执行,有这么几种情况:
这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,因此系统会调用onSaveInstanceState(),让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则。
(2)、长按HOME键,选择运行其他的程序时。
(3)、按下电源按键(关闭屏幕显示)时。
(4)、从activity A中启动一个新的activity时。
(5)、屏幕方向切换时,例如从竖屏切换到横屏时。
3、onRestoreInstanceState方法的调用时机
4、onSaveInstanceState的应用场景
5、InstanceState实际实用例
package com.example.yk.onsaveinstancestatetest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
/**
* Android使用InstanceState保存和恢复数据
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView textView,textView2;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView= (TextView) findViewById(R.id.text);
textView2= (TextView) findViewById(R.id.text2);
textView2.setOnClickListener(this);
Log.e(TAG,"onCreate");
if(savedInstanceState!=null){
Log.e(TAG,"onCreate恢复的数据:"+savedInstanceState.get("save_data"));
}else {
Log.e(TAG,"onCreate中的bundle为null");
}
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG,"onStar");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG,"onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG,"onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG,"onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG,"onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG,"onDestroy");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e(TAG,"onSaveInstanceState");
outState.putString("save_data","ka ka");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.e(TAG,"onRestoreInstanceState");
Log.e(TAG,"onRestoreInstanceState恢复的数据:"+savedInstanceState.getString("save_data"));
}
@Override
public void onClick(View view) {
// InputMethodManager manager= (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// manager.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);
// Log.e(TAG,"弹出键盘");
startActivity(new Intent(this,Main3Activity.class));
}
}
旋转屏幕前log
旋转屏幕后打印log
6、和InstanceState相似的保存和恢复数据的几个方法
参考文章:
onSaveInstanceState和onRestoreInstanceState触发的时机 :http://ice-k.iteye.com/blog/1018956
Android入门- 关于Activity下的onCreate方法:http://www.cnblogs.com/shaocm/archive/2012/11/30/2796105.html
Android Notes - Activity生命周期中的onSaveInstanceState:http://hukai.me/android-activitylifecycle-onsaveinstancestate/
Android开发之InstanceState详解:http://www.cnblogs.com/hanyonglu/archive/2012/03/28/2420515.html