1.Framework 框架
Framework 定义了客户端组件和服务端组件功能及接口,包含三个主要部分,分别为服务端、客户端和Linux 驱动。
1.服务端
服务端主要包含两个重要类,分别是WindowManagerService(WmS)和ActivityManagerService(AmS)。WmS 的作用是为所有的应用程序分配窗口,并管理这些窗口。包括分配窗口的大小,调节各窗口的叠放次序,隐藏或者显示窗口。AmS 的作用是管理所有应用程序中的Activity。
除此之外,在服务端还包括两个消息处理类。
KeyQ 类:该类为WmS 的内部类,继承于KeyInputQueue 类,KeyQ 对象一旦创建,就立即启
动一个线程,该线程会不断地读取用户的UI 操作消息,比如按键、触摸屏、trackball、鼠标等,
并把这些消息放到一个消息队列QueueEvent 类中。
InputDispatcherThread 类:该类的对象一旦创建,也会立即启动一个线程,该线程会不断地从
QueueEvent 中取出用户消息,并进行一定的过滤,过滤后,再将这些消息发送给当前活动的客
户端程序中。
KeyQ 类:该类为WmS 的内部类,继承于KeyInputQueue 类,KeyQ 对象一旦创建,就立即启
动一个线程,该线程会不断地读取用户的UI 操作消息,比如按键、触摸屏、trackball、鼠标等,
并把这些消息放到一个消息队列QueueEvent 类中。
InputDispatcherThread 类:该类的对象一旦创建,也会立即启动一个线程,该线程会不断地从
QueueEvent 中取出用户消息,并进行一定的过滤,过滤后,再将这些消息发送给当前活动的客
户端程序中。
2.客户端
客户端主要包括以下重要类。
ActivityThread 类:该类为应用程序的主线程类,所有的APK 程序都有且仅有一个ActivityThread
类,程序的入口为该类中的static main()函数。
Activity 类:该类为APK 程序的一个最小运行单元,一个APK 程序中可以包含多个Activity 对
象,ActivityThread 主类会根据用户操作选择运行哪个Activity 对象。
PhoneWindow 类:该类继承于Window 类,同时,PhoneWindow 类内部包含了一个DecorView
对象。简而言之,PhoneWindow 是把一个FrameLayout 进行了一定的包装,并提供了一组通用
的窗口操作接口。
Window 类:该类提供了一组通用的窗口(Window)操作API,这里的窗口仅仅是程序层面上
的,WmS 所管理的窗口并不是Window 类,而是一个View 或者ViewGroup 类,一般就是指
DecorView 类,即一个DecorView 就是WmS 所管理的一个窗口。Window 是一个abstract 类型。
DecorView 类:该类是一个FrameLayout 的子类,并且是PhoneWindow 中的一个内部类。Decor
的英文是Decoration,即“修饰”的意思,DecorView 就是对普通的FrameLayout 进行了一定的
修饰,比如添加一个通用的Title bar,并响应特定的按键消息等。
ViewRoot 类:WmS 管理客户端窗口时,需要通知客户端进行某种操作,这些都是通过异步消息
完成的,实现的方式就是使用Handler,ViewRoot 就是继承于Handler,其作用主要是接收WmS
的通知。
W 类:该类继承于Binder,并且是ViewRoot 的一个内部类。
WindowManager 类:客户端要申请创建一个窗口,而具体创建窗口的任务是由WmS 完成的,
WindowManager 类就像是一个部门经理,谁有什么需求就告诉它,由它和WmS 进行交互,客
户端不能直接和WmS 进行交互。
ActivityThread 类:该类为应用程序的主线程类,所有的APK 程序都有且仅有一个ActivityThread
类,程序的入口为该类中的static main()函数。
Activity 类:该类为APK 程序的一个最小运行单元,一个APK 程序中可以包含多个Activity 对
象,ActivityThread 主类会根据用户操作选择运行哪个Activity 对象。
PhoneWindow 类:该类继承于Window 类,同时,PhoneWindow 类内部包含了一个DecorView
对象。简而言之,PhoneWindow 是把一个FrameLayout 进行了一定的包装,并提供了一组通用
的窗口操作接口。
Window 类:该类提供了一组通用的窗口(Window)操作API,这里的窗口仅仅是程序层面上
的,WmS 所管理的窗口并不是Window 类,而是一个View 或者ViewGroup 类,一般就是指
DecorView 类,即一个DecorView 就是WmS 所管理的一个窗口。Window 是一个abstract 类型。
DecorView 类:该类是一个FrameLayout 的子类,并且是PhoneWindow 中的一个内部类。Decor
的英文是Decoration,即“修饰”的意思,DecorView 就是对普通的FrameLayout 进行了一定的
修饰,比如添加一个通用的Title bar,并响应特定的按键消息等。
ViewRoot 类:WmS 管理客户端窗口时,需要通知客户端进行某种操作,这些都是通过异步消息
完成的,实现的方式就是使用Handler,ViewRoot 就是继承于Handler,其作用主要是接收WmS
的通知。
W 类:该类继承于Binder,并且是ViewRoot 的一个内部类。
WindowManager 类:客户端要申请创建一个窗口,而具体创建窗口的任务是由WmS 完成的,
WindowManager 类就像是一个部门经理,谁有什么需求就告诉它,由它和WmS 进行交互,客
户端不能直接和WmS 进行交互。
3.Linux 驱动
Linux 驱动和Framework 相关的主要包含两部分,分别是SurfaceFlingger(SF)和Binder。每一个
窗口都对应一个Surface,SF 驱动的作用是把各个Surface 显示在同一个屏幕上。
Binder 驱动的作用是提供跨进程的消息传递。
Linux 驱动和Framework 相关的主要包含两部分,分别是SurfaceFlingger(SF)和Binder。每一个
窗口都对应一个Surface,SF 驱动的作用是把各个Surface 显示在同一个屏幕上。
Binder 驱动的作用是提供跨进程的消息传递。
2.应用程序的运行
首先,ActivityThread 从main()函数中开始执行,调用prepareMainLooper()为UI 线程创建一个消息
队列(MessageQueue)。
然后创建一个ActivityThread 对象,在ActivityThread 的初始化代码中会创建一个H(Handler)对
象和一个ApplicationThread(Binder)对象。其中Binder 负责接收远程AmS 的IPC 调用,接收到调用
后,则通过Handler 把消息发送到消息队列,UI 主线程会异步地从消息队列中取出消息并执行相应操作,
比如start、stop、pause 等。
接着 UI 主线程调用Looper.loop()方法进入消息循环体,进入后就会不断地从消息队列中读取并处
理消息。
当 ActivityThread 接收到AmS 发送start 某个Activity 后,就会创建指定的Activity 对象。Activity
又会创建PhoneWindow 类→DecorView 类→创建相应的View 或者ViewGroup。创建完成后,Activity
需要把创建好的界面显示到屏幕上,于是调用WindowManager 类,后者于是创建一个ViewRoot 对象,
该对象实际上创建了ViewRoot 类和W 类,创建ViewRoot 对象后,WindowManager 再调用WmS 提供
的远程接口完成添加一个窗口并显示到屏幕上。
接下来,用户开始在程序界面上操作。KeyQ 线程不断把用户消息存储到QueueEvent 队列中,
InputDispatcherThread 线程逐个取出消息,然后调用WmS 中的相应函数处理该消息。当WmS 发现该
消息属于客户端某个窗口时,就会调用相应窗口的W 接口。
W 类是一个Binder,负责接收WmS 的IPC 调用,并把调用消息传递给ViewRoot,ViewRoot
再把消息传递给UI 主线程ActivityThread,ActivityThread 解析该消息并做相应的处理。在客户端程
序中,首先处理消息的是DecorView,如果DecorView 不想处理某个消息,则可以将该消息传递给
其内部包含的子View 或者ViewGroup,如果还没有处理,则传递给PhoneWindow,最后再传递给
Activity。
队列(MessageQueue)。
然后创建一个ActivityThread 对象,在ActivityThread 的初始化代码中会创建一个H(Handler)对
象和一个ApplicationThread(Binder)对象。其中Binder 负责接收远程AmS 的IPC 调用,接收到调用
后,则通过Handler 把消息发送到消息队列,UI 主线程会异步地从消息队列中取出消息并执行相应操作,
比如start、stop、pause 等。
接着 UI 主线程调用Looper.loop()方法进入消息循环体,进入后就会不断地从消息队列中读取并处
理消息。
当 ActivityThread 接收到AmS 发送start 某个Activity 后,就会创建指定的Activity 对象。Activity
又会创建PhoneWindow 类→DecorView 类→创建相应的View 或者ViewGroup。创建完成后,Activity
需要把创建好的界面显示到屏幕上,于是调用WindowManager 类,后者于是创建一个ViewRoot 对象,
该对象实际上创建了ViewRoot 类和W 类,创建ViewRoot 对象后,WindowManager 再调用WmS 提供
的远程接口完成添加一个窗口并显示到屏幕上。
接下来,用户开始在程序界面上操作。KeyQ 线程不断把用户消息存储到QueueEvent 队列中,
InputDispatcherThread 线程逐个取出消息,然后调用WmS 中的相应函数处理该消息。当WmS 发现该
消息属于客户端某个窗口时,就会调用相应窗口的W 接口。
W 类是一个Binder,负责接收WmS 的IPC 调用,并把调用消息传递给ViewRoot,ViewRoot
再把消息传递给UI 主线程ActivityThread,ActivityThread 解析该消息并做相应的处理。在客户端程
序中,首先处理消息的是DecorView,如果DecorView 不想处理某个消息,则可以将该消息传递给
其内部包含的子View 或者ViewGroup,如果还没有处理,则传递给PhoneWindow,最后再传递给
Activity。