前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >说说Activity的启动流程

说说Activity的启动流程

作者头像
码农帮派
发布2021-02-25 11:51:35
5440
发布2021-02-25 11:51:35
举报
文章被收录于专栏:码农帮派码农帮派

Activity是一个组件,组件的启动是要通过AMS的,和Application的启动一样,Activity的启动也会涉及到AMS、Zygote以及应用进程之间的socket通信以及Binder调用。

上图就是Activity组件启动的流程,当我们通过startActivity启动一个Activity组件的时候,系统首先会向AMS发起调用,AMS会首先检查当前Activity组件所在的应用进程是否已经被启动。

要是应用进程没有启动:

  • 1. AMS通过本地socket向Zygote发送应用进程启动的请求;
  • 2. Zygote接收到请求之后,fork子进程,fork函数会返回两次pid,pid大于0表示当前在父进程(Zygote进程)中,会将子进程的pid发送给AMS,pid等于0表示当前在子进程中,此时会初始化一些子进程的系统资源和服务,子进程的Binder机制就是在这个时候启动的;
  • 3. 子进程在启动完成之后,会通过Binder调用向AMS上报,并将子进程的Binder句柄一并上报到AMS中进行注册,如上图中的attachApplication
  • 4. AMS在收到应用进程的上报之后,就拿到了应用进程的Binder句柄,就会通过应用进程的Binder句柄,调用应用进程开始创建Application,如上图中的bindApplication
  • 5. bindApplication不会等待Application创建完成,而是立即返回;
  • 6. 之后AMS会在此通过应用进程的Binder调用,调用应用进程创建Activity组件,如上图中的scheduleLaunchActivity

要是应用进程已经启动,就是有上面的6,AMS直接通过应用的Binder调用,调用应用进程创建Activity组件。

上面的跨进程通信的过程中,除了AMS和Zygote的通信方式是本地socket,其他的跨进程通信都是通过Binder机制完成的。

AMS在通过Binder调用,调用应用进程启动Activity组件的过程中:

1. 首先应用进程会通过ClassLoader加载对应的class字节码文件;

2. 通过newInstance创建一个Activity的实例,此步调用了Activity的构造函数;

3. 创建一个ContextImpl对象实例,通过Activity实例的attachBaseContext复制到ContextWrap的mBase(mBase是context的服务托管,所有对Activity的Context的调用,实际上都是通过mBase来完成的);

4. 经历上面的流程之后,就会调用Activity实例的生命周期onCreate、onResume、onStart

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农帮派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档