6.Framework概述
Framework定义了客户端组件和服务端组件功能及接口.框架中包含了三个主要部分,分别为服务端,客户端和Linux驱动.
服务端主要包含两个重要类,分别是WindowManagerService(WMS)和ActivityManagerService(AMS).
客户端主要包括以下重要类:
- ActivityThread,该类为应用程序主线程类,所有的应用程序都有且仅有一个ActivityThread雷,程序的入口为该类中的static main()函数,ActivityThread所在的线程即为UI线程或主线程.
- Activity,该类为应用程序的一个最小运行单元,换句话说就是主线程动态加载可执行代码的最小单位类,一个应用程序中可以包含多个Activity对象,ActivityThred主类会根据用户操作选择动态加载哪个Activity对象.
- PhoneWindow,该类继承于Window类,同时PhoneWindow类内部包含了一个DecorView对象,DecorView的父类是FrameLayout,因此,PhoneWindow是包含一个View对象,并提供了一组通用窗口操作API.
- Window,该类提供了一组通用的窗口操作API,这里的窗口仅仅是客户端程序层面上的,WMS所管理的窗口并不是Window类,而是一个View或者ViewGroup类,对于PhoneWindow类而言就是其内部包含的DecorView类.Window是一个abstract类型.
- DecorView,该类是FrameLayout的子类,并且是PhoneWindow的一个内部类.DecorView就是对普通的FrameLayout进行了一定的修饰,比如添加一个通用的title bar,并响应特定的按键消息等.
- ViewRoot,WMS管理客户端窗口时,需要通知客户端进行某种操作,这些都是通过IPC调用完成的,而在客户端窗口收到IPC调用后,都会把该调用转换为本地的一个异步调用,实现的方式就是使用Handler,ViewRoot就是继承于Handler,其作用主要是把WMS的IPC调用转换为本地的一个异步调用.(高版本ViewRootImpl)
- W,该类继承于Binder,并且是ViewRootImpl的一个内部类,WMS通知客户端窗口时,是通过IPC调用,也就是调用到该Binder类,然后该Binder内部的处理函数一般会给该类所在的ViewRootImpl类发送一个Handler消息,以便进行异步处理.
- WindowManager,客户端要申请创建一个窗口,而具体创建窗口的任务是由WMS完成的,WindowManager和WMS进行交互,客户端不能直接和WMS进行交互.
Linux驱动和Framework相关的主要包含两部分,分别是SurfaceFlingger(SF)和Binder.每一个窗口都对应一个Surface,SF驱动的作用是把各个Surface显示在同一个屏幕上.Binder驱动的作用是提供跨进程的消息传递.
ActivityThread从main()函数开始执行,调用prepareMainLooper()为UI线程创建一个消息队列(MessageQueue).然后创建一个ActivityThread对象,在ActivityThread的初始化代码中会创建一个H(Handler)对象和一个ApplicationThread(Binder)对象.其中ApplicationThread对象负责接收远程AMS的IPC调用,接收到调用后,则通过Handler把消息发送到消息队列,UI主线程会异步地从消息队列中取出消息并执行相应操作,比如start,stop,pause等.接着UI主线程调用Looper.loop()方法进入消息循环体,进入后就会不断地从消息队列中读取并处理消息.当ActivityThread接收到AMS发送start某个activity后,就会创建指定的Activity对象.Activity又会创建PhoneWindow类->DecorView类->创建相应的View或者ViewGroup.创建完成后,Activity需要把创建好的界面显示到屏幕上,于是调用WindowManager类,后者于是创建一个ViewRootImpl对象,该对象实际上创建了ViewRootImpl类和W类,创建ViewRootImpl对象后,WindowManager再调用WMS提供的远程接口完成添加一个窗口并显示到屏幕上.接下来,用户开始在APP界面上操作,KeyQ线程不断地把用户消息存储到QueueEvent队列中,InputDispatcherThread线程逐个取出消息,然后调用WMS中的相应函数处理该消息.当WMS发现该消息属于客户端某个窗口时,就会调用相应窗口的W接口.W类是一个Binder,负责接收WMS的IPC调用,并把调用消息传递给ViewRootImpl,ViewRootImpl再把消息传递给UI主线程ActivityThread,ActivityThread解析该消息并做相应的处理.在客户端程序中,首先处理消息的是DecorView,如果DecorView不想处理某个消息,则可以将该消息传递给其内部包含的子View或者ViewGroup,如果还没有处理,则传递给PhoneWindow,最后再传递给Activity.
包含有Activity的客户端程序至少包含三个线程,每个Binder对象都对应一个线程,Activity启动后会创建一个ViewRootImpl.W对象,同时ActivityThread会创建一个ApplicationThread对象,这两个对象都继承于Binder,因此会启动两个线程,负责接收Linux Binder驱动发送IPC调用.最后一个主要线程也就是程序本身所在的线程,也叫做UI线程,因为所有的处理用户消息,以及绘制界面的工作都在改线程中完成.
- 窗口,从WMS的角度来讲,窗口是接收用户消息的最小单元,WMS内部用特定的类表示一个窗口,而给WMS中添加一个窗口是调用WindowManager类的addView()方法,也就是说,从WMS的角度来看,所谓添加一个窗口实际上就是添加一个View对象,至于这个View对象是来自于Activity还是用户自定义的一个View都不甚重要,WMS接收到用户消息后,首先要判断这个消息属于哪个窗口,即哪个View对象,然后通过IPC调用把这个消息传递给客户端的ViewRootImpl.W子类.
- Window,该类在android.view包中,是一个abstract类,该类抽象了"客户端窗口"的基本操作,并且定义了一组Callback接口,Activity类就是通过实现这个Callback接口以获得对消息处理的机会的,因为消息最初是由WMS传递给View对象的.
- ViewRootImpl,该类在android.view保重,客户端申请创建窗口时需要一个客户端代理,用以和WMS进行交互,ViewRootImpl内部类W就是完成这个功能的.WMS管理的每一个窗口都会对应一个ViewRootImpl类.
- W,该类是ViewRootImpl类的一个内部类,继承于Binder,用于向WMS提供一个IPC接口,从而让WMS控制客户端窗口的行为.