做网站的技术体系,上海网站建设 排名,安徽省建设工程质量管理办法,个人微信公众号怎么做微网站吗概要介绍
SurfaceControlViewHost是一个工具类#xff0c; 用于帮助在其他进程中显示本进程的view。
SurfaceControlViewHost 为绘制进程持有#xff0c;其中的SurfacePackage 交给另外的显示进程#xff0c;在显示进程中的SurfaceView中通过SurfaceView.setChildSurface…概要介绍
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);
}