文章目录
- 四大组件
- 基本概念
- Activity
- zygote是什么?有什么作用?
- SystemServer是什么?有什么用,与zygote的关系是什么?为什么称为服务端对象?
- APP、AMS、zygote是三个独立的进程,他们之间如何通信呢?(IPC通信方式)
- Launcher是什么?什么时候启动的?
四大组件
基本概念
- ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期。
- ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作。
- ApplicationThread,用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯。
- ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的。
- Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。
- ActivityStack,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
- ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。
- TaskRecord,AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。如果你清楚Activity的4种launchMode,那么对这个概念应该不陌生。
Activity
zygote是什么?有什么作用?
fork
是Unix/Linux操作系统中的一个用于创建新进程的系统调用函数,fork会复制原进程的所有内容包括代码、数据和内存空间。
zygote
:直译为受精卵
,zygote
是一个进程的名字,Android是基于Linux
系统的,当手机开机后,Linux内核加载完成之后就会启动一个init
的进程,在Linux系统中,所有的的进程都是init
进程fork
出来的,zygote
进程也不例外。
每一个APP其实都是:
- 一个单独的dalvik虚拟机
- 一个单独的进程
当系统里边的第一个zygote
进程运行之后,开启APP,就相当于新开启一个进程,而为了实现资源共用和更快的启动速度,Android系统开启新进程的方式是通过fork一个zygote进程实现的。
就像受精卵这种有遗传物质的细胞一样,快速进行分裂。
SystemServer是什么?有什么用,与zygote的关系是什么?为什么称为服务端对象?
zygote进程后开启后会执行startSystemServer(),fork
出SystemServer进程
SystemServer是Android Framework中除zygote外另一个十分重要的线程,系统里边的重要服务:ActivityManagerService、PackageManagerService、WindowManagerService都在这个线程中开启。
服务端/客户端模型不仅仅存在于Web开发中,在Android框架设计中也是这种模式,服务端是所有APP共有的系统服务,比如上边提到到AMS(活动管理服务)、PMS(包管理服务)、WMS(窗口管理服务),而客户端指的就是Android系统上的各种APP,当某个APP要实现某个操作,需要告诉这些系统服务,例如如果想要打开一个App,最终是由AMS通知zygote进程来fork一个新进程,进而开启目标APP的。
APP、AMS、zygote是三个独立的进程,他们之间如何通信呢?(IPC通信方式)
APP与AMS通过Binder进行IPC通信,AMS与zygote通过Socket进行IPC通信。
Launcher是什么?什么时候启动的?
当我们点击手机桌面上的图标时,App就由Launcher开始启动,Launcher本质上也是一个应用程序,和我们的App一样,也是继承自Activity,Launcher实现了点击、长按等回调接口,来接收用户的输入。Launcher中开启一个App,其实和我们在Activity中直接startActivity()基本一样,都是调用了Activity.startActivityForResult()。