onSaveInstanceState与onRestoreInstance

◇◆丶佛笑我妖孽 提交于 2020-03-01 13:29:01

当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);
	}



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!