Android14 WMS-IWindowSession介绍

IWindowSession客户端是应用,服务端是WMS。

官网介绍其作用是是“System private per-application interface to the window manager.”,

客户端通过IWindowSession向WMS发送请求,IWindowSession接口代码如下

/*** System private per-application interface to the window manager.** {@hide}*/
interface IWindowSession {int addToDisplay(IWindow window, in WindowManager.LayoutParams attrs,in int viewVisibility, in int layerStackId, int requestedVisibleTypes,out InputChannel outInputChannel, out InsetsState insetsState,out InsetsSourceControl.Array activeControls, out Rect attachedFrame,out float[] sizeCompatScale);int addToDisplayAsUser(IWindow window, in WindowManager.LayoutParams attrs,in int viewVisibility, in int layerStackId, in int userId, int requestedVisibleTypes,out InputChannel outInputChannel, out InsetsState insetsState,out InsetsSourceControl.Array activeControls, out Rect attachedFrame,out float[] sizeCompatScale);int addToDisplayWithoutInputChannel(IWindow window, in WindowManager.LayoutParams attrs,in int viewVisibility, in int layerStackId, out InsetsState insetsState,out Rect attachedFrame, out float[] sizeCompatScale);@UnsupportedAppUsagevoid remove(IWindow window);
...

frameworks/base/core/java/android/view/IWindowSession.aidl

IWindowSession的方法可以参考链接如下:

IWindowSession.aidl - OpenGrok cross reference for /frameworks/base/core/java/android/view/IWindowSession.aidl

这里我们来看一下客户端如何获取WindowSession

WindowManagerGlobal.java - OpenGrok cross reference for /frameworks/base/core/java/android/view/WindowManagerGlobal.java

    @UnsupportedAppUsagepublic static IWindowSession getWindowSession() {synchronized (WindowManagerGlobal.class) {if (sWindowSession == null) {try {
// Emulate the legacy behavior.  The global instance of InputMethodManager
// was instantiated here.
// TODO(b/116157766): Remove this hack after cleaning up @UnsupportedAppUsageInputMethodManager.ensureDefaultInstanceForDefaultDisplayIfNecessary();
//第一步IWindowManager windowManager = getWindowManagerService();
//第二步sWindowSession = windowManager.openSession(new IWindowSessionCallback.Stub() {@Overridepublic void onAnimatorScaleChanged(float scale) {ValueAnimator.setDurationScale(scale);}});} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}return sWindowSession;}}

上述代码中,在第一步中,通过getWindowManagerService方法获取了server端binder对象,即获取了WMS服务, 看代码是单例模式,可以看出来这个sWindowSession是一个单例,也就是一个应用的所有ViewRootImpl的WindowSession都是同一个,也就是一个应用只有一个WindowSession,用于与WMS进行通信。

    @UnsupportedAppUsagepublic static IWindowManager getWindowManagerService() {synchronized (WindowManagerGlobal.class) {if (sWindowManagerService == null) {
//获取server端binder对象,即获取WMS服务sWindowManagerService = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
...return sWindowManagerService;}}

在第二步中,则调用到了Server端服务WMS中的方法,这里也是单例模式的写法,sWindowManagerService 在Client端也只有一个对象。

WindowManagerService.java - OpenGrok cross reference for /frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

    @Override
    public IWindowSession openSession(IWindowSessionCallback callback) {return new Session(this, callback);}

然后在WMS中new了一个Session,Session实例化相关如下 

Session.java - OpenGrok cross reference for /frameworks/base/services/core/java/com/android/server/wm/Session.java

class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {final WindowManagerService mService;final IWindowSessionCallback mCallback;final int mUid;final int mPid;...
    public Session(WindowManagerService service, IWindowSessionCallback callback) {mService = service;mCallback = callback;mUid = Binder.getCallingUid();mPid = Binder.getCallingPid();
...

来看看WMS,其实也是继承了 IWindowSession.Stub

/** {@hide} */
public class WindowManagerService extends IWindowManager.Stubimplements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs {

从上我们总结出:

一个应用只有一个WindowSession, 用于与WMS进行通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数高级:函数的默认参数|函数的占位参数|函数重载

函数的默认参数 函数占位参数 函数重载 总结: 函数的形参,有自己的参数值就用参数值,没有就用形参列表的默认值。 参数列表中,某位置有自己的默认值,从该位置起,往后就都必须设有默认值。 函数声明和函数…

详解MyBatis(二)

目录 1.MyBatis的基本操作 1.1增(Insert) 1.1.1返回主键 1.2删(Delete) 1.3改(Update) 1.4查(Select) 1.4.1起别名 1.4.2结果映射 1.4.3开启驼峰命名(推荐) 2.MyBatis XML配…

【Maxcompute】bd09、gcj02、wgs84经纬度坐标系转换udf函数

1.梳理、总结经纬度处理在Maxcompute平台上的实战应用,如bd09、gcj02、wgs84经纬度坐标系转换UDF函数注册与使用。 2.欢迎批评指正,跪谢一键三连! 文章目录 1.参考代码 1.参考代码 坐标系转换 bd09坐标系(百度坐标系)…

【Node】Node的Buffer模块介绍和使用

目录 简言Buffer模块Buffer和字符编码Buffer和 TypedArrays 缓冲区和类数组视图Buffers 和 iteration 缓冲区和迭代(遍历)Class: Blobnew buffer.Blob([sources[, options]]) 创建blob实例blob.arrayBuffer() 转换成ArrayBufferblob.size 数据大小blob.slice([start[, end[, ty…

我更看好开源大模型的发展前景

目录 开源大模型与闭源大模型,你更看好哪一方? 方向一:数据隐私 开源大模型: 闭源大模型: 方向二:商业应用 开源大模型: 闭源大模型: 方向三:社区参与 开源大模…

常用开关电源拓扑演进

目录 常用开关电源拓扑演进 一、概述 二、升压变换器(buck)与降压变换器(boost)

Oracle查看执行计划的方法

使用 EXPLAIN PLAN 命令: 首先,你需要执行 EXPLAIN PLAN FOR 你的查询语句。例如:EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id 10;然后,从系统表 PLAN_TABLE 中查询执行计划详情:SELECT * FROM TABLE(dbms_xp…

AR眼镜定制开发_在AR眼镜中实现ChatGPT功能

AR眼镜定制方案中,需要考虑到强大的算力、轻巧的设计和更长的续航时间等基本要求。然而,AR眼镜的设计方案不仅仅需要在硬件和显示技术方面取得突破,还要在用户体验方面有所进展。 过去,由于造价较高,AR眼镜的普及和商业…

Android 编译文件简述(Makefile 2)

Android 编译文件简述(Makefile 2) 承接上一篇Android 编译文件简述(Makefile),继续讲解Make使用方法。本篇文章简述Makefile的编译和执行流程控制。 作者:炭烤毛蛋 ,点击博主了解更多。 提示:了解Makefile 规则,构建Makefile变得简单。 文章目录 Android 编译文件简述(M…

按钮组切换控制统计图显示【统计图切换渲染失败】

背景 需要实现点击左上角按钮组的按钮,切换对应的统计图 点击按钮1呈现的统计图。映射的实体类Vo1 点击按钮2呈现的统计图。映射的实体类Vo2 可能会出现的问题: (1) 空白:进入页面只渲染第一个统计图,点…

TypeScript核心类型概览与应用-1

文章目录 TypeScript入门1.TypeScript介绍2.编译并运行TS代码2.1.简化运行ts步骤 3.TS中的常用类型3.1.TS中的类型注解3.2.TS中的原始类型3.3.TS中的数组类型3.4.TS中的联合类型3.5.类型别名3.6.函数类型3.6.1.单独执行参数、返回值类型3.6.2.同时指定参数,返回值类…

OpenGL系列(四)Shader

通过VBO和VAO准备好数据后,接下来要指示GPU如何通过这些数据绘制图形。类似CPU可以通过执行程序来完成特定的任务,GPU也可以执行特定的程序来完成绘制任务,GPU执行的程序称为Shader,也叫着色器。 GPU绘制图形分为不同的处理阶段&a…

09-使用JavaScript处理长列表数据:惰性渲染、虚拟滚动与分批渲染

使用JavaScript处理长列表数据:惰性渲染、虚拟滚动与分批渲染 笔记分享 在前端开发中,处理长列表数据是一项常见且具有挑战性的任务。为了提升性能和用户体验,开发者可以采用多种技术和方法来优化渲染过程。本文将介绍如何使用原生JavaScrip…

数据库课程设计mysql

数据库课程设计:MySQL 一、引言 数据库设计是数据库技术的一个重要方面,它涉及到数据的组织、存储、检索和管理。MySQL作为目前流行的关系数据库管理系统之一,广泛应用于各种应用场景中。本课程设计旨在通过MySQL平台,让学生深入…

深入探讨Qt中的容器类:QList与QVector

深入探讨Qt中的容器类:QList与QVector 在C的Qt框架中,容器类的选择对性能和内存使用有着重要影响。QList和QVector是Qt中两个常用的容器类,它们虽然在某些方面非常相似,但在实现细节和适用场景上存在显著差异。本文将详细介绍这两…

【Zero to One系列】SpringCloud Gateway结合Nacos完成微服务的网关路由

前期回顾&#xff1a; 【Zero to One系列】springcloud微服务集成nacos&#xff0c;形成分布式系统 1、Gateway依赖配置 主要Maven依赖如下&#xff1a; <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>…

oracle date类型如何比较时间

在 Oracle 数据库中&#xff0c;如果你想要比较 DATE 类型的时间部分&#xff0c;你需要意识到 DATE 类型实际上包含日期和时间信息&#xff0c;精确到秒。但是&#xff0c;由于 DATE 类型没有单独的时间组件&#xff0c;你通常需要一些额外的逻辑来提取或比较时间部分。 以下…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑发用电相似性的海上风电中长期双边协商交易优化决策模》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

小鸡庄园智慧农场养殖游戏开发:科技与农业的完美结合

随着科技的进步&#xff0c;一种全新的游戏模式——智慧农场养殖游戏&#xff0c;正在逐渐崭露头角。本文将深入探讨小鸡庄园智慧农场养殖游戏的开发背景、特点、技术实现方式以及未来的发展趋势&#xff0c;以期为游戏产业创新和农业现代化提供新的思路和启示。 一、开发背景…

Rust 性能分析

都说Rust性能好,但是也得代码写得好,猜猜下面两个代码哪个快 . - 力扣&#xff08;LeetCode&#xff09; use std::collections::HashMap; use lazy_static::lazy_static;lazy_static! {static ref DIGIT: HashMap<char, usize> {let mut m HashMap::new();for c in …