一、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. JAVA邀请码生成器

    code import java.util.Random; /** * 邀请码生成器,算法原理:<br/> * 1) 获取id: 1127738 <br/> * 2) 使用自定 ...

  2. Linux部署教育云平台测试环境总结

    2016年10月16日换了新公司,刚进公司就要进行平台测试环境部署,由于之前Linux用的比较少,只用过几个简单的杀进程.重启tomcat.查看日志等简单的操作命令,真要在LInux服务器上部署环境的 ...

  3. 2019.9.17 csp-s模拟测试45 反思总结

    来了来了,垃圾二连.[指两次发博客] 看了一下题就匆匆回去上课,在课上一边听课一边水oi,大概用1h40min的时间想完三道题.最后回到机房只剩下40min的时间敲代码,于是T1骗了70分就走了… 这 ...

  4. reverse 的用法

    直接对数组或是数据结构使用 #include<bits/stdc++.h> using namespace std; ]={,,,,,};//申请6个元素,下标从0开始,最后一个下标是5 ...

  5. (转)Cookie存中文乱码的问题

    有个奇怪的问题:登录页面中使用Cookie存值,Cookie中要存中文汉字.代码在本地调试,一切OK,汉字也能顺利存到Cookie和从Cookie中读出,但是放到服务器上不管用了,好好的汉字成了乱码, ...

  6. js面向对象开发基础

    js的面向对象开发能力较弱,基本是以prototype为核心的面向对象,虽然现在出了个class这玩意,但本文还是先不做探讨. 面向对象基础——构造函数方法 var Fly = function (s ...

  7. 【linux配置】虚拟机配置静态IP地址

    使用VMware配置虚拟机静态IP地址 一.安装好虚拟后在菜单栏选择编辑→ 虚拟网络编辑器,打开虚拟网络编辑器对话框,选择Vmnet8 Net网络连接方式,随意设置子网IP,点击NAT设置页面,查看子 ...

  8. IO流-文件操作

    一.字节流读/写 文件 1.字节流 方式读取文件

  9. 顶级测试框架Jest指南:跑通一个完美的程序,就是教出一群像样的学生

    facebook三大项目:yarn jest metro,有横扫宇宙之势. 而jest项目的宗旨为:减少测试一个项目所花费的时间成本和认知成本. --其实,它在让你当一个好老师. jest文档非常简略 ...

  10. 覆盖equals时请遵守通用约定

    Object类中非final修饰的方法有equals().hashCode().toString().finalize().clone()1.equals()方法不需要被覆盖的情况:1)实例化的对象只 ...