当前位置:   article > 正文

面试:Activity的启动流程简述_activity启动流程

activity启动流程

Activity的启动的整体流程:

1. Launcher进程请求AMS

2. AMS发送创建应用进程请求

3. Zygote进程接受请求并孵化应用进程

4. 应用进程启动ActivityThread

5. 应用进程绑定到AMS

6. AMS发送启动Activity的请求

7. ActivityThread的Handler处理启动Activity的请求

面试必备:Android(9.0)Activity启动流程(一) - 掘金

面试必备:Android(9.0)Activity启动流程(二) - 掘金

一、Launcher进程请求AMS

根Activity的启动流程其实就是桌面上点击一个应用图标进入到应用的第一个Activity的流程,其实桌面也可以看成一个程序,即Launcher。当系统开机后,Launcher也随之被启动,然后将已经安装的应用程序图标显示到桌面上,所以当我们点击一个应用图标其实就是相当于点击活动中的一个button,其相应事件就是Launcher进程请求AMS来启动该应用程序。

在这里插入图片描述

 

发现其实Launcher调用的startActivity其实就是Activity中的startActivity。从这里也可以证明Launcher其实也是个Activity。所以在Launcher启动一个app,和我们平时在startActivity基本是一样的。通过跨进程调用获取AMS,AMS引用作为服务端处于SystemServer进程中,与当前Launcher进程作为客户端与服务端不在同一个进程,所以am返回的是IActivityManager.Stub的代理对象,此时如果要实现客户端与服务端进程间的通信,只需要在AMS继承了IActivityManager.Stub类并实现了相应的方法,而通过下面的代码可以发现AMS刚好是继承了IActivityManager.Stub类的,这样Launcher进程作为客户端就拥有了服务端AMS的代理对象,然后就可以调用AMS的方法来实现具体功能了,就这样Launcher的工作就交给AMS实现了。

二、AMS发送创建应用进程请求

通过上面的分析,我们已经知道现在任务已经交给了AMS,入口是AMS的startActivity。

在这里插入图片描述

2.1 AMS将请求任务转移给Process

//获取即将要启动的Activity的所在的应用程序进程

//如果应用进程已经存在

//应用进程还未创建,则通过AMS调用startProcessLocked()向Zygote进程发送请求

//创建应用进程的用户ID --> startProcess()

2.2 Process向Zygote进程发送创建应用进程请求

与Zygote进程建立了Socket连接

这样AMS就完成了向Zygote进程发送创建应用进程的请求的任务。

三、Zygote进程接受请求并孵化应用进程

在这里插入图片描述

 现在Zygote进程接受请求是在main方法,

,就让我们来看看这个main方法

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

  1. @UnsupportedAppUsage
  2. public static void main(String argv[]) {
  3. ZygoteServer zygoteServer = new ZygoteServer();
  4. Runnable caller;
  5. try {
  6. ...
  7. //创建名为zygote的Socket
  8. zygoteServer.createZygoteSocket(socketName);
  9. ....
  10. //由于在init.rc中设置了start-system-server参数,因此
  11. //这里将启动SystemServer,可见SystemServer由Zygote创建的第一个进程
  12. if (startSystemServer) {
  13. Runnable r = forkSystemServer(abiList, socketName, zygoteServer);
  14. if (r != null) {
  15. r.run();
  16. return;
  17. }
  18. }
  19. caller = Zygote.initBlastulaPool();
  20. if (caller == null) {
  21. Log.i(TAG, "Accepting command socket connections");
  22. //等待AMS的请求
  23. caller = zygoteServer.runSelectLoop(abiList);
  24. }
  25. } catch (Throwable ex) {
  26. Log.e(TAG, "System zygote died with exception", ex);
  27. throw ex;
  28. } finally {
  29. zygoteServer.closeServerSocket();
  30. }
  31. // We're in the child process and have exited the select loop. Proceed to execute the
  32. // command.
  33. if (caller != null) {
  34. caller.run();
  35. }
  36. }
  37. 复制代码

通过main方法,我们可以知道在这个main方法首先要创建一个Server端的Socket,这个name为”zygote”的Socket用来等待ActivityManagerService来请求Zygote来创建新的应用程序进程,在上面AMS请求的分析中我们也知道客户端将根据这个name来与Zygote的Socket建立连接。接下去会启动SystemServer进程,这个进程会启动各种系统服务,比如与Activity启动息息相关的AMS。最后会调用ZygoteServer.runSelectLoop(abiList)来使创建的Socket进入无限循环,等待AMS请求。让我们来看看这个runSelectLoop

//监听Socket连接,充当服务端Socket

//不断处理客户端的AMS的请求,然后交给processOneCommand

可以发现这个方法是死循环表示不停的监听着Socket连接。acceptCommandPeer方法就是监听是否收到了请求,如果收到了请求就交给processOneCommand来实现

//获取应用程序进程的启动参数

//fork当前进程创建一个子进程

//pid为0则代表这个进程为子进程,即新创建的应用程序进程

于是到这里子进程也就是应用进程就被孵化出来了。你以为这样就结束了?其实还早呢!别忘了我们的最终使命是根Activity的启动,而现在只是有了根Activity所需要的应用进程,革命尚未成功,仍需要努力!

四、应用进程启动ActivityThread

在这里插入图片描述

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号