当前位置: 首页 > news >正文

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.lryc.cn/news/198513.html

相关文章:

  • 微信小程序开发(一)
  • MySQL数据库操作(创建、修改、删除、查询)
  • 【合宙Air700E/780E短信转发】短信转发移动联通 不要钉钉不要微信,转发自建服务器-傻瓜式搭建
  • TStor CSP文件存储在大模型训练中的实践
  • 最用的几个git命令
  • 邮件网关CAC2.0防御并行:提升高校师生邮箱账号的全面安全
  • 潮玩IP助力环境保护,泡泡玛特发布行业首款碳中和产品
  • pytorch分布式数据训练结合学习率周期及混合精度
  • Looper分析
  • LoongArch单机Ceph Bcache加速4K随机写性能测试
  • 景联文科技语音数据标注:AUTO-AVSR模型和数据助力视听语音识别
  • 【R】数据相关性的可视化
  • Spring Security 6.x 系列【68】 授权篇之基于注解 缓存的访问控制方案
  • QML(11)——qml界面之间通信方式详解
  • 图像检索算法 计算机竞赛
  • 科学清理Windows系统垃圾,让你的电脑性能快如火箭
  • docker图形胡界面管理工具--Portainer可视化面板安装
  • 环形链表的约瑟夫问题
  • python requests.get发送Http请求响应结果乱码、Postman请求结果正常
  • Dialog动画相关
  • 【java学习—八】==操作符与equals方法(2)
  • Linux系统编程_进程间通信第1天:IPC、无名管道pipe和命名管道mkfifo(半双工)、消息队列msgget(全双工)
  • figma+windows系统
  • typescript实现一个简单的区块链
  • 服务器被暴力破解怎么解决
  • 用来生成二维矩阵的dcgan
  • 免费的国产数据集成平台推荐
  • 【yolov8系列】yolov8的目标检测、实例分割、关节点估计的原理解析
  • 5256C 5G终端综合测试仪
  • Springboot Actuator 环境搭建踩坑