关闭

Activity生命周期详解

标签: Activity生命周期详解Android生命周期异常情况
164人阅读 评论(0) 收藏 举报
分类:

Activity是在开发中被用到最多的组件,其生命周期也是一个开发人员必须要了解的。

下面的生命周期时从官方文档上翻译的版本:

下面是官方文档对各个生命周期给予的解释:

1.onCreate:这个方法在Activity第一次被创建的时候调用,在这里你应该进行一些常规的静态操作,像创建View,给List绑定数据等等。这个方法将会传递一个保存了之前状态的Bundle类的对象(如果你之前捕获了这个状态的话)。

2.onRestart:在Activity已经stop了以后调用,仅仅会在再一次start之前调用。

3.onStart:在Activity对用户可见之前调用。

4.onResume:在Activity和用户进行交互之前调用。在这个时间点上当前的Activity在任务栈的最顶部,用户可以对其执行输入的操作。

5.onPause:在系统将要启动另一个Activity时被调用,这个方法经常被用来持久化数据,停止动画和其他消耗CPU资源的事件等等,这个方法应该做一些非常快速的处理,因为在它返回之前下一个Activity不会显示出来。

6.onStop:在Activity不再能够被用户看见时被调用,这将会在Activity将要销毁或者因为另一个Activity(不管是已经存在的还是新的)显示出来并且覆盖了当前Activity时发生。

7.onDestroy:在Activity已经被摧毁前调用,这是Activity能接收到的最后一个回调,它也可以在Activity正在结束时调用(其他人在当前Activity上调用了finish方法),又或者是在当前系统为了获得空间而销毁当前Activity时调用。

以上是官方文档给出的描述,应该还都算是比较好理解的,但是在onStart和onResume之间可能还有一些疑问,因为这两个回调每次都是成对出现没有分开的,可以理解为在onStart调用的时候Activity已经创建出来了,但是还没有显示,而在onResume方法调用的时候Activity才是真正的显示出来了。

根据官方文档上的描述,有一点需要注意系统能在onPause、onStop、onDestroy之中任何一个方法调用之后杀死进程而不进行后续的生命周期回调,但是因为onPause是这三者中的第一个,一旦一个Activity创建出来了,onPause方法将是它所能保证的最后被调用的方法,所以说如果有什么重要的信息一定要保存下来就在onPause方法中进行保存。但是这个方法调用的时间也不能太久,不然会阻塞下一个Activity的启动。


Activity因为一些内存不足或系统原因被销毁了但是从新创建时想要恢复数据怎么办?在这里可以使用另一组生命周期的回调,onSaveInstanceState()和onRestoreInstanceState()。在官方文档中有这样一张图片:

通过这张图片我们可以看出,在另一个Activity到前台的时候就会回调onSaveInstanceState方法,因为一旦这样Activity就有被销毁的可能性。接下来如果它真的被销毁了我们可以使用onCreate方法或者onRestoreInstanceState方法传入的Bundle参数来进行数据的恢复,这里值得注意的是onCreate方法中返回的bundle有可能使空的,因为在没有进行状态保存(假设是第一次进入)时就不会存在bundle数据。而且在我们手动按下返回键的时候onSaveInstanceState方法是不会被调用的,有兴趣可以自己测试一下。

那么onSaveInstanceState方法是什么时候调用呢?根据官方文档上的说明,会在onStop之前并且有可能在onPause之前。其实如果不去覆盖onSaveInstanceState,系统也会自动的做一些数据的保存,从Activity类的onSaveInstanceState方法的源码就可以看出,它将事件分发了下去,这个事件会分发到具体的控件上去,如果有兴趣查看源码就会发现TextView、EditText、CheckBox类的源码都在onSaveInstanceState方法调用的时候保存了自己的一些相关数据。这里onRestoreInstanceState也一样,在Activity调用此方法时也会将事件分发到每个控件,所以说在重写这个方法的时候我们应该调用一下父类的super.onRestoreInstanceState。

如果说在类销毁之前onSaveInstanceState方法也会被调用(不包括手动退出),那么是否可以在其中做一些持久化的工作呢?官方文档给出的说明是这个方法只适合于保存UI的相关状态,重要的持久化还是应该再onPause方法中进行。

从ActivityA跳转到ActivityB生命周期的回调流程是什么样的?

文档上给出的说明是ActivityA的onPause方法会首先被执行,然后ActivityB的onCreate,onStart,onResume方法依次被执行,最后在ActivityA不可见的时候调用其onStop方法,这就给我们说明了一个问题,如果在ActivityB中需要用到ActivityA持久化到数据库中的数据,那么要在ActivityA的onPause方法中进行持久化。






0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11418次
    • 积分:324
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    最新评论