Android 开发艺术探索笔记(1)
onStart()和 onStop()是对于 Activity **是否可见**这个角度来进行的方法
而 onResume()和 onStop()是对于 Activity **是否处于前台**这个角度来进行的方法,除此之外没有实质的区别
2. 假设当前的 Activity 为 A,如果用户这个时候打开一个新的 Activity B,那么 B 的 onResume()和 A 的 onPause()哪一个先执行?
简单理解,启动 Activty 的请求会由 Instrumentation 来处理,然后它通过 Binder 向 AMS(**Activi
tyManagerService**)发送请求,AMS 内部维护者一个 ActivityStack 并负责栈内的 Activity 的状态同步,AMS 通过 ActivityThread 去同步 Activity 的状态从而完成生命周期方法的调用。在 ActivityStack 中的 ResumeTopActivityInnerLocker 方法中的代码看出需要栈顶的 Activity 先 onPause()后,新的 Activity 才会启动。最终在 ActivityStackSupervisor 中的 realStartActivityLocked 方法中调用 scheduelLaunchActivity 方法实现了新的 Activity 的 onCreate、onStart、onResume 的调用。
因此得出结论是**旧的 Activity 先 onPause,新的 Activity 再启动**。
下面是实现 新的 Activity 的 onCreate 等的的源码
打印日志显示:
官方文档规定我们在 onPasue 中尽量不要做重量级的耗时的回收操作,onStop 亦然。所以在 onStop 中做一些稍微重量级的耗时操作而不是在 onPause 里。
<异常情况下的生命周期分析>
3. 资源相关的系统配置发生改变导致 Activity 被杀死并重新创建。
屏幕突然从竖屏旋转到横屏,Activity 的生命周期会被销毁并且重新创建。下图为默认情况的生命周期图。
可知,当发生异常终止,则在 onDestory()之前调用**onSaveInstanceState()来保存当前状态,在下个 Activity 创建 onCreate()之后用传来的 Bundle 的 SavaInStacneState 调用 onRestoreInstanceState()**来加载之前的状态。Actvity 重启后为我们来恢复这些数据,比如文本框的用户输入的数据,ListView 的滚动位置等,每个 View 都有 onSaveInstanceState 和 onRestoreInstanceState 这两个方法。
恢复流程:Activty 首先保存了数据,然后委托 Window 去保存数据,Window 再委托它上面的顶级容器去保存数据。顶级容器是是 ViewGroup 或者 DecorView,通知它们的子 View 来保存。
总之,当 onRestoreInstanceState 被调用时,系统一定出现了异常终止的 Activity,参数 Bundle SaveInstanceState 一定是有值的。onCreate 中也可以去通过额外判断 SaveInstanceState 是否非空(因为正常启动一定是 null)来恢复信息。但官方文档建议我们还是在 onRestoreInstanceState()方法中进行恢复!
4. 资源内存不足导致低优先级的 Activity 被杀死
数据恢复情况和过程和情况 3 完全一致,Activity 的优先级分为三种
(1)前台 Activity——正在和用户交互的 Activity,优先级最高
(2)可见但非前台的 Activity——比如弹出了对话框,导致 Activity 可见但是位于后台无法和用户交互
(3)后台 Activity——已经被暂停的 Activity,比如执行了 onStop(),优先级最低。
当系统内存不足的时候会通过优先级去杀死目标 Activity 所在的进程,后续通过 onSaveInstanceState()和 onRestoreInstanceState()来恢复数据。可以通过将后台工作放在 Service 中,这样保证了进程不会被轻易的杀死。
<其他>
当我们不想在翻转屏幕的时候销毁并重建 Activity 的时候,我们可以通过给 ConfigChanges 添加属性。
评论