一、Framework组成
1.服务端组成
a.WindowManagerService
决定各窗口的叠放次序、隐藏或者显示窗口
b.ActivityManagerService
管理应用程序中所有的activity
c.KeyQ
Wms内部类,继承于KeyInputQueue,一旦创建就会立即启动一个线程负责读取用户的UI相关操作,如,按键、触摸屏等,并把消息放到QueueEvent类中
d.InputDispatcherThread
一旦创建立即启动一个线程从QueueEvent读取用户消息,并进行过滤,然后发给当前活动的客户端程序
2.客户端组成
a.ActivityThread
应用程序主线程类,所有APK程序有且仅有一个ActivityThread类,该类所在线程即为UI线程或主线程
b.Activity
主线程动态加载可执行代码的最小单元,一个APK程序可包含多个Activity类,ActivityThread类会根据用户操作选择加载哪一个Activity
c.DectorView
FrameLayout的子类,对FrameLayout进行一定的修饰
d.Window
提供一组通用窗口操作的API,Wms管理的不是该window,而是View或ViewGroup,也就PhoneWindow内部包含的DectorView
e.PhoneWindow
继承于Window,内部包含一个DectorView
f.ViewRoot
继承于Handler,把Wms的IPC调用转化为本地的一个异步调用;因为Wms在管理客户端窗口时,会通过IPC调用通知客户端进行某种操作,而客户端收到IPC调用请求后就会通过Handler转化为本地的一个异步调用
g.W类
继承于Binder类,并且是ViewRoot的内部类,Wms通知客户端窗口时,通过IPC调用,也就是调用到该Binder对象,然后该Binder会对该类所在的ViewRoot对象发送一个Handler消息,以便进行异步处理
h.WindowManager
负责客户端申请创建窗口的任务,与Wms进行交互,客户端就不用与Wms进行交互
3.Linux驱动
a.SurfaceFlingger(SF)
对应每一个窗口,把各个Surface显示在同一个屏幕上
b.Binder
提供跨进程的消息传递
二、APK程序的运行过程
a.ActivityThread.main()----->ActivityThread.prepareMainLoper(),为UI线程创建一个消息队列
b.创建ActivityThread对象----->创建一个Handler和ApplicationThread(Binder,负责接收远程Ams的IPC调用,通过前面创建的Handler把消息发送到消息队列中,UI线程异步取出消息并执行相关操作)
c.Ams.startActivity--->ActivityThread创建指定的Activity---->Activity创建PhoneWindow类--->DectorView--->View或者ViewGroup---->调用WindowManager创建ViewRoot并调用Wms的远程接口完成添加一个创建并显示在屏幕上
d.KeyQ接受用户的操作并存储到QueueEvent队列中,InputdispatcherThread线程逐个取出消息,调用Wms中的相应函数进行处理,Wms调用相应窗口的W接口
e.W类接受Wms的IPC调用--->把消息传递给ViewRoot---->Viewroot传递给UI线程ActivityThread-->ActivityThread解析该消息并作相应处理
三、客户端中的线程
1.Android APK程序都有哪些进程?
如图所示,共有三个线程,一个Main线程外加两个Binder线程(对应ActivityThread创建的ViewRoot.W和ApplicationThread,负责接收Linux驱动发送的IPC调用)
2.什么是UI线程?
负责处理所有的用户消息以及绘制界面
3.自定义Thread与UI Thread的区别?
UI线程在ActivityThread中运行,已经为其创建了消息队列,用户可直接在UI线程中使用Handler,而自定义线程是一个裸线程,不能直接使用Handler,需创建消息队列和消息循环,即:
new Thread(new Runnable() {
public void run() {
Looper.prerpareLooper();
//处理业务逻辑
Looper.loop();
}
}).start();
四、几个常见问题?
1.Activity如何传递消息?
a.利用Application共享,每个Activity对应的Application是唯一的
b.Intent
c.利用SharedPreference、文件、数据库进行
2.窗口的相关概念
a.窗口(非Window类):
程序员或用户看到屏幕上的一个独立界面,如Activity、对话框、菜单等.对于Wms,窗口是接收用户消息的最小单元,添加一个窗口就是添加一个View,Wms判断消息来自哪个View,然后通过IPC调用把这个消息传递给客户端的ViewRoot.W子类
b.Window类:
一个抽象类,抽象了客户端窗口的基本操作,并定义了一组Callback接口,Activity就是通过此接口来获得对消息的处理机会
c.ViewRoot类:
客户端(WindowManager)创建窗口时的一个代理,用来和Wms进行交互,通过其内部的W类.Wms管理的每个窗口都会对应一个ViewRoot类
d.W类
ViewRoot的一个内部类,继承与Binder,用于向Wms提供一个IPC接口,从而让Wms控制窗口客户端的行为