写点什么

Android 开发艺术探索笔记(1)

用户头像
Android架构
关注
发布于: 2021 年 11 月 07 日

onStart()和 onStop()是对于 Activity **是否可见**这个角度来进行的方法


而 onResume()和 onStop()是对于 Activity **是否处于前台**这个角度来进行的方法,除此之外没有实质的区别


2. 假设当前的 Activity 为 A,如果用户这个时候打开一个新的 Activity B,那么 B 的 onResume()和 A 的 onPause()哪一个先执行?


简单理解,启动 Activty 的请求会由 Instrumentation 来处理,然后它通过 Binder 向 AMS(**Activi


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


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 添加属性。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android 开发艺术探索笔记(1)