当Activity变得容易被系统销毁的时候,什么叫容易被销毁呢, 比如Activity停留在stop状态且系统内存不足的时,
这时候系统会自动调用onSaveInstanceState(Bundle outState)方法来临时保存Activity的一些数据,也可以自己重写此方法,
保存一些自己想保存的数据,比如视频的播放进度等。
如果Activity是用户主动销毁,如按了back键退出activity或是调用了activity的finish方法等得时候,系统是不会执行
onSaveInstanceState方法。
一下操作可能会执行onSaveInstanceState方法 具体还需自己写个demo验证
1.当用户按下HOME键时
2.长按HOME键,选择运行其他的程序时
3.按下电源按键(关闭屏幕显示)时
4.从activity A中启动一个新的activity时
5.屏幕方向切换时,例如从竖屏切换到横屏时
在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,
所以onSaveInstanceState一定会被执行
总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)
onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行。
另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
if(savedInstanceState!=null && savedInstanceState.getString("currentposition")!=null){
System.out.println(""+savedInstanceState.getString("currentposition"));
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
outState.putString("currentposition", "当前播放了5分钟");
super.onSaveInstanceState(outState);
}
来源:oschina
链接:https://my.oschina.net/u/725437/blog/632462