Activity生命周期

我本身是觉得Activity实在是没有必要特别揪出来讲上一讲的。不过似乎面试会被问到,没有个概念实在是说不过去,毕竟是基础中的基础。

另外就是,一些比较常规的知识点可能都记得了,但一些小地方还尚需注意。

常规生命周期:

其中,resumed、paused和stopped三种状态是会较为长久存在的,而created和started会快速执行完代码后切换到下一状态。

重启(restart)生命周期:

关于activity的重新创建

当activity对屏幕旋转做出响应时,默认的行为会销毁activity并且重新创建。

因为系统资源紧张导致的activity销毁,系统会保存下一些activity被销毁时的状态数据。这些数据被称为“instance state”,是以键值对的形式保存在Bundle中的。系统会根据这些数据来重新创建activity。

Instance state中默认保存了视图对象中的信息,如果需要自己自定义保存更多的数据,涉及到两个新的回调方法。一是 onSaveInstanceState(Bundle outState),这会在activity被destroy之前调用。二是与之对应的 onRestoreInstanceState(Bundle),会恢复activity的状态。

需要注意的是 onSaveInstanceState(Bundle)并不是生命周期回调方法,不是每次被destroy之前都会调用。当系统判断activity不需要被恢复时,它是不会被调用的。通常来说,activity是被正常destroy时,这个方法不会被调用。

onSaveInstanceState(Bundle)中会保存数据到一个Bundle,而观察 onRestoreInstanceState(Bundle)onCreate(Bundle)方法,参数都是一个Bundle,这个Bundle就是保存数据的Bundle了。

那么这样一来,就可以在 onCreate(Bundle)中通过这个Bundle来判断activity是不是被非正常destroy的。判断过后可以进行一些对应的处理。在使用这个Bundle之前,你必须记得要检查是否为null。

onRestoreInstanceState(Bundle)方法同样可以用来恢复数据,它会在 onStart()后调用。但与 onSaveInstanceState(Bundle)一致,也不是生命周期回调方法,仅在需要的时候才会调用。在这里恢复数据时,不需要检查传入的Bundle是否为null。

在使用 onSaveInstanceState(Bundle outState)onRestoreInstanceState(Bundle)时,都需要注意调用父类实现。

注意点

  • onCreate():不要做过多工作,以免程序启动很久后还看不到界面;
  • onStart():从技术上来说,activity在调用 onStart()可以被用户看见,但是started状会被态很被带过;
    可以验证某些功能是否已经准备完毕;
  • onPause():在这里保存需要长期保存的信息;
    停止动画等会占用CPU的操作;
    释放系统资源,如camera、sensors等;
    避免进行CPU密集型的工作,这会使得切换到下一activity速度缓慢,例如将数据写入数据库,将这些工作放到 onStop()中进行;
  • onResume():初始化在 onPause()中释放掉的资源等;
  • onStop():在这之前总是会调用 onPause()方法;
    由于在极端情况下系统不一定会调用 onDestroy(),所以在 onStop()中需要释放资源;
  • onDestroy():大多数应用无需实现这个方法;
    应该在 onPause()onStop()中执行清除操作;
    如果有在 onCreate()中创建的后台线程,或者是其他长时间运行的、非正常关闭时可能导致内存泄露的资源,需要在 onDestroy()中进行处理;
    如果调用了 finish()方法,系统会直接调用 onDestroy()方法,不再调用 onPause()onStop()