FrameWork概述

来源:互联网 发布:基于stack的列表 java 编辑:程序博客网 时间:2024/06/06 13:21

在Framework框架中包含三部分。分为服务端、客户端、linux驱动

服务端:

主要包含两个重要的类

WindowManagerService(WmS)

ActivityManagerService(AmS)主要用于管理所有应用程序中的Activity。 

还有两个消息处理类

KeyQ类:该类为WmS的内部类,集成于KeyInputQueue类,KeyQ类对象一旦创建,就立即启动一个线程,该线程会不断地读取用户的UI操作消息,比如按键、触摸屏、trackball、鼠标等。并把这些消息放到一个消息队列QueueEvent类中。

InputDispatcherThread类:该类的对象一旦创建,也立即会启动一个线程,该线程会不断地从QueueEvent中取出用户消息,并进行一定的过滤,过滤后,再将这些消息发送给当前活动的客户端程序中。

客户端:

有以下重要的几个类

ActivityThread类:该类作为应用程序的主线程类,所有Apk程序都有且仅有一个ActivityThread类,程序的入口为该类的static main()函数,ActivityThread所在的线程即为UI线程或主线程。

Activity类:主程序动态加载可执行代码的最小单元类,ActivityThread类会根据用户操作选择动态加载哪个Activity对象。

PhoneWindow类:该类继承于Window类,同时PhoneWindow类内部包含了一个DecorView对象,DecorView的父类是FrameLayout,因此PhoneWindow是内含一个View对象,并提供了一组通用窗口操作API。

Window类:该类提供了一组通用窗口(Window)操作API。这里的窗口仅仅是客户端层面上的,WmS所管理的窗口并不是Window类,而是一个View或者ViewGroup类,对于PhoneWindow类而言就是其内部包含的DecorView类。

该类在android.view包中,是一个abstract类,并且定义了一组CallBack接口,Activity类就是通过实现这个CallBack接口以获得对消息的处理机会。

DecorView类:该类是一个FrameLayout的子类,并且是PhoneWindow中的一个内部类。DecorView对普通的FrameLayout进行了一定的修饰,比如添加一个通用的TitleBar,并响应特定的按键消息等。

ViewRoot类:WmS管理客户端窗口时,需要通知客户端进行某种操作,这些都是通过IPC调用完成的,而在客户端窗口接收到IPC调用后,都会把该调用转换为本地的一个异步调用,实现方式就是Handler,ViewRoot继承于Handler,其作用主要是把WmS的IPC调用转换为本地的一个异步调用。简而言之ViewRoot类就是客户端的一个代理,通过其内部类W类与WmS进行交互。

W类:该类继承于Binder,并且是ViewRoot的一个内部类。WmS通知客户端窗口时,是通过IPC调用,也就是调用该Binder类,然后该Binder内部的处理函数一般会给该类所在的ViewRoot类发送一个Handler消息,以便进行异步处理。

WindowManager类:类似部门经理,有什么需求告诉它,由它和WmS进行交互,客户端不能直接和WmS交互。


Activity->ViewRoot->W->Window->View


Linux驱动

与Framework相关的主要部分包含SurfaceFlingger和Binder。每个窗口都对应一个Surface,SF驱动的作用是把各个Surface显示在同一个屏幕上。

Binder驱动的作用是提供跨进程的消息传递。


了解了上面的基本概念我们来看下APK的运行过程

1:进入消息循环

ActivityThread从main()函数开始执行,调用prepareMainLooper()为UI线程创建一个消息队列(MessageQueue),然后创建一个ActivityThread对象,在ActivityThread初始化代码中会创建一个Handler对象和一个ApplicationThread(Binder)对象。其中Binder负责远程接收AmS的IPC调用,接收到调用后,则通过Handler把消息发送到消息队列,UI线程会异步地从消息队列中取出消息并执行相应的操作。比如start、stop、pause等。接着UI主线程调用Looper.loop()方法进入消息循环体,进入后就不断地从消息队列中取出消息(关于消息机制可以参考 源码分析异步消息处理线程机制(Looper MessageQueue Handler Message))

2:显示窗口到屏幕

当ActivityThread接收到AmS发送start某个Activity后,就会创建指定的Activity对象。Activity又会创建PhoneWindow类--->DecorView--->创建相应的View或者ViewGroup。创建完成后,Activity需要把创建好的界面显示到屏幕上,于是调用WindowManager类,后者于是创建一个ViewRoot对象,该对象实际上创建了ViewRoot和W类,创建ViewRoot类对象后,WindowManager再调用WmS提供的远程接口完成添加一个窗口并显示到屏幕上。

3:处理用户消息

接下来用户开始在界面上操作,KeyQ线程不断把用户消息存储到QueueEvent队列中,InputDispatcherThread线程逐个取出消息,然后调用WmS中的相应函数处理该消息。当WmS发现该消息属于某个客户端窗口时,就会调用相应窗口的W接口。W类是一个Binder,负责接收WmS的IPC调用,并把调用消息传递给ViewRoot,ViewRoot再把消息传递给UI主线程ActivityThread,ActivityThread解析消息并作出相应的处理。在客户端程序中,首先处理消息的是DecorView,如果DecorView不处理某个消息,则可以将该消息传递给其内部包含的子View或者ViewGroup,如果还没处理,则传递给PhoneWindow,最后再传递给Activity。


客户端中的线程

Activity的客户端至少包含三个线程,每个Binder对象都对应一个线程,Activity线程启动后会创建一个ViewRoot.W对象,同时ActivityThread会创建一个ApplicationThread对象,这两个对象都继承于Binder,因此会启动两个线程。最后一个主要线程也就是程序本身所在线程,也叫作用户交互(UI)线程,因为所有的处理用户消息,以及绘制界面的工作都在该线程中完成。普通线程和UI线程区别在于,普通线程没有消息队列(MessageQueue),不能通过Handler直接给普通线程发消息,UI线程却可以。

0 0
原创粉丝点击