Android SurfaceControlViewHost介绍及使用

概要介绍

SurfaceControlViewHost是一个工具类, 用于帮助在其他进程中显示本进程的view。 

SurfaceControlViewHost 为绘制进程持有,其中的SurfacePackage 交给另外的显示进程,在显示进程中的SurfaceView中通过SurfaceView.setChildSurfacePackage(SurfacePackage) 将绘制进程中的界面与surfaceview关联并进行显示。绘制进程和显示进程中传递的实际上为surfacecontrol。   

具体实现

参照下面类图:

成员变量 

  •        WindowlessWindowManager mWm, 构造时传入,或者构造时创建。为IWindowSession 子类, 该类并不将一个view加入到wms中作为窗口管理, 而是将该view作为一个子surface加入到另一个父surface中。构造时创建时, 使用本类的mSurfaceControl作为参数, 作为WindowlessWindowManager的mRootSurface。 WindowlessWindowManager类的addToDisplay是按照 WindowManager.LayoutParams 创建一个surfacecontrol, 该surfacecontrol 对应SurfaceFlinger的buffer Layer, 分配具体的绘制buffer, 绘制进程的view 即绘制在该surface上。 该surface 存入WindowlessWindowManager.State.mSurfaceControl, mRootSurface为其parent。 WindowlessWindowManager类的relayout()中按照输入高宽及LayoutParams调整WindowlessWindowManager.State.mSurfaceControl的参数。 
  •        ViewRootImpl mViewRoot;  在SurfaceControlViewHost类构造时创建, 传入的参数为WindowlessWindowManager, 构造时会调用ViewRootImpl.forceDisableBLAST(),即绘制buffer在surfaceFlinger侧分配管理, 而不是在app侧。 
  •        SurfaceControl mSurfaceControl;  //构造时创建, 名字为“SurfaceControlViewHost”, 对应SurfaceFlinger中的ContainerLayer, 作为整个绘制surface的根。 其子layer 为在WindowlessWindowManager.addToDisplay中创建的buffer layer。 mSurfaceControl也作为根layer通过SurfacePackage传递给远端显示进程。 

    成员函数       

  • getSurfacePackage() :创建SurfacePackage:  new SurfacePackage(mSurfaceControl, mAccessibilityEmbeddedConnection); 其中SurfaceControlViewHost.mSurfaceControl 也作为SurfacePackage的mSurfaceControl, 会加入到显示进程中的SurfaceView中。
  • setView(View, ......): 最终调用的是mViewRoot.setView(view, attrs, null),进而调用WindowlessWindowManager.addToDisplay() 和relayout(), 将该view内容与WindowlessWindowManager.State.mSurfaceControl关联。 该mSurfaceControl即为buffer  layer。

示例代码

  • host端即绘制进程

参见: /frameworks/base/core/java/android/service/autofill/InlineSuggestionRenderService.java:170  

    final SurfaceControlViewHost host = new SurfaceControlViewHost(this, getDisplay(),hostInputToken);host.setView(suggestionRoot, lp);aidlClass.aidlFunction(host.getSurfacePackage());  //通过aidl接口将SurfacePackage交给显示进程即client端。 


    

  • client端即显示进程
 SurfaceHolder.Callback.surfaceCreated() {从远程host中获取SurfaceControlViewHost.SurfacePackage。 可以绘制进程调用aidl接口从绘制进程获取,或绘制进程调用aidl传入到显示进程。SurfaceView.setChildSurfacePackage(SurfacePackage);
}

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

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

相关文章

华测监测预警系统 2.2---任意文件读取漏洞

目录 1. 资产搜集 2. 漏洞复现 3. 实战总结 1. 资产搜集 直接上fofa 和 hunter 个人推荐hunter可以看到icp备案公司直接提交盒子就行了 FOFA语法 app”华测监测预警系统2.2” Hunter语法 web.body”华测监测预警系统2.2” 2. 漏洞复现 这里手动复现的,目录是/…

Godot2D角色导航-自动寻路教程(Godot获取导航路径)

文章目录 开始准备获取路径全局点坐标 开始准备 首先创建一个导航场景,具体内容参考下列文章: Godot实现角色随鼠标移动 然后我们需要设置它的导航目标位置,具体关于位置的讲解在下面这个文章: Godot设置导航代理的目标位置 获取…

【自动化测试】基于Selenium + Python的web自动化框架

一、什么是Selenium? Selenium是一个基于浏览器的自动化工具,她提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分:Selenium IDE、Selenium WebDriver 和Selenium Grid:  1、Selenium IDE&…

吐血整理,服务端性能测试中间件-项目集成redis实战,一篇打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Linux下Redis安装…

Jmeter性能测试:高并发分布式性能测试

一、为什么要进行分布式性能测试 当进行高并发性能测试的时候,受限于Jmeter工具本身和电脑硬件的原因,无法满足我们对大并发性能测试的要求。 基于这种场景下,我们就需要采用分布式的方式来实现我们高并发的性能测试要求。 二、分布式性能…

深入探求:中国精益生产与管理实践的崭新视角

经过多方位的了解,比之制造行业上的精益管理上的表现情况,认为目前国内的精益生产精益管理实践仍处于自我认知的水平。目前很多的企业前进的步伐还是主要依据市场经济发展所衍生出来的较为先进的工具运用,其战略性的管理处于局部优化再而达到…

线上软件的故障排查方法

线上软件的故障排查是确保软件系统正常运行和快速解决问题的重要任务。以下是一些通用的线上软件故障排查方法,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 监控系统: 使用监控工具来追…

Chrome 浏览器关闭后再打开,需要重新登录账号,解决办法

最近(2023-10-15)每次打开 Chrome 浏览器,Chrome 自身账号以及各个网站账号都需要重新登录,电脑本身为家用,使用时间不多的情况下,频繁登录账号很痛苦,也很迷惑。现找到解决办法,记录…

Vue3项目上线打包优化

之前整理过 Vue2项目上线打包优化,在vue3中,使用vite打包,配置稍微改了改。 1 开启gzip压缩 1.1 安装依赖 npm i vite-plugin-compression -D1.2 vite.config.ts 配置 import viteCompression from vite-plugin-compressionexport defaul…

《动手学深度学习 Pytorch版》 9.2 长短期记忆网络(LSTM)

解决隐变量模型长期信息保存和短期输入缺失问题的最早方法之一是长短期存储器(long short-term memory,LSTM)。它与门控循环单元有许多一样的属性。长短期记忆网络的设计比门控循环单元稍微复杂一些,却比门控循环单元早诞生了近 2…

【算法|前缀和系列No.5】leetcode1314. 矩阵区域和

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【Leetcode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

ifndef是什么,如何使用?

引言 使用HbuilderX uni-ui模板创建的uni-app项目,main.js文件中看到有如下的注释: // #ifndef VUE3 ...... // #endif // #ifdef VUE3 ...... // #endif 相信很多没有uini-app项目开发经验的朋友,初次接触uni-app项目,可…

小白学习c++的的一节课

初识c 目录:一、c关键字(c98)二、命名空间2.1 命名空间的定义2.2 命名空间的使用 三、c输入与输出四、缺省参数五、函数重载六、引用6.1引用特性6.2常引用6.3使用场景6.4传值和传引用效率比较6.5引用和指针的区别 七、内联函数7.1 概念7.2特性 八、auto关键字&…

ios 实现TEXT、DOC、PDF等文档读取与预览

文章目录 一、前言二、iCould相关配置三、功能实现3.1 UIDocumentPickerViewController 选取控制器3.2 读取文件3.3 文档预览3.3.1 下载并保存3.3.1 QLPreviewController预览文档四、总结一、前言 最近正在研发的项目有一个需求: 允许用户将iCloud中的文档上传,实现文件的流…

Linux高性能服务器编程——ch4笔记

第4章 TCP/IP 通信案例:访问 Internet 上的Web 服务器 4.1 实例总图 4.2 部署代理服务器 客户端和目标服务器之间可能存在多个代理服务器。 正向代理:要求客户端自己设置代理服务器的地址。 反向代理:设置在服务器端。 透明代理&#xff1…

List.of() 与 Arrays.asList()总结

List.of() 与 Arrays.asList() 是 Java 中用于创建列表的两种不同方法。虽然它们都用于创建包含一组元素的列表对象,但它们在实现、不可变性、适用场景和一些细节上存在重要差异。本文将详细分析这两种方法,讨论它们的异同点以及在什么情况下使用它们。 …

“react“: “^16.14.0“,打开弹窗数据发生变化

“react”: “^16.14.0”, 弹窗 打开弹窗数据发生变化 // 这里对比changeHistoryVisible是否发生改变调用后端方法改变数据componentDidUpdate(prevProps) {if (prevProps.changeHistoryVisible ! this.props.changeHistoryVisible && this.props.changeHistoryVisi…

智慧公厕改变城市生活,厕所革命标杆应用解决方案

随着城市化进程的加快,公厕作为城市基础设施的重要组成部分,扮演着不可忽视的角色。然而,传统的公厕粗放型管理模式,已经无法满足市民日益增长的需求。为了提升公厕的管理和服务水平,智慧公厕应运而生。 什么是智慧公…

多模态大模型NextGPT整体结构图、模型示意图和使用模型时示意图

NextGPT模型整体结构 项目地址 论文地址 模型示意图 使用模型时示意图

第二证券:RTX 4090显卡全面下架,芯片巨头连续两日大跌!

英伟达RTX 4090显卡全面下架 在拜登政府更新针对人工智能(AI)芯片的出口控制规矩后的次日,英伟达RTX4090显卡已在各大购物网站下架。现在,网购途径京东上13款RTX 4090显卡均闪现“该产品已下柜”或“此产品暂时售完”&#xff0c…