Activity的启动流程

Activity跨进程启动

  1. 请求进程A通过startActivity方法调用AMP
  2. system_server进程中的AMS执行:
    1. 解析Activity信息(androidManifest.xml)
    2. 处理启动参数
    3. 启动目标进程
    4. 绑定新进程
    5. 调用ATP(ApplicationThread代理)
  3. 目标进程B通过ApplicationThread调用ActivityThread,最终启动Activity的生命周期

AMP -> AMS 以及 ATP -> ApplicationThread都是通过binder进行通信的

Activity进程内启动

  1. 请求进程A通过startActivity方法调用AMP
  2. system_server进程中的AMS执行:
    1. 解析Activity信息(androidManifest.xml)
    2. 处理启动参数
    3. 调用ATP(ApplicationThread代理)
  3. 进程A过ApplicationThread调用ActivityThread,最终启动Activity的生命周期

Activity的参数传递

1
2
graph LR
请求进程A的Bundle -- Binder缓冲区 --> system_server进程的Bundle
  • 大小受缓冲区大小限制
  • 数据必须可以序列化

解决办法:

1
2
3
4
graph LR
ActivityA的Bundle -- Binder缓冲区-key --> ActivityB的Bundle
ActivityA的Bundle -- setData --> Model-data
Model-data -- getData --> ActivityB的Bundle

Activity之间的数据传递不能太大

Activity实例化

通过反射newInstance实现,所以不能对Activity添加构造方法。

同理,fragment也一样。

Activity的窗口如何展示

Activity转场动画的实现机制