简述Android framework AMS WMS

  • AMS 主要用于管理所有应用程序的Activity
  • WMS 管理各个窗口,隐藏,显示等

一:认识WMS

1.1:初识WMS

WindowManagerService服务(WMS)的实现是相当复杂的,毕竟它要管理的整个系统所有窗口的UI,而在任何一个系统中,窗口管理子系统都是极其复杂的。而WMS就是管理整个系统的窗口的。

1.2:WMS的功能

为所有窗口分配Surface。客户端向WMS添加一个窗口的过程,其实就是WMS为其分配一块Suiface的过程,一块块Surface在WMS的管理下有序的排布在屏幕上。Window的本质就是Surface。


管理Surface的显示顺序、尺寸、位置
 

管理窗口动画
 

输入系统相关:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息,而WMS是窗口的管理者,系统中所有的窗口状态和信息都在其掌握之中。


1.3:认识Window

Window表明它是和窗口相关的,窗口是一个抽象的概念,从用户的角度来讲,它是一个界面;从SurfaceFlinger的角度来看,它是一个Layer,承载着和界面有关的数据和属性;从WMS角度来看,它是一个WIndowState,用于管理和界面有关的状态。
 

1.4:WMS工作流程

窗口大小和位置(X轴和Y轴)的计算过程
窗口的组织方式
输入法窗口的调整过程
壁纸窗口的调整过程
窗口Z轴位置的计算和调整过程
Activity窗口的启动窗口的显示过程
Activity窗口的切换过程
Activity窗口的动画显示过程


1.5:WMS的设计思想

我们知道,学习一个框架其实就是学习一种编程思想,或者说理解他的设计模式,只有掌握了设计思想理解起来就事半功倍了,WMS的设计思想就是利用了桥接模式
 

二:认识AMS

2.1:初识AMS

AMS是系统的引导服务,应用进程的启动、切换和调度、四大组件的启动和管理都需要AMS的支持。

2.2:AMS的功能

统一调度所有应用程序的Activity的生命周期
启动或杀死应用程序的进程
启动并调度Service的生命周期
注册BroadcastReceiver,并接收和分发Broadcast
启动并发布ContentProvider
调度task
处理应用程序的Crash
查询系统当前运行状态
2.3:AMS的启动流程

启动ActivityManagerService。
调用setSystemProcess。
调用installSystemProviders方法。
调用systemReady方法。


2.4:AMS的工作流程

AMS的工作流程,其实就是Activity的启动和调度的过程,所有的启动方式,最终都是通过Binder机制的Client端,调用Server端的AMS的startActivityXXX()系列方法。所以可见,工作流程又包括Client端和Server端两个
 

1:客户端工作流程

1. Launcher主线程捕获onClick()点击事件后,调用Launcher.startActivitySafely()方法。Launcher.startActivitySafely()内部调用了Launcher.startActivity()方法,Launcher.startActivity()内部调用了Launcher的父类Activity的startActivity()方法。

2. Activity.startActivity()调用Activity.startActivityForResult()方法,传入该方法的requestCode参数若为-1,则表示Activity启动成功后,不需要执行Launcher.onActivityResult()方法处理返回结果。

3. 启动Activity需要与系统ActivityManagerService交互,必须纳入Instrumentation的监控,因此需要将启动请求转交instrumentation,即调用Instrumentation.execStartActivity()方法。

4. Instrumentation.execStartActivity()首先通过ActivityMonitor检查启动请求,然后调用ActivityManagerNative.getDefault()得到ActivityManagerProxy代理对象,进而调用该代理对象的startActivity()方法。

5. ActivityManagerProxy是ActivityManagerService的代理对象,因此其内部存储的是BinderProxy,调用ActivityManagerProxy.startActivity(),实质是调用BinderProxy.transact()向Binder驱动发送START_ACTIVITY_TRANSACTION命令。Binder驱动将处理逻辑从Launcher所在进程切换到ActivityManagerService所在进程。

2:服务端工作流程

2.1 预启动


2.2 暂停


2.3 启动应用程序进程


2.4 加载应用程序Activity


2.5 显示Activity


2.6 Activity Idle状态的处理

2.7 停止源Activity


2.5:AMS的设计思想

AMS也用到了设计思想,主要是代理模式

三:认识PMS

3.1:初识PMS

PackageManagerService(简称 PMS),是 Android 系统核心服务之一,处理包管理相关的工作,常见的比如安装、卸载应用等。PMS是系统服务,那么应用层肯定有个PackageManager作为binder call client端来供使用,但是这里要注意,PackageManager是个抽象类,一般使用的是它的实现类:ApplicationPackageManager。因此PackageManager功能的具体实现还是ApplicationPackageManager这个实现类。

3.2:PMS的功能

提供一个应用程序的所有信息(ApplicationInfo)
提供四大组件的信息
查询permission相关信息
提供包的信息
安装、卸载APK


总结

简单归纳总结一下大致如下。

服务端

AMS 主要用于管理所有应用程序的Activity
WMS 管理各个窗口,隐藏,显示等
PMS 用来管理跟踪所有应用APK,安装,解析,控制权限等.
还有用来处理触摸消息的两个类KeyInputQueue和InputDispatchThread,一个用来读消息,一个用来分发消息.。


客户端

主要包括ActivityThread,Activity,DecodeView及父类View,PhoneWindow,ViewRootImpl及内部类等
ActivityThread主要用来和AMS通讯的客户端,Activity是我们编写应用比较熟悉的类。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值