Android生命周期
这是Google提供的官方文档,我们一点点解析这张图的意义。
以刚刚建立Activity为例
onCreate
这个方法是在Activity刚刚建立时会调用的方法,一般在这里执行一些方法的初始化,最重要的是视图资源文件的绑定:setContentView()方法的调用。
onStart
在onCreate执行完毕后会执行此方法,此时Activity已经完全建立,只是还没有显示在前台
onResume
在onStart执行完毕后会执行此方法,此时Activity已经显示到前台,Activity建立完毕,供用户使用与交互。在另一个Activity被建立之前或者本Activity被销毁之前,Activity一直驻留在此方法。
onPause
此时Activity开始停止,但是Activity还在前台,可以做一些轻量的资源回收工作,但是注意不能太耗时,因为另一个需要开启Activity,会在上一个onPause执行完之后才能执行,如果执行了耗时的操作,会影响下一个Activity的打开速度,影响用户的使用体验。同时应注意,当打开的新Activity没有完全覆盖当前Activity时,即部分透明或完全透明时,此方法会回调,但不会回调onStop方法。
onStop
此时Activity已经停止并回到后台,此时可以执行一下相对重量级的回收工作,但仍不能太过耗时,注意此时Activity对象的实例仍然存在,它保存在内存中,但是当内存不足时,系统可能会杀死当前Activity以保持系统的稳定性,下次打开时需要重建Activity而不是恢复。
onDestroy
此时Activity被销毁,Activity中的View资源被回收,在此可以进行最后的资源回收和释放,Activity死亡。
我们再来看往回指的三个过程
onStop->onRestart->onStart
这个一般是一个在后台的Activity被重新调回前台的过程,因为Activity实例还存在,所以不需再调用onCreate方法,直接恢复原有实例便可。
onPause->onResume
用户在停止当前Activity之后迅速恢复当前Activity,此时onStop还没执行,Activity直接回到onResume阶段。
onStop->onCreate
可能会出现这种方式的情况:
- 资源相关配置改变:比如竖屏变为横屏(更多情况可以查看Google官方的Activity文档)。
- 资源内存不足,低优先级进程被杀死:为了保证Android系统能够平稳的运行,保证有足够的剩余内存分配,Android系统必须及时杀死无用进程或者优先级较低的进程,来省出稀缺的内存空间。
这几种情况下,Activity会杀死,onPause、onStop、onDestroy均会被调用,而且在调用onStop之前,onSaveInstanceState方法会被调用,保存Activity视图以及View的相关状态,该方法和onPause方法没有先后顺序,当Activity重新创建时,在onStart之后onRestoreInstanceState方法被调用,收到onSaveInstanceState方法传过来的Bundle信息,取出后恢复已经保存的信息。
注意onSaveInstanceState存储的Bundle信息也会传到onCreate方法,但最好用onRestoreInstanceState方法恢复信息,因为onRestoreInstanceState只会在调用了onSaveInstanceState方法之后重建Activity是调用,所以Bundle中一定是有值的,但onCreate则不一定,需要额外添加判断是否为null的逻辑。