Activity深入学习(1)生命周期

来源:互联网 发布:苹果电脑删除mac系统 编辑:程序博客网 时间:2024/05/24 02:00

一、活动的生命周期图

各个生命周期的回调流程:



在Training中,拿金字塔举例,又有了下面的生命周期金字塔,和上图配合更有利于我们理解活动的生命周期。

有一点注意就是从暂停到可见,回调onPause到onResume

从停止到可见,过程就复杂了许多:

目前看到的已包括onStoped----onRestart----onstart------onResume。(还有一些saveInstance,看到了在总结下)

停止的话有点复杂,里面需要处理的逻辑很多啊。但是有一点要注意,就是onStopped不一定保证被调用,所以对于

一些用户数据保存,要在onPause中进行。(saveInstance干嘛?



二、正确处理生命周期的重要性

根据我们活动的复杂程度需要实现这些生命周期函数,不过我们应该好好理解每一个,然后保证我们的程序在下面几个方面运行良好:

(1)当用户有来电或者切换到另一个app不会崩溃(这个应该不会,安卓系统也自动帮我们处理,比如记着对于EditText这些view,如果
我们给View指定了id,系统就会帮我们保存用户已经输入的内容)

(2)当用户不使用我们的应用时,不消耗系统资源。(这个还是很重要的,现在的各种无良APP,耗电耗流量,这是我们需要关注的吧)

(3)如果用户离开,一会在回来,不会丢失用户的进度(保留用户离开时的样子,貌似不太简单,这个应该是最难实现的。主要靠onPause
这些生命周期保存,然后在onStart什么的在复原,进一步研究??)

(4)当用户选择屏幕的时候不崩溃或者丢失用户的进度。

三、保存活动的状态


保存活动的状态很重要,比如用户离开,接电话,旋转屏幕,要保证我们的app工作正常。

活动只可能停留在三个状态:
Resumed   Paused  Stopped.
其他的都只是临时瞬间的,里面切换到下一个。
比如onCreate之后马上onStart然后onResume。所以我们可以知道,我们的活动的状态主要就是上面三个。


如果系统不销毁我们的活动,好多东西系统都会帮我们保存,比如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是有些东西必须在这个活动的生命周期干完,比如要见一个人,我死之前必须见,不然死了之后见不着了。


0 0