最近在阅读Android开发艺术探索者这本书,这本书是针对Android初级水平向高级水平进阶的目标。在此我只是做个阅读笔记,大神忽略。好了废话不多说了,我们开始搬砖吧(还是相信从菜鸟进阶到大神段位是没有捷径,唯有多撸码)。这讲我们主要是针对Activity的生命周期进行分析,查缺补漏让自己每一次都有新的收获。
Activity是什么的问题大家已经了如指掌了这里就不细说了,我们重点是分析Activity的生命周期;在接下来的套路我是以提问的形式进行分析解答。
问题一、Activity的生命周期有哪些?有什么意义?
1、onCreate:表示Activity正在被创建,Activity生命周期的起点,可以进行一些初始化操作,比如加载布局资源,设置主题样式,切记不要执行耗时的操作,不然会出ANR问题。
2、onStart:表示Activity正在被启动,即将开始但不是处于前台,无法与用户交互。可以理解为Activity已经显示出来了,但是我们还是看不到。
3、onRestart:表示Activity正在重新启动,一般情况下是指当当前Activity从不可见重新变为可见状态,onRestart就会被调用。一般是由用户操作导致,比如用户按home键后切换到桌面或者用户打开了一个新的Activity后按返回键返回到了之前的Activity。
4、onResume:表示当前Activity是可见的,并且可以与用户进行交互。
5、onPause:表示Activity正在停止,可以存储一些轻量级数据或者停止动画,千万不能进行耗时操作,不然会出现ANR问题。
6、onStop:表示Activity即将停止,可以做一些资源回收,同样不能太耗时。
7、onDestroy:表示Activity即将被销毁,这是Activity生命周期的终点,可以做一些回收工作或者最终资源的释放,比如反注册广播,服务。
问题二、Activity在典型情况下是如何管理的?
正常情况下Activity的生命周期就只有上面7个,我们可以图文说明来了解,如图:
针对上图再附加一下具体说明,分如下几种情况:
1、针对特定的Activity,第一次启动,当前Activity执行:onCreate->onStart->onResume。
2、用户打开新的Activity或者按home键回到桌面,Activity执行:onPause->onStop,这里要注意,如果新的Activity采用了透明主题,那么当前Activity只会执行onPause,不会执行onStop。
3、当用户再次回到原来的Activity,执行:onRestart->onStart->onResume.
4、当用户按back键返回,执行:onPause->onStop->onDestroy.
总结:从整个生命周期看,大家可以这样理解容易记住,onCreate与onDestroy是配对,分别表示生命周期的开始和结束,并且在整个生命周期只执行一次。从Activity是否可见来说,onStart与onStop是配对的,从Activity是否可以与用户交互来说,onResume与onPause是配对的。
问题三、Activity在异常情况下是如何管理的?
场景一、资源相关的系统配置发生变化导致Activity被杀死并重新创建
这是很常见的情况,比如横竖屏切换的时候,Activity会被杀死然后重新创建,如果我们不做特殊处理,异常情况下生命周期如下图:
当系统配置发生变化后,Activity会被销毁,其中onPause,onStop,onDestroy均会被调用,同时由于Activity是在异常情况下终止,系统会调用onSaveInstanceState来保持当前Activity的状态。这个方法的回调是发生在onStop之前,可能在onPause之前也可以能在之后。Activity被重新创建后系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState保存的Bundle对象作为参数传递给onRestoreInstanceState和onCreate方法。可以这么理解,系统在异常终止的时候才会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,其他情况不会执行这个过程。
2、资源内存不足导致低优先级的Activity被杀死
此场景数据的存储和恢复 与场景一一致,系统内存不足时候,系统会根据优先级去杀死目标Activity所在的进程。
优先级从高到低排序:
前台Activity-正在和用户交互的Activity优先级别最高
可见但非前台Activity-比如Activity中弹出一个Dialog,导致Activity可见但是不能与用户交互。
后台Activity-已经被暂停的Activity,比如已经执行了onStop,优先级最低。
问题四、onStart和onResume、onPause和onStop从描述上看是差不多,对于我们来说本质的区别在哪里?
本质区别在于参考系不一样,从Activity的是否可见的角度来回调onStart,onStop;从Activity是否能与用户交互的角度来回调onResume,onPause
问题五、假设当前Activity为A,如果这时用户打开一个新的ActivityB,那么B的onResume和A的onPause哪个先执行呢?
这个问题有两种方法可以验证,第一、通过阅读Android启动Activity的源码;第二可以通过代码逻辑来验证,在当前ActivityA中打开一个新的ActivityB并且打印日志,执行结果:A onPause--> B onResume。
好了,Activity生命周期分析篇章就已经完结了,大家可以通过实践去加深自己的理解;如有错误,请大家纠正,谢谢!