Activity的启动流程

来源:互联网 发布:软件系统设计实例 编辑:程序博客网 时间:2024/05/21 09:28

很多做应用的开发者其实并不了解Activity的启动流程,但经常面试的时候面试官又喜欢问一些framework层相关的问题,并且在实际开发中可以帮你定位问题的原因,所以在这里就学习下Activity启动流程吧。
这里结合网上的资料和自己的理解画了一幅图:
这里写图片描述

从图中大概的看出分为4个部分:Launcher(或者是其它进程的activity), AMS(ActivityManagerService), Zygote, 新创建的activity; 由于他们都是存在于不同的进程中,所以需要跨进程通信,其中App与AMS通过Binder进行IPC通信(图中的IActivityManager和IAppilicationThread都是Binder接口),AMS(SystemServer进程)与zygote通过Socket进行IPC通信。

解释下各部分的类都做了什么事情:

  1. ActivityManagerService 是一个系统服务,负责系统中所有Activity的生命周期;
  2. ActivityThread App的主入口,在其performLaunchActivity方法中创建Activity和Appilication,我们的Activity就是在这里被new处理的;并且它会开启消息循环队列,就是我们经常用的UI线程或者主线程;与ActivityManagerService进行通信的就是这个类;
  3. Instrumentation 这个类和ActivityThread交互紧密,刚才说的activity具体就是在这个类里new出来的,相当于是一个ActivityThread的一个助手类,一些具体操作都是在这个类里完成的,每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象;
  4. ApplicationThread 用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯;
  5. ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的;
  6. ActivityStack,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程;
  7. ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像
  8. TaskRecord,AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。如果你清楚Activity的4种launchMode,那么对这个概念应该不陌生

具体的启动流程如下:
1. 首先在Launcher上点击一个应用图标,会触发startActivity方法,这个方法是在Activity类里的,然后调用到Instrumentation的execStartActivity来和AMS进行通信;
2. AMS收到startActivity的指令后,会创建ActivityRecord、ActivityStack和TaskRecord,这时需要pause掉前一个activity(即launcher);
3. AMS这时会告诉前一个activity所在进程的ActivityThread,ActivityThread最后调的是Instrumentation里的CallActivityOnPause来Pause掉Activity,之后ActivityThread会告诉AMS已经Pause完了;
4. AMS向Zygote请求生成一个新的进程;
5. 在这个新的进程里调用main方法,创建ActivityThread;在attach方法中,ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;
6. ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。
7. 在ActivtyThread中先new一个Activity出来,再创建Appilication,调用Appilication的onCreate方法,再调用Activity的attach方法和onCreate方法。

原创粉丝点击