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

时间: 2024-08-07 17:40:08

Framework概述的相关文章

Java Collection Framework概述

文章出自:听云博客 Collection概述 Java collection是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等. Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(Iterator.Arrays和Collections). Java collection 结构图 通过上图我们可以看出 Collection是一个interface Collection有List和Set两大分支. List<E>是一个队列,根据下标索引

Linux电源管理-Linux regulator framework概述

前言 1.  什么是regulator? regulator翻译为"调节器",分为voltage regulator(电压调节器)和current(电流调节器).一般电源管理芯片(Power Management IC)中会包含一个甚至多个regulator. 2.  regulator有什么作用? 通常的作用是给电子设备供电.大多数regulator可以启用(enable)和禁用(disable)其输出,同时也可以控制其输出电压(voltage)和电流(current). 从上图可以

.Net FrameWork概述

.Net FrameWork 是为其运行的应用程序提供各种服务的托管执行环境,它包括两个组件,执行引擎公共语言运行时(CLR):以及.Net FrameWork 类库. CLR是.NET FrameWork 的核心, CLR的核心是CTS和CLS,任何编程语言,如果想要在.NET CLR上执行,就必须提供一个编译器, 编译成.NET CLR所认识的metadata以及IL,符合CTS的规定. CTS 是通用类型系统(Common Type System) CLS是公共语言定义(Common La

kde framework概述(KDE Framework译文)

KDE Frameworks 基于QT框架,提供简单实用的类(例如那些KCoreAddons里的类)去为桌面应用的日常需要整合出解决方案(例如KNewStuff用于在应用中获取可下载的附加内容,或者那个强大的KIO多协议文件访问框架). KDE Frameworks 可以被用于基于CMake和QMake的工程中,其中大部分至少可用于Windows, Mac 和 Linux.每个子框架的文档已经写明如何在QMake和CMake的工程中加入对应的框架. 这些子框架根据它们的依赖被分为四个等级,例如:

Spring----&gt;projects-----&gt;Spring Framework

Spring Framework概述: Spring Framework是spring若干子项目中的一个 Spring Framework的主要功能有: 依赖注入(dependency injection/IoC), 事务管理transaction management, web applications, data access, messaging, testing and more.

Microsoft.NET和Microsoft.NET Framework

Microsoft.NET概述: 是 Microsoft XML Web services 平台.XML Web services 允许应用程序通过 Internet 进行通讯和共享数据.                             也有人理解成是微软推出的下一代面向互联网软件和服务的战略,一种新的软件设计理念和服务理念的产生. 旨在充分挖掘互联网所具有的潜力. Microsoft.NET Framework概述: 是以一种采用系统虚拟机运行的编程平台,以通用语言运行库(Common

Spring Framework 4.3.22.RELEASE Reference文档目录

<Spring Framework Reference Documentation 4.3.22.RELEASE> part I Spring Framework概述part II Spring Framework4.x的新特性part III 核心技术 7.IoC容器 8.Resources资源 9.校验.数据绑定.类型转换Validation, Data Binding, and Type Conversion 10.spring的EL表达式 11.spring AOP面向切面编程 12.

C# .Net Framework

.NET Framework概述 .NET Framework是由微软开发,一个致力于敏捷软件开发.快速应用开发.平台无关性和网络透明化的软件开发平台. .NET Framework组成 .NET Framework具有两个主要组件:公共语言运行库和.NET Framework类库. .NET Framework类库 .NET Framework类库是一个与公共语言运行库紧密集成的可以重用的类型集合.该类库是面向对象,并提供您自己的托管代码可从中导出功能的类型..NET Framework类型能

图文浅析APK程序运行的过程

概述 APK程序运行过程有别于FrameWork底层启动过程,它们是倆码事,本文将以图文方式总结一下APK启动的过程,主要分为一下部分 [1]基本概念 [2]APK过程 1 .新的知识点 [1]什么是UI线程与Thread线程区别 UI线程并不陌生,但是这玩意到底是啥,与普通线程Thread有啥区别呢? 什么是UI线程: ActivityTread类所在的线程即为UI线程,负责用户交互,处理用户消息绘制界面等 区别: UI线程的ActivityTread中的Main方法已经使用Looper.pr