问题:Activity的启动流程是怎样的?
- 是否熟悉Activity启动过程中与AMS交互过程(高级)
- 是否熟悉Binder的通讯机制(高级)
- 是否了解插件化框架如何 Hook Activity启动(高级)
- 阐述Activity转场动画的实现原理可加分(中级)
- 阐述Activity的窗口显示流程可加分(高级)
题目剖析 Activity、启动流程
- 与AMS如何交互
- Activity的参数和结果如何传递
- Activity如何实例化
- Activity生命周期如何流转
- Activity的窗口如何展示
- Activity转场动画的实现机制
Activity跨进程启动
请求进程A startActivity(通过AMP[AMS的Android客户端代理]])发送请求[Binder通信]
system_server进程接收请求 通过AMS(Android Manger Server Android系统服务)接收请求处理{
- 解析Activity信息
- 处理启动参数
- 启动目标进程
- 绑定新进程
}
AMS通过Zygote开启进程B,然后使用ATP(Application Thread)[Binder通信]将数据绑定在进程从而启动进程B
Activity进程内启动
请求进程A startActivity(AMP)-> system_server进程
system_server进程接收到AMS后{
- 解析Activity信息
- 处理启动参数
}(ATP)-> 请求进程A(ApplicationThread)
在这期间可以引出插件化的Hook点
比如startActivity发送AMP前 我们Mainfest的栈坑替换为插件的栈在发送,system_server发送ATP后,到达ActivityThread启动Activity生命周期前这一步,将要启动的Activity替换为插件的Activity即可实现插件化的启动
Activity的参数传递
请求进程A(携带Bundle) -> Binder缓冲区 -> system_server进程(Bundle)
大小受缓冲区大小限制
数据必须可以序列化
↑解决方案
如果在同一个进程
Activity->ActivityB 传递Key,再用Key去拿外部存储的值即可(可以是内存,或者持久化){跨进程需要实现进程通讯机制
}
Activity和Fragment为什么不能弄有参数的构造器?
因为在Activity状态保存恢复的时候,他会将Fragment保存在Bundle中,当Bundle恢复Fragment的时候,他也是通过newInsatance创建出来,如果你的Fragment构造器有参数,那么他并不知道该如何创建出来,所以最好不要让Fragment和Activity的构造器有参数
Activity的窗口如何展示
从上到下顺序
new Activity
activity-attach(创建了PhoneWindow createPhoneWindow)
activity-create
activity-start
activity-restoreState
activity-postCreate(创建了Decor installDecor)
activity-resume
activity-makeVisible(对DecorView进行绘制并展示)
本节回顾
- Activity启动流程是一个庞大的题目,足够灵活
- 启动过程中涉及到与AMS的交互与插件化紧密相关
- 参数传递机制可与框架设计联系进行迁移
- 生命周期与窗口展示可以向时间处理、UI绘制等话题迁移