一、Framework组成

1.服务端组成

a.WindowManagerService
    决定各窗口的叠放次序、隐藏或者显示窗口
b.ActivityManagerService
  管理应用程序中所有的activity
c.KeyQ
  Wms内部类,继承于KeyInputQueue,一旦创建就会立即启动一个线程负责读取用户的UI相关操作,如,按键、触摸屏等,并把消息放到QueueEvent类中
d.InputDispatcherThread
  一旦创建立即启动一个线程从QueueEvent读取用户消息,并进行过滤,然后发给当前活动的客户端程序

2.客户端组成

a.ActivityThread
     应用程序主线程类,所有APK程序有且仅有一个ActivityThread类,该类所在线程即为UI线程或主线程
b.Activity
     主线程动态加载可执行代码的最小单元,一个APK程序可包含多个Activity类,ActivityThread类会根据用户操作选择加载哪一个Activity
c.DectorView
     FrameLayout的子类,对FrameLayout进行一定的修饰
d.Window
     提供一组通用窗口操作的API,Wms管理的不是该window,而是View或ViewGroup,也就PhoneWindow内部包含的DectorView
e.PhoneWindow
     继承于Window,内部包含一个DectorView
f.ViewRoot
     继承于Handler,把Wms的IPC调用转化为本地的一个异步调用;因为Wms在管理客户端窗口时,会通过IPC调用通知客户端进行某种操作,而客户端收到IPC调用请求后就会通过Handler转化为本地的一个异步调用
g.W类
     继承于Binder类,并且是ViewRoot的内部类,Wms通知客户端窗口时,通过IPC调用,也就是调用到该Binder对象,然后该Binder会对该类所在的ViewRoot对象发送一个Handler消息,以便进行异步处理
h.WindowManager
     负责客户端申请创建窗口的任务,与Wms进行交互,客户端就不用与Wms进行交互

3.Linux驱动

a.SurfaceFlingger(SF)
 对应每一个窗口,把各个Surface显示在同一个屏幕上
b.Binder
  提供跨进程的消息传递

二、APK程序的运行过程

a.ActivityThread.main()----->ActivityThread.prepareMainLoper(),为UI线程创建一个消息队列

b.创建ActivityThread对象----->创建一个Handler和ApplicationThread(Binder,负责接收远程Ams的IPC调用,通过前面创建的Handler把消息发送到消息队列中,UI线程异步取出消息并执行相关操作)

c.Ams.startActivity--->ActivityThread创建指定的Activity---->Activity创建PhoneWindow类--->DectorView--->View或者ViewGroup---->调用WindowManager创建ViewRoot并调用Wms的远程接口完成添加一个创建并显示在屏幕上

d.KeyQ接受用户的操作并存储到QueueEvent队列中,InputdispatcherThread线程逐个取出消息,调用Wms中的相应函数进行处理,Wms调用相应窗口的W接口

e.W类接受Wms的IPC调用--->把消息传递给ViewRoot---->Viewroot传递给UI线程ActivityThread-->ActivityThread解析该消息并作相应处理

三、客户端中的线程

1.Android APK程序都有哪些进程?

如图所示,共有三个线程,一个Main线程外加两个Binder线程(对应ActivityThread创建的ViewRoot.W和ApplicationThread,负责接收Linux驱动发送的IPC调用)

2.什么是UI线程?

负责处理所有的用户消息以及绘制界面

3.自定义Thread与UI Thread的区别?

UI线程在ActivityThread中运行,已经为其创建了消息队列,用户可直接在UI线程中使用Handler,而自定义线程是一个裸线程,不能直接使用Handler,需创建消息队列和消息循环,即:
new Thread(new Runnable() {
    public void run() {
        Looper.prerpareLooper();
        //处理业务逻辑
        Looper.loop();
    }
}).start();

四、几个常见问题?

1.Activity如何传递消息?

  a.利用Application共享,每个Activity对应的Application是唯一的
  b.Intent
  c.利用SharedPreference、文件、数据库进行

2.窗口的相关概念
 a.窗口(非Window类):
     程序员或用户看到屏幕上的一个独立界面,如Activity、对话框、菜单等.对于Wms,窗口是接收用户消息的最小单元,添加一个窗口就是添加一个View,Wms判断消息来自哪个View,然后通过IPC调用把这个消息传递给客户端的ViewRoot.W子类
 b.Window类:
     一个抽象类,抽象了客户端窗口的基本操作,并定义了一组Callback接口,Activity就是通过此接口来获得对消息的处理机会

c.ViewRoot类:
     客户端(WindowManager)创建窗口时的一个代理,用来和Wms进行交互,通过其内部的W类.Wms管理的每个窗口都会对应一个ViewRoot类
d.W类
     ViewRoot的一个内部类,继承与Binder,用于向Wms提供一个IPC接口,从而让Wms控制窗口客户端的行为

Android内核剖析读书笔记(1)—Framework概述的更多相关文章

  1. Android内核剖析读书笔记

    第16章 程序包管理 PackageManagerService類 PmS 目錄 16.1 包管理概述 16.2 packages.xml文件格式 16.3 包管理服務的啟動過程 16.4 應用程序的 ...

  2. STL源码剖析读书笔记之vector

    STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们 ...

  3. 《深入理解Linux内核》 读书笔记

    深入理解Linux内核 读书笔记 一.概论 操作系统基本概念 多用户系统 允许多个用户登录系统,不同用户之间的有私有的空间 用户和组 每个用于属于一个组,组的权限和其他人的权限,和拥有者的权限不一样. ...

  4. STL源码剖析读书笔记--第四章--序列式容器

    1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...

  5. Android内核剖析(1)

    Linux的启动过程 开机上电执行bootloader,将内核的前n条指令加载到系统内存中------>系统内核的初始化----------->启动应用程序. bootloader的位置装 ...

  6. 《Android内核剖析》读书笔记 第13章 View工作原理【View树遍历】

    View状态分类 在View视图中定义了多种和界面效果相关的状态,比如拥有焦点Focused.按下Pressed等,不同的状态一般会显示不同的界面效果,而且视图状态会随着用户的操作而改变,一般通过xm ...

  7. 《Android内核剖析》读书笔记 第13章 View工作原理【View重绘过程】

    计算视图大小的过程(Measure) 视图大小,准确的来说应该是指视图的布局大小:我们在layout.xml中为每个UI控件设置的layout_width/layout_height两个属性被用来设置 ...

  8. Android进阶加密-第1章-Android系统架构-读书笔记

    第 1 章 Android 系统架构 1.1 Android 系统架构 Android 系统架构分为五层,从上到下依次是应用层.应用框架层.系统运行库层.硬件抽象层和 Linux 内核层. 应用层(S ...

  9. Android进阶之光-第1章-Android新特性-读书笔记

    第 1 章 Android 新特性 1.1 Android 5.0 新特性 1.1.1 Android 5.0 主要新特性 1. 全新的 Material Design 新风格 Material De ...

随机推荐

  1. mit课程ocw-mathematics

    https://ocw.mit.edu/courses/find-by-topic/#cat=mathematics Course # Course Title Level 1.010 Uncerta ...

  2. 3D hover文字特效

    body { font-family: 'Source Sans Pro', Arial, sans-serif; background: #becccc; text-transform: upper ...

  3. jnhs-SpringMVC jsp页面向controller传递参数的五种方式

    一共是五种传参方式: 一:直接将请求参数名作为Controller中方法的形参 public  String login (String username,String password)   : 解 ...

  4. 导出excel表

    <?phppublic function export(){          #提现状态               $status = isset($_REQUEST['status'])? ...

  5. QT_string转char*

    char* convertQString2char(const QString &str) { QByteArray ba = str.toUtf8(); char * pathChar = ...

  6. 由一道面试题引起的arguments的思考

    写一个按照下面方式调用都能正常工作的 sum 方法 console.log(sum(2,3)); // Outputs 5 console.log(sum(2)(3)); // Outputs 5从这 ...

  7. SpringBoot web获取请求数据【转】

    SpringBoot web获取请求数据 一个网站最基本的功能就是匹配请求,获取请求数据,处理请求(业务处理),请求响应,我们今天来看SpringBoot中怎么获取请求数据. 文章包含的内容如下: 获 ...

  8. python-null

    很早之前,遇到过一个面试官问的python中有没有null,当时有点紧张,想成了None,就脱口而出是有的.今天遇到了none问题,所以就正好说一下. python中是没有NULL的. Python中 ...

  9. Spring Boot → 01:概要

    背景 大约20年前,程序员们使用“企业级Java Bean”(EJB)开发企业应用,需要配置复杂的XML. 在二十世纪初期,新兴Java技术——Spring,横空出世.使用极简XML和POJO(普通J ...

  10. Python 运算符括号