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客户端和服务端的流程大概就是这样子,具体的细节我们会继续下去。
服务端主要包括两个类: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客户端和服务端的流程大概就是这样子,具体的细节我们会继续下去。
相关文章推荐
- android 之FragmentPagerAdapter
- android 保存bitmap到指定文件
- Android精确适配不同的dpi和屏幕尺寸(附dimens按比例变化数字的工具类)
- android 清空指定文件夹
- android findVIewById()在线生成工具
- Android存储之SharedPreferences
- Android存储之SharedPreferences
- android 离线权限设置
- 保持Service不被Kill掉的方法--双Service守护 && Android实现双进程守护
- Android添加Widget
- 大话Android开发中的设计模式
- Android开发在任意类中获取当前屏幕宽高
- android fragment学习总结
- Android混淆之ProGuard
- Android 外部存储无法写入的解决方法
- Android开发之JSON使用
- Android自定义控件属性
- Android中适配器的使用
- android蓝牙4.0(BLE)开发之ibeacon初步
- Android中涉及到的焦点问题,focusable,clickable,enabled