WindowManagerService
- 运行与独立的进程system_server中
- 当应用程序需要创建窗口时,通过进程通信的方式请求WMS窗口,由WMS向应用程序传递和窗口相关的交互消息
- 所有程序的窗口都在服务端管理,窗口的显示和控制都在WMS里处理
- mExitingTokens,保存了所有具有同一个token的WindowState
- AppWindowToken继承于WindowToken,专门用于标识一个Activity,AppWindowToken里的token实际上就是指向一个Activity
- ActivityManagerService通知应用启动的时候,在服务端生成一个token用于标识该Activity,并且把该token传递到应用客户端
客户端的Activity在申请添加窗口时,以该token作为标识传递到WindowManagerService,同一个Activity中的主窗口,对话框窗口, - 菜单窗口都关联到同一个AppWindowToken
WindowManager
- 一个接口,继承于ViewManager 调用addView()创建窗口时真正交互的是WindowManagerImpl
子类:WindowManagerImpl
创建:在activity的makeVisiable方法执行时会ViewManager wm= getWindowManager();进而会执行mWindowManager = mWindow.getWindowManager();最后会在Window类中看到这么一句:mWindowManager = new LocalWindowManager(wm, hardwareAccelerated);就是这里创建的
WindowManagerImpl
- 管理单个应用的所有本地窗口
- 在Client端,并不直接和WMS交互,而是直接和本地对象WindowManager(实际上是和WindowManager的实现类WindowManagerImpl)交互
然后由WindowManager完成和WindowManagerService交互
ViewRootImpl
- 本质上是一个Handler
- ViewRootImpl和WMS之间的双向对话,主要通过以下的两个数据结构进行
IWindowSession负责ViewRootImpl到WMS单向请求
IWindow用于WMS回调ViewRootImpl
这两个数据结构都是标准的aidl接口,用于进程间同步通信
在ViewRootImpl内部,存在着一个IWindowSession的静态成员和一个IWindow的非静态成员
所以一个进程只有一个IWindowSession对象,但是可以有多个IWindow对象
View的绘制就是在performTraversals()中启动的
Window
一个抽象类
PhoneWindow
- 继承于Window,里面核心是mDecor,是一个顶层View
- 窗口的添加就是通过调用getDecorView()获取到mDecorView并调用WindowManager addView()把View添加到WindowManager中的
PhoneWindow通过getDecorView()对外提供获取mDecor
Activity
- 应用程序初始化时,会首先生成一个activity对象,而这个activity对象没有属于自己的一个窗口,紧接着会调用attach()函数。
- 在attach()函数里面该activity会调用PolicyManager.makeNewWindow()创建一个新的PhoneWindow。
- 然后在activity的onCreate()生命周期里,一般会调用应用的setContentView()设置activity的显示界面
- 在activity的setContentView()方法里面会执行如下:
- getWindow().setContentView(layoutResID);
- 初始化private DecorView mDecor; mDecor是DecorView对象,是FrameLayout的子类还有初始化private ViewGroup mContentParent这个变量mDecor就是我们的根View 根据theme中的属性值,选择合适的布局,通过infalter 放入到我们的mDecor中在这些布局中,一般会包含ActionBar,Title和一个id为content的FrameLayout最后,我们在activity中设置布局,会通过LayoutInflater inflater(我们的布局)包含到id为content的FrameLayout中
- 因此,我们的操作主要是控制id为content的FrameLayout范围同时,mContentParent就是mDecor中id为content的View最后,当AMS准备resume一个activity时,会回调该activity的handlerResumeActivity方法该方法会调用activity的makeVisible(将其添加到WindowManager中)方法,显示我们刚才创建的mDecor视图Activity类中的mWindowManager(WindowManager对象)来自于Window类new的一个LocalWindowManager对象,其实
ActivityManager
负责一个新的Activity Thread创建
ActivityManagerProxy是ActivityManagerNative的内部类
ActivityManagerNative是一个抽象类,真正发挥作用的是其子类ActivityManagerService(系统Service组件)
使用ActivityManagerProxy来代理ActivityManagerNative的子类ActivityManagerService
ActivityManagerService的本地代理对象ActivityManagerProxy
ActivityManagerService
是一个Binder类,即可实现跨进程通信,运行于服务端
ProcessRecord记录每个进程里面的全部信息,主要信息是包括该进程中包含的Activity、Provider、Service等信息,进程文件信息,该进程的内存状态信息
HistoryRecord对象来管理和统计对应客户端Activity信息,该类是一个Binder类,可以跨进程调用
TaskRecord记录每个任务task信息,Activity可以运行在不同的Task中
ActivityThread
应用程序所对应的进程主线程类,即我们通常所说的UI线程
handleLauncheActivity、handleResumeActivity、handlePauseActivity、handleStopActivity、scheduleResumeActivity等方法都在这个类里面,
貌似Activity生命周期方法都在这个类里面调用
ApplicationThread
ActivityThread的内部类
该类是一个Binder类,即可实现跨进程通信,主要用于接受从AMS传递过来的信息,继而作相应的处理
H类
是一个Handler子类,该类仅仅是为了异步调用而设计,使用方式同handler一样
ActivityRecord
ActivityThread内部类
在客户端保存当前Activity的相关信息,方便ActivityThread管理维护Activity
客户端包含IBinder token属性,该token变量实际指向的ActivityManagerService的HistoryRecord对象
View
ViewRootImpl
本质上是一个Handler
Activity setContentView过程
首先初始化mDecor,即DecorView为FrameLayout子类,就是我们整个窗口的根视图了
然后,根据theme中的属性值,选择合适的布局,通过inflater放入到我们的mDecor中
在这些布局中,一般会包含ActionBar,Title和一个id为content的FrameLayout
最后,我们在Activity中设置的布局,会通过infalter压入到我们的id为content的FrameLayout中去
ServiceManager
Service在被使用之前,必须要向ServiceManager(简称SM)注册
同时客户端要访问某个Service时,应该首先向SM查询是否存在该服务
如果SM存在该这个Service,那么会将该Service的handler返回给client,handler是每个Service的唯一标识
当Service向SM注册时,该Service就是一个client,而SM则作为了Server。而某个进程需要与Service通信时,
此时这个进程为client,Service才作为Server,因此Service不一定为Server,有时它也作为client存在
应用和Service之前的通信会涉及到2次binder通信
应用向SM查询Service是否存在,如果存在获得该Service的代理binder,此为一次binder通信
应用通过代理binder调用Service的方法,此为二次binder通信