一、Framework组成

深入理解android内核设计思想 第2版pdf android内核剖析_消息队列

1.服务端组成

a.WindowManagerService

决定各窗口的叠放次序、隐藏或者显示窗口

b.ActivityManagerService

  管理应用程序中所有的activity

c.KeyQ

  Wms内部类,继承于KeyInputQueue,一旦创建就会立即启动一个线程负责读取用户的UI相关操作,如,按键、触摸屏等,并把消息放到QueueEvent类中

d.InputDispatcherThread

  一旦创建立即启动一个线程从QueueEvent读取用户消息,并进行过滤,然后发给当前活动的客户端程序

深入理解android内核设计思想 第2版pdf android内核剖析_客户端_02

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进行交互

深入理解android内核设计思想 第2版pdf android内核剖析_消息队列_03

3.Linux驱动

a.SurfaceFlingger(SF)

 对应每一个窗口,把各个Surface显示在同一个屏幕上

b.Binder

  提供跨进程的消息传递

二、APK程序的运行过程

深入理解android内核设计思想 第2版pdf android内核剖析_客户端_04

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程序都有哪些进程?

深入理解android内核设计思想 第2版pdf android内核剖析_消息队列_05

如图所示,共有三个线程,一个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就是通过此接口来获得对消息的处理机会

深入理解android内核设计思想 第2版pdf android内核剖析_UI_06

c.ViewRoot类:

     客户端(WindowManager)创建窗口时的一个代理,用来和Wms进行交互,通过其内部的W类.Wms管理的每个窗口都会对应一个ViewRoot类

d.W类

     ViewRoot的一个内部类,继承与Binder,用于向Wms提供一个IPC接口,从而让Wms控制窗口客户端的行为