Nixo Home

Activity的启动流程是怎样的?

字数统计: 691阅读时长: 2 min
2019/07/01 Share

问题: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绘制等话题迁移
CATALOG
  1. 1. 问题:Activity的启动流程是怎样的?
  2. 2. 题目剖析 Activity、启动流程
  3. 3. Activity跨进程启动
  4. 4. Activity进程内启动
  5. 5. Activity的参数传递
  6. 6. Activity和Fragment为什么不能弄有参数的构造器?
  7. 7. Activity的窗口如何展示
  8. 8. 本节回顾