Android源码剖析之Framework层进阶版(Wms窗口管理)

简介:  本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 上一篇我们主要讲了Ams,篇幅有限,本篇再讲讲Wms,即WindowManagerService,管理窗口的服务。


 本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!


上一篇我们主要讲了Ams,篇幅有限,本篇再讲讲Wms,即WindowManagerService,管理窗口的服务。主要负责窗口的创建、删除、状态等与手机交互的事情,与Ams配合使用,在SystemServer中创建,用来保持窗口层级关系方便SurfaceFlinger绘制屏幕,和传递窗口信息给InputManager调用InputDispatcher将输入消息派发到顶层窗口。


Activity、View与Window的区别与联系,View是最底层的显示控件,Activity包含一个DecorView+Window实现类引用PhoneWindow,而Window是一个接口-用来将手势动作转化为Activity可识别的信号。至于什么叫窗口,每个Activity就是窗口、每个Toast也是一个窗口、每个系统弹窗同样是一个窗口。再比如Windows操作系统的任务栏多窗口,比较Android系统当前应用的单窗口。而窗口由什么组成,状态和界面。哈哈,听起来是不是很简单?也就是说你所有的操作会产生一个状态,这个状态会在界面上得以体现,比如后退关闭当前页面。前言介绍有点多,接下来说重点。


1、前面讲的界面是Surface,展示由SurfaceManager来管理,状态由WindowState来管理;布局两种层叠与平铺,Windows的平铺,Android的层叠;

2、布局对应两种实现方式:独立进程式和库共享式。作用是用来绘制屏幕和消息处理,前者独立后者依赖。这样即使一个应用崩溃系统依然完好。

3、应用窗口的高度=屏幕-状态栏,对比苹果的屏幕-菜单栏。

4、关于焦点,一般情况下最前面的窗口获得焦点,二般情况下系统按键获得焦点,支持窗口切换、添加动画效果。


跟View的操作差不多,Wms也有几个动作,assignlayer给窗口分配层值越大越靠前(动态的),performlayout根据输入法窗口、状态栏和窗口动画来计算可用的大小、placesurface像draw方法一样将窗口展示在屏幕下。


介绍几个跟Wms关联比较紧密的类

1、WindowManagerPolicy:接口,约束Wms能干什么。

2、WindowManager:Activity通过它调用remove和addView,Wms通过Binder类型的W类以IPC方式传给ActivityThread(UI线程),由Handler类型的ViewRoot类转成本地的一个异步调用。

3、SurfaceManager:调动SurfaceFlinger(linux驱动)绘制屏幕,使用芯片的图形加速器引擎完成工作

4、InputManager:获得输入消息,拥有Wms引用;执行时先执行InputMonitor,使用InputWindow保存寻找焦点所需信息

5、WindowState:真正的窗口,记录大小、层值、动画状态;每个窗口均有一个它;WindowToken用来实现IPC交互,一个窗口只有一个,子窗口均指向它;AppWindowToken指App在Wms的token用来最终管理交互。

6、Animation:Dim和Fade,分别是变暗和渐进动画,是窗口用的最多的效果

7、PolicyThread:WindowManagerPolicy类型,主要Wms使用异步操作的一个工具

8、Session:SufaceSession(用于向SurfaceFlinger添加删除窗口)的包装类,显然用来保存渲染的缓存信息,主要有uid、pid等

9、WaterMark:作用一防篡改二加通用背景,保存在/system/etc下,格式是content%

10、VMThread:SystemServer的异步线程

Wms最重要的就是添加和删除窗口,还是要具体讲一下的,先讲添加窗口

创建ViewRoot对象,调用setView方法,通过IPC执行Session中的add方法,然后addWindow;在这一步需要

执行一些前置条件判断比如参数是否合法、窗口是否已存在、将屏幕大小给到InputManager应用输入法墙纸窗口的

attr.token和type一致;再添加窗口相关数据,如新建WindowState(包含session、ViewRoot的W对象、隶属窗口

等)加入mWindowMap、传递touch焦点等;最后执行后置判断将窗口状态变化反映到相关数据中,比如将焦点给予

可交互的窗口、计算并重新分配层值。

接着再讲一下删除窗口,与Windows不同,用户不能直接关闭窗口,分两种显性删除直接调用WindowManager

的remove方法隐性删除指执行finish回调隐性删除:先发送一个消息,通知关闭窗口,removeViewImediate负责

删除activity窗口,closeAll负责删除Activity相关如菜单、对话框窗口,删除自身的Session;然后看是否执行一个

动画、尝试把焦点转移到另一个窗口,相当于反向执行add过程。


接下来讲讲窗口大小,mContainingFrame(整屏)> mContentFrame(窗口实际)> mFrame(屏幕上显示),

使用layoutWindowLv来计算窗口大小,如果是输入法则是可用大小,否则情况有三:1、考虑状态栏2、全屏3、

是否排序输入法窗体大小;输入法窗口仅允许被添加一次、且下面不允许有内容,调用ViewRoot.W的resize方法,

一般使用下面方法,防止其获得焦点

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

SOFT_INPUT_ADJUST_PAN:键盘会将内容整体向上顶

SOFT_INPUT_ADJUST_RESIZE:键盘会浮在内容整体上


影响窗口可视状态因素有二:1、动画,2、是否显示

最后SurfaceFlinger对窗口进行重绘,操作Surface窗口,对视图View进行变换,而动画有两种Tween

(tranlslate、scale、rotate、alpha),对Surface操作进行变换,主要对界面进行不间断的重绘和对View操作

进行任意变换的Frame


多种情况下Ams会调用Wms如增删appWindowToken、设置窗口可见、动画切换等,少数情况下Wms会调用

Ams如暂停App切换、横竖屏切换、杀死App等。


横竖屏切换主要由三种情况引起:

1、ActivityStack执行resumeTopActivityLocked

2、Wms执行window操作

3、人为旋转设备。


最后放出来两张图,activity启动过程和停止过程


ApplicationThread在ActivityThread中生成,最后执行scheduleLaunchActivity启动。





目录
打赏
0
0
0
0
2
分享
相关文章
Android Stadio Build 窗口字符串乱码问题
在使用Android Studio过程中,如果遇到Build窗口字符串乱码问题,可以通过编辑`studio.vmoptions`文件添加`-Dfile.encoding=UTF-8`配置并重启Android Studio来解决。
214 1
Android Stadio Build 窗口字符串乱码问题
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
本文介绍了在基于Ubuntu 22.04的环境下配置Python 3.9、安装repo工具、下载和同步AOSP源码包以及处理repo同步错误的详细步骤。
409 0
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
175 0
Android经典实战之窗口和WindowManager
本文介绍了Android开发中“窗口”的基本概念及其重要性。窗口是承载用户界面的基础单位,而`WindowManager`系统服务则负责窗口的创建、更新和移除等操作。了解这些概念有助于开发复杂且用户体验良好的应用。
107 2
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
241 1
docker中编译android aosp源码,出现Build sandboxing disabled due to nsjail error
在使用Docker编译Android AOSP源码时,如果遇到"Build sandboxing disabled due to nsjail error"的错误,可以通过在docker run命令中添加`--privileged`参数来解决权限不足的问题。
1297 1
Android源码下载
Android源码下载
738 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
912 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
359 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
我的Android 进阶修炼(1): AOSP源码根目录结构
本文介绍了AOSP源码的根目录结构,提供了基于MTK9269 Android 9.0源码的目录说明,帮助读者了解AOSP源码的组织方式和各目录的功能。
326 0
我的Android 进阶修炼(1): AOSP源码根目录结构

热门文章

最新文章

  • 1
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    16
  • 2
    Android历史版本与APK文件结构
    12
  • 3
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    51
  • 4
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    3
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    10
  • 6
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    4
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    4
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    4
  • 9
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    4
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    4
  • 1
    android FragmentManager 删除所有Fragment 重建
    17
  • 2
    Android实战经验之Kotlin中快速实现MVI架构
    24
  • 3
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    28
  • 4
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    40
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    131
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    40
  • 7
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    55
  • 8
    Android历史版本与APK文件结构
    155
  • 9
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    46
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    40