各个生命周期的回调流程:
在Training中,拿金字塔举例,又有了下面的生命周期金字塔,和上图配合更有利于我们理解活动的生命周期。
有一点注意就是从暂停到可见,回调onPause到onResume
从停止到可见,过程就复杂了许多:
目前看到的已包括onStoped----onRestart----onstart------onResume。(还有一些saveInstance,看到了在总结下)
停止的话有点复杂,里面需要处理的逻辑很多啊。但是有一点要注意,就是onStopped不一定保证被调用,所以对于
一些用户数据保存,要在onPause中进行。(saveInstance干嘛?)
如果系统不销毁我们的活动,好多东西系统都会帮我们保存,比如view只要指定id就会保存状态,但是对于持久化信息,我们必须在
onPause调用的时候保存。当然有时候,系统为了省内存,会把我们的活动销毁,然后用户返回的时候要重建,那么我们就要用到
onSaveInstanceState(),流程见下图:
我们可以在onSaveInstanceState()中使用Bundle,调用putString和putInt保存数据。当系统重新创建活动的时候,会把这个
Bundle传递给OnCreate或者RestoreInstanceState方法,这就是我们看到OnCreate方法接收一个Bundle参数,就是这个,用来恢复
活动被杀死保存的数据。遗嘱啊,先人的遗言,后辈要谨遵记住。
注意:不保证onSaveInstanceState()的调用,如果用户使用返回按钮,明显去关闭这个活动,可能就不用保存了,用户自己关的。
如果系统调用,在onStop之前,可能在onPause之后,跟onPause的不确定。因此,这个方法只适合临时数据,如果要保存持久化数据,
一定要用onPause。
默认onSaveInstanceState()的实现会帮我们保存,比如View对应的方法,只要指定id就可以。
如果我们非要重写
onSaveInstanceState(),上来一定先调用父类的
onSaveInstanceState(),然后在是自己的。
同理,onRestoreInstanceState。
onSaveInstanceState()和onPause、onStop的区别
onPause在活动被放到后台或者要销毁时肯定会调用,onStop在销毁前调用。如果用户是从活动B返回到A,那么B在销毁的时候
就没有必要调用onSaveInstanceState(),B被显式销毁(这个导航的问题还要学习),系统避免调用这个方法,但是这种情况B
是会调用onPause和onStop的。
。另一个例子,如果B在A前面,但是A在B生命周期不会被杀死,也没必要调用,这时候onPause被
onSaveInstanceState()是为了重启用的,如果只有onPause和OnStop,那么重新创建活动的话,参数如何传递?所
以,onSaveInstanceState()存在的最大意义就是活动重建的时候,按照上次死的遗言,恢复一些东西,没有就算了。
onPause或者onStop是有些东西必须在这个活动的生命周期干完,比如要见一个人,我死之前必须见,不然死了之后见不着了。