Android学习已经将近一年了,感觉技术进步很慢,习惯不了安逸的生活,所以对安卓开发进行了一些整合,计划进阶!
了解savedInstanceState
首先,savedInstanceState是Android用来恢复一些因异常情况下(如由竖屏切换横屏时Activity会进行重启)而导致Activity销毁的数据。因为 Activity 在变为不可见以后,系统随时可能把它回收用来释放内存。重写 Activity 中的 onSaveInstanceState 方法是 Google 推荐的用来保持 Activity 状态的做法。销毁前会调用onsavedInstanceState()方法对一些需要存储的数据,由键值对的方式put到一个Bunble实例中 !当然,用户手动返回,比如按Home键、finish掉Acitivity都是不会经过onsavedInstanceState()方法的!
保存数据
首先,在销毁时先保存数据,onsavedInstanceState()方法必须重写
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
outState.putString("temp" , temp);
}
activity销毁时,会先经过onsavedInstanceState()方法,然后执行onPause()——onDestroy()方法
恢复数据
当异常退出再进入之后,会调用onCreate方法中的成员savedInstanceState,或者重写onRestoreInstanceState()方法
onRestoreInstanceState()只有在存在保存状态的情况下才会恢复,所以不需要去检查Bunble是否为空
@Override
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onRestoreInstanceState(savedInstanceState, persistentState);
temp = savedInstanceState.getString("temp");
Log.i("temp" , "onRestoreInstanceState()---"+temp);
}
onCreate()方法是在启动activity之后调用的方法,所以需要去检查Bunble是否为空
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState != null){
temp = savedInstanceState.getString("temp");
Log.i("temp" ,"oncreate()---" + temp);
}
}
接下来我们来模拟一下异常退出的情况,当竖屏切换横屏时,会重新启动Activity
DEMO
完整代码如下
public class MainActivity extends AppCompatActivity {
private String temp= "进入页面!";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState != null){
temp = savedInstanceState.getString("temp");
Log.i("temp" ,"oncreate()---" + temp);
}
}
@Override
protected void onResume() {
super.onResume();
temp = "屏幕切换,保存数据" ;
if(getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
outState.putString("temp" , temp);
Log.i("temp" , "onSaveInstanceState()");
}
@Override
protected void onPause() {
super.onPause();
Log.i("temp" , "onPause()");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("temp" , "onDestroy()");
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onRestoreInstanceState(savedInstanceState, persistentState);
temp = savedInstanceState.getString("temp");
Log.i("temp" , "onRestoreInstanceState()---"+temp);
}
}
总结
最终,在异常退出再打开的情况下,temp仍然保留退出时的值