Framework概述

Framework概述

Framework框架包含三个部分,分别为客户端、服务端和Linux驱动。

服务端:
包含两个重要的类,分别是WindowManagerService(WmS),作用是:各窗口的叠放次序,隐藏或者显示窗口,和ActivityManagerService(AmS),作用是:管理所有的应用程序中的Activity。
除此之外,服务端还包括了两个消息处理类,KeyQ类:该类为WmSd的内部类,继承于KeyInputQueue类,KeyQ对象一旦创建,就立即启动一个线程,该线程会不断地读取用户UI操作的消息,比如按键、触摸屏幕、trackball、鼠标等,并把这些消息放到一个消息队列QueueEvent类中。这里的QueueEvent类应该就是我们平时所说的MessageQueue类吧。
InputDispatcherThread类:该类的对象一旦创建,也会立即启动一个线程,该线程会不断地从QueueEvent中取出用户消息类并进行一定的过滤,过滤后,再将这些消息发送给当前活动的客户端程序中。
 
客户端:
有以下重要的类,
ActivityThread类:该类作为应用程序的主线程类,所有的APK程序都有且仅有一个ActivityThread类,程序的入口为该类的static main()函数,ActivityThread所在的线程为UI线程。
Activity类:该类为APK程序的一个最小的运行单元,换句话说就是主线程可以动态加载可执行代码的最小单元类,一个APK程序中可以包含多个Activity对象,ActivityThread会根据用户操作选择动态加载哪个Activity对象。
PhoneWindow类:该类继承于Window类,同时PhoneWindow类内部包含了一个DecorView对象,DecorView的父类是FrameLayout,因此,该PhoneWindow是内含一个View对象,并且提供了一组通用窗口操作API。
Window类:该类提供了一组通用的窗口操作API,这里的窗口仅仅是客户端程序层面上的,WmS所管理的窗口并不是Window类,而是一个View或者ViewGroup类,对于PhoneWindow类而言,就是其内部包含的DectorView类,Window是一个abstract类型。
DecorView类:该类是一个FrameLayout的子类,并且是PhoneWindow中的一个内部类,Decor的英文是Decoration,即,修饰的意思,DecorView就是对普通的FrameLayout进行了一定的修饰,比如添加一个Title bar,并响应特定的按键消息。
ViewRoot类:WmS管理客户端窗口时,需要通知客户端进行某种操作,这些操作都是IPC调用完成的,而在客户端窗口收到IPC调用后,都会把该类转换为本地的一个异步的调用,实现方式就是使用Handler,ViewRoot就是继承于Handler,其作用就是把WmS的IPC调用转换为本地的一个异步调用。
W类:继承于Binder类,并且是ViewRoot的一个内部类,WmS通知客户端窗口时,是通过IPC调用,也就是调用到该Binder类,然后该Binder类内部的处理函数一般会给该类所在的ViewRoot发送一个Handler消息,以便进行异步处理。
WindowManager类:客户端要申请创建一个窗口,而具体创建窗口的任务是由WmS完成的,WindowManager类就像一个部门经理,谁有什么需求就告诉它,由它和WmS进行交互,客户端不能直接和WmS进行交互。
了解了上面相应类的作用之后,下面介绍一个APK程序的运行过程:
首先,ActivityThread从main()函数开始执行,调用prepareMainLooper()为UI线程创建一个消息队列(MessageQueue).然后创建一个ActivityThread对象,在ActivityThread的初始化代码中会创建一个Handler对象和一个ApplicationThread(Binder)对象。其中的Binder对象负责接收远程AmS的IPC调用,接收到调用后,则通过Handler把消息发送到消息队列,UI线程会异步地从消息队列中取出消息并执行相应的操作。比如start,stop,pause等。接着UI线程调用Looper.loop()方法进行消息循环体,进入后就会不断地从消息队列中读取并处理消息。
当ActivityThread接收到AmS发送某个Activity之后,就会创建指定的Activity对象,Activity又会创建PhoneWindow类--DecorView类--创建相应的View类或者ViewGrop,创建完成之后,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或者ViewGrop,如果还没有处理,则传递给PhoneWindow,最后再传递给Activity。
 
客户端中的线程:
Android的APK程序中都有哪些线程呢?
很明确地讲,包含Activity的客户端程序至少包含三个线程,每个Binder对象都对应一个线程,Activity启动之后会创建一个ViewRoot.W对象,同时ActivityThread会创建一个ApplicationThread对象,这两个对象都继承于Binder,因此会启动两个线程,负责接收LinuxBinder驱动发送的IPC调用,最后一个主要线程就是本程序所在的线程,也叫作用户交互(UI)线程,因为所有的处理用户消息以及绘制界面的工作都在该线程中完成。
 
自定义个Thread和UI线程有什么区别?
UI线程是从ActivityThread运行的,在该类的main()方法中,已经使用Looper.prepareMainLooper()为该线程添加Looper对象,即已经为该线程创建了消息队列(MessageQueue),因此,我们才能够在Activity中定义Handler对象,(因为声明Handler对象的时候,所在的线程必须已经创建了MessageQueue),而普通的自定义的Thread是一个裸线程,因此不能直接在Thread中定义Handler对象,从使用场景来讲,即不能直接给Thread对象发送消息,但是却可以给UI线程发送消息。

 

Android窗口管理服务WindowManagerService显示窗口动画的原理分析

http://blog.csdn.net/luoshengyang/article/details/8611754

 

 

 

来源:http://blog.sina.com.cn/s/blog_49f62c3501010aml.html

 
posted @ 2016-05-04 21:54  月之漫步  阅读(358)  评论(0编辑  收藏  举报