Framework框架
Framework
定义了客户端
组件和服务端组件功能及接口。以下阐述中,“应用程序”一般是指“
.apk
”程序。
框架中包含三个主要部分,分别为服务端、客户端和
Linux
驱动。
6.1.1
服务端
服务端主要包含两个重要类,分别是
WindowManagerService
(
WmS
)和
ActivityManagerService
(AmS)
。
WmS
的作用是为所有的应用程序分配窗口,并管理这些窗口。包括分配窗口的大小,调节各窗口的叠放次序,隐藏或者显示窗口。
AmS
的作用是管理所有应用程序中的
Activity
。
除此之外,在服务端还包括两个消息处理类。
KeyQ
类:该类为
WmS
的内部类,继承于
KeyInputQueue
类,
KeyQ
对象一旦创建,就立即启动一个线程,该线程会不断地读取用户的
UI
操作消息,比如按键、触摸屏、
trackball
、鼠标等,并把这些消息放到一个消息队列
QueueEvent
类中。
InputDispatcherThread
类:该类的对象一旦创建,也会立即启动一个线程,该线程会不断地从
QueueEvent
中取出用户消息,并进行一定的过滤,过滤后,再将这些消息发送给当前活动的客户端程序中。
6.1.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
进行交互。
6.1.3
Linux驱动
Linux
驱动和
Framework
相关的主要包含两部分,分别是
SurfaceFlingger
(
SF
)和
Binder
。每一个窗口都对应一个
Surface
,
SF
驱动的作用是把各个
Surface
显示在同一个屏幕上。
Binder
驱动的作用是提供跨进程的消息传递。
APK程序的运行过程
首先,
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
。
6.3
客户端中的线程
在多任务操作系统中,任何程序都运行在线程之中。系统首先会为客户端程序分配一个线程,然后该线程从程序的入口处开始执行。那么,请思考以下问题。
Android APK
程序中都有哪些线程?
什么是
UI
线程?
程序中自定义
Thread
和
UI
线程的区别是什么?
首先,很明确地讲,包含有
Activity
的客户端程序至少包含三个线程,如图
6-1
所示。每个
Binder
对象都对应一个线程,
Activity
启动后会创建一个
ViewRoot.W
对象,同时
ActivityThread
会创建一个
ApplicationThread
对象,这两个对象都继承于
Binder
,因此会启动两个线程,负责接收
Linux Binder
驱动发送
IPC
调用。最后一个主要线程也就是程序本身所在的线程,也叫做用户交互(
UI
)线程,因为所有的处理用户消息,以及绘制界面的工作都在该线程中完成。
为了验证这一点,可以在
Eclipse
中新建一个
Hello Android
的程序,然后以
debug
的方式运行,在
debug
窗口中会看到如图
6-1
所示的界面。
图
6-1
程序中线程
自定义
Thread
和
UI
线程的区别在于,
UI
线程是从
ActivityThread
运行的,在该类中的
main()
方法中,已经使用
Looper.prepareMainLooper()
为该线程添加了
Looper
对象,即已经为该线程创建了消息队列(
MessageQueue
),因此,程序员才可以在
Activity
中定义
Handler
对象(因为声明
Handler
对象时,所在的线程必须已经创建了
MessageQueue
)。而普通的自定义
Thread
是一个裸线程,因此,不能直接在
Thread
中定义
Handler
对象,从使用场景的角度讲,即不能直接给
Thread
对象发消息,但是却可以给
UI
线程发消息。
摘自:http://bbs.gfan.com/thread-2765273-1-1.html
分享到:
相关推荐
根据提供的标题、描述和部分上下文内容,“Android平台开发之旅(第2版)”这本书主要聚焦于Android平台的应用程序开发。虽然提供的部分内容并没有直接涉及到具体的Android开发知识点,但我们可以基于书名和主题,来...
在Android开发之旅中,深入理解Android系统的架构是至关重要的。本篇主要探讨Android系统架构的五个核心组成部分:Linux Kernel、Android Runtime、Libraries、Application Framework和Applications。 1. **Linux ...
【Android开发之旅(2): Android架构】 Android架构是理解Android操作系统基础的重要环节,它由五个主要部分构成:Linux Kernel、Android Runtime、Libraries、Application Framework和Applications。在深入探讨每个...
Android开发之旅的第二篇章主要探讨的是Android系统的架构,这一部分对于初学者来说至关重要,因为它提供了对Android系统全貌的理解,避免在学习过程中迷失方向。Android架构由五个主要部分构成: 1. **Linux ...
Android系统架构主要分为五个部分:Linux Kernel、Android Runtime、Libraries、Application Framework和Applications。本文将逐一解析这些组成部分。 1. Linux Kernel: Android系统的基础是Linux内核,它提供了...
在本篇中,我们将深入探讨Android系统的五个主要组成部分:Linux Kernel、Android Runtime、Libraries、Application Framework和Applications。 首先,Linux Kernel是Android的基础,它提供了核心系统服务,如安全...
罗升阳,2007年毕业于浙江大学计算机系,2010年毕业于上海交通大学计算机系,在国内知名IT技术社区CSDN上发表了数十篇高质量的Android系统原创性文章,并且开设博客专栏--《老罗的Android之旅。 在内容上,本书结合...
总结,Android 4.4源码的学习是一次深入操作系统底层的探索之旅,它涵盖了操作系统、软件工程、硬件交互等多个领域。通过解析和理解源码,开发者不仅可以提升技术水平,还能为优化应用性能、开发定制系统提供有力...
ndroid系统源代码情景分析的评论 ...在国内知名IT技术社区CSDN上发表了数十篇高质量的Android系统原创性文章,并且开设博客专栏--《老罗的Android之旅》,积极与网友互动,深受大家喜爱,访问量一直居于前茅。
Android 2.2,也称为Froyo(冻酸奶),是Android操作系统的一个重要版本,它在2010年发布,带来了许多性能提升和新功能。...这是一次宝贵的探索之旅,可以为Android开发者的技能树添加重要的分支。
在Android开发领域,`framework_intermediates`是一个关键的概念,它涉及到Android系统的内核框架以及开发者如何通过系统内部机制来扩展功能。这个概念通常与构建过程、系统库和反射技术密切相关。下面将详细阐述`...
深入研究Android 4.0源码对于开发者来说是一次宝贵的探索之旅,不仅可以提升对Android操作系统的理解,也有助于进行系统级别的优化和定制,以及开发更加高效、稳定的Android应用。同时,对于想要从事Android系统开发...
Android系统源代码情景分析的评论 ...在国内知名IT技术社区CSDN上发表了数十篇高质量的Android系统原创性文章,并且开设博客专栏--《老罗的Android之旅》,积极与网友互动,深受大家喜爱,访问量一直居于前茅。
Android开发环境搭建是每个想...遵循这些步骤,开发者可以快速地建立起一个完整的Android开发环境,开始他们的Android编程之旅。对于初学者来说,这是一份非常实用的指南,有助于避免在环境搭建过程中遇到的常见问题。
Android 是一个开源的移动操作系统,由Google在2007年推出,主要针对智能手机和平板电脑,但后来也扩展到了...通过搭建Android 开发环境,开发者可以开始他们的编程之旅,创造出各种各样的应用来满足不同用户的需求。
在Windows操作系统中搭建Android应用程序开发环境是一项至关重要的任务,尤其对于初学...这个过程虽然可能稍显复杂,但是一旦完成,就可以开启Android应用开发之旅,利用强大的Android框架和库创造无限可能的应用程序。
### Android入门教材:详解Android开发基础 #### 一、Android平台概述 Android是基于Linux内核的操作系统,自2007年11月由...希望每位学习者都能通过本教材,开启自己的Android开发之旅,创造出令人惊叹的移动应用。