Activity的启动流程
2017-05-17 16:41
190 查看
很多做应用的开发者其实并不了解Activity的启动流程,但经常面试的时候面试官又喜欢问一些framework层相关的问题,并且在实际开发中可以帮你定位问题的原因,所以在这里就学习下Activity启动流程吧。
这里结合网上的资料和自己的理解画了一幅图:
从图中大概的看出分为4个部分:Launcher(或者是其它进程的activity), AMS(ActivityManagerService), Zygote, 新创建的activity; 由于他们都是存在于不同的进程中,所以需要跨进程通信,其中App与AMS通过Binder进行IPC通信(图中的IActivityManager和IAppilicationThread都是Binder接口),AMS(SystemServer进程)与zygote通过Socket进行IPC通信。
解释下各部分的类都做了什么事情:
ActivityManagerService 是一个系统服务,负责系统中所有Activity的生命周期;
ActivityThread App的主入口,在其performLaunchActivity方法中创建Activity和Appilication,我们的Activity就是在这里被new处理的;并且它会开启消息循环队列,就是我们经常用的UI线程或者主线程;与ActivityManagerService进行通信的就是这个类;
Instrumentation 这个类和ActivityThread交互紧密,刚才说的activity具体就是在这个类里new出来的,相当于是一个ActivityThread的一个助手类,一些具体操作都是在这个类里完成的,每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象;
ApplicationThread 用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯;
ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的;
ActivityStack,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程;
ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像
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方法。
这里结合网上的资料和自己的理解画了一幅图:
从图中大概的看出分为4个部分:Launcher(或者是其它进程的activity), AMS(ActivityManagerService), Zygote, 新创建的activity; 由于他们都是存在于不同的进程中,所以需要跨进程通信,其中App与AMS通过Binder进行IPC通信(图中的IActivityManager和IAppilicationThread都是Binder接口),AMS(SystemServer进程)与zygote通过Socket进行IPC通信。
解释下各部分的类都做了什么事情:
ActivityManagerService 是一个系统服务,负责系统中所有Activity的生命周期;
ActivityThread App的主入口,在其performLaunchActivity方法中创建Activity和Appilication,我们的Activity就是在这里被new处理的;并且它会开启消息循环队列,就是我们经常用的UI线程或者主线程;与ActivityManagerService进行通信的就是这个类;
Instrumentation 这个类和ActivityThread交互紧密,刚才说的activity具体就是在这个类里new出来的,相当于是一个ActivityThread的一个助手类,一些具体操作都是在这个类里完成的,每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象;
ApplicationThread 用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯;
ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的;
ActivityStack,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程;
ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一个ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像
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方法。
相关文章推荐
- launcher界面点击应用图标启动Activity流程分析
- Android进阶系列之源码分析Activity的启动流程
- Activity启动流程
- Android系统应用框架篇:Activity启动流程(二)
- Activity的启动流程
- Android基础学习【历史流程重走】 ----Activity启动模式
- Android(1):Android创世纪(2)Activity启动流程(3)为控件绑定监听器
- activity 启动流程分析
- Activity 启动流程
- 【Android】源码分析 - Activity启动流程
- activity启动流程实例+设置流程变量+获取流程变量+向后执行一步
- Android:图解Activity启动流程源码(整体流程)
- activity的启动流程及框架
- Activity启动流程
- 深入理解Activity启动流程(三)–Activity启动的详细流程1
- Android Activity启动流程(三)–Activity启动的详细流程
- 捋一捋 Activity 的启动流程 以及 界面的初始化过程
- android N进程启动流程(二)(上一个activity的暂停、进程启动、绑定进程与创建application)
- Activity启动流程
- Activity启动流程