您的位置:首页 > 移动开发 > Android开发

Android框架概述

2015-07-20 22:34 393 查看
Andorid框架分为三块:服务端,客户端和Linux驱动(= = 不了解)。

服务端主要包括两个类:WindowManagerService和ActivityManagerService;其中WindowsManagerService负责窗口的叠放层次,显示或者隐藏窗口。ActivityManagerService管理应用中的各个Activity。除此之外,wms中有两个消息处理类,2.2中使用了KeyQ和InputDispatcherThread,他们之间配合将窗口中的消息发送给客户端。

客户端负责应用的View显示,消息的处理等。主要的类很多,我们也很熟悉。

1.ActivityThread类:所有APK应用程序有其只有一个ActivityThread和它对应。并且ActivityThread所启动的线程就是我们应用中一直说的UI线程和主线程。

2.Activity类:一个APK可以包含多个Activity类。ActivityThread接受到服务端启动哪个Activity消息后就会选择动态加载某个Activity对象,就延伸出了4种不同的Activity加载模式。比如standard,singleTop,singleTash,singleInstance,加载模式的不同和加载类存入Activity栈有关。

3.PhoneWindows类:继承Window类,内部包含一个DecorView对象,提供给一套通用的窗口操作API

4.DecorView类:继承FrameLayout,他的作用是修饰Acitvity的ContentView,并提供一个通用的Title bar 和特定的按键消息

5.ViewRoot类: WMS管理各个窗口的时候需要对客户端进行一些操作,这些都是通过IPC(线程间的通信,Android使用Bunder)来实现的,而客户端接收到消息后,就会异步调用处理消息,而这些就是通过Handle来实现的,所以 ViewRoot 就是继承了Handle,处理这些消息的。

6.W类: 该类继承Bindler,W类便是ViewRoot类的一个内部类,ViewRoot和WMS通信就是依靠W类的IPC方式实现的。

7.WindowManager类: 客户端打算创建一个窗口,需要WindowManager负责和WMS交互,是一个管理类,客户端是不能够直接和WMS通信的。

知道了这些类之后,那么当点击一个APP,到底发生了一些什么事情呢?

首先,开启了一个ActivityThread线程,调用了prepareMainLooper()为UI线程(自己)创建一个消息队列(MessageQueue)。

然后创建一个ActivityThread对象,在ActivityThread对象的初始化过程中会创建一个H(Handle)对象和一个ApplicationThread(Bunder)对象。其中ApplicationThread(Bunder)负责接受远程AMS的IPC调用,接受到消息后通过Handle将消息发送到消息队列(MessageQueue)中,UI主线程从MessageQueue中取出消息并执行操作,如start,stop,pause等。

接着UI主线程调用了Looper.loop()方法进入了消息循环体,不停的从MessageQueue中取数据并处理消息。

当ActivityThread接收到AMS发送的start某个Activity后,就创建了指定的Activity对象,并放入Activity栈中。Activity又创建了PhoneWindow类 ----> Dector类 -----> contentView(通过Activity.setContentView方法) ----> 创建View或者ViewGroup。创建对象完成之后需要将这些显示到屏幕上。这时候就会调用WindowManager类,WindowManager类会创建一个ViewRoot类
----> 创建一个W类 ---> WindowManager再通过WMS的远程接口完成将一个窗口显示在屏幕上

另外当用户对屏幕进行操作时,KeyQ不断把 用户消息存入QueueEvent中,并且通过InputDispatcherThread线程取出消息。WMS判断该消息属于哪个窗口,并调用该窗口的W的接口,实现消息的传递。

W类我们说过是Binder,接收到WMS的IPC的消息后,将消息传递给ViewRoot,ViewRoot再把消息传递给ActivityThread UI线程,UI线程解析消息并处理。那么首先接收到消息的是DecorView,如果DecorView不做处理则传递给ContentView下的View或者ViewGroup,如果还没有处理,则传递给PhoneWindow,最后传递给Activity。

上面就是APK程序运行的流程。那么整个过程有几个线程呢?大家可以想一想。

--

--

--

--

--

--

--

--

--

--

一共有3个线程,UI主线程,和AMS通信的ApplicationThrad(Bunder) ,和WMS通信的W(Bunder),ViewRoot的内部类,三个线程通过Handle协调工作,完成客户端的View显示和消息的调用。

另外Activity之间是如何传递数据的呢?

通过上面的流程我们知道,Activity并不是线程,没有IPC的概念,也就扯不上传递数据了。打个比方,你能说Rect类和Trigle类之间是如何传递消息的吗?

事实上,两个类之间传递消息的方式有两种。

1.一个类持有另一个类对象的引用

2.存在第三个不会被回收的对象,通过该对象的数据实现两个类之间传递消息。

所以使用应用的唯一Application对象保存消息是一个办法,但是Activity.startActivity(Intent intent)方法可以传递Intent数据,同时通过startActivityForResult的方法可以再目标Activity结束后,回调Intent 对象给原Activity.onActivityResult()中。比如照相机和图库的回调。

Android客户端和服务端的流程大概就是这样子,具体的细节我们会继续下去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: