本项目用于验证 Android 是否能够跨进程渲染 View,最终实现了在子进程创建WebView,主进程显示的功能。

一、跨进程渲染的意义

  • 有一些组件比如 WebView 如果在主进程初始化,会大大增加主进程的内存占用。
  • 部分组件设计时只支持特定进程,但是又想在别的进程显示该组件的View
  • 一些其它限制...

二、跨进程渲染的实现

1.提供一个Surface

跨进程渲染,需要一个Surface对象,本项目中使用SurfaceView提供。

Surface实现了Parcelable接口,也就意味着它可以跨进程传递。

具体逻辑参考:ProcessSurfaceView,通过bindService拉起子进程Service后,将Surface通过接口传递给了子进程。

// bindService 拉起子进程
private fun bindService() {
val intent = Intent(context, RemoteDrawService::class.java)
context.bindService(intent, this@ProcessSurfaceView, Context.BIND_AUTO_CREATE or Context.BIND_IMPORTANT)
} // 子进程连接后,拿到 AIDL 接口传递 Surface 到子进程
override fun onServiceConnected(p0: ComponentName?, iBinder: IBinder?) {
Log.i(TAG, "onServiceConnected")
if (iBinder == null) {
Log.e(TAG, "onServiceDisconnected: iBinder is null.")
return
}
iRemoteDraw = IRemoteDraw.Stub.asInterface(iBinder)
setSurfaceToRemote()
}

ps:SurfaceView退后台需要额外处理,本项目中是在退后台后重新创建了渲染的View。

2.子进程创建View

收到主进程的Surface后,需要创建VirtualDisplayPresentation

val displayManager = service.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val dm = service.resources.displayMetrics
val virtualDisplay = displayManager.createVirtualDisplay("", dm.widthPixels, dm.heightPixels, dm.densityDpi, surface, 0)
val presentation = Presentation(service, virtualDisplay.display)
presentation.setContentView(createView())
presentation.show()

至此,就实现了跨进程渲染。效果如下:

3.点击事件处理

由于渲染的View是在另外一个进程,所以收不到点击事件。这里的实现方案是将SurfaceView的点击事件跨进程传递到子进程。

override fun dispatchTouchEvent(event: MotionEvent?): Boolean {
return iRemoteDraw?.dispatchTouchEvent(event) ?: false
}

由于是跨进程传递,事件的处理效率肯定变低了。因此跨进程渲染适合那些不怎么依赖点击事件的显示,比如播放视频。

三、优点和缺点

可见跨进程渲染的显示还是相对简单的,系统提供了相应的能力。使用时,需要注意其的限制。

1.优点

  • 将渲染交给了其它进程,降低了本进程内存占用。
  • 有一些业务场景只能通过跨进程渲染实现。

2.缺点

  • 需要额外处理点击事件。包括如果需要跟渲染对象进行交互,都需要提供跨进程接口,处理效率变低。
  • 复杂程度变高。

Android 跨进程渲染的更多相关文章

  1. Android 跨进程启动Activity黑屏(白屏)的三种解决方案

    原文链接:http://www.cnblogs.com/feidu/p/8057012.html 当Android跨进程启动Activity时,过程界面很黑屏(白屏)短暂时间(几百毫秒?).当然从桌面 ...

  2. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇

    前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...

  3. Android跨进程通信的四种方式

    由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...

  4. Android 跨进程数据共享

    Android 开发过程中,基于功能隔离.进程安全.进程保活等等考虑,我们经常需要为应用划分进程,然后不得不面临跨进程通信和跨进程共享数据的挑战. 跨进程通信 相对来说,跨进程通信比较简单,常用的方式 ...

  5. android跨进程通信(IPC)——AIDL

    转载请标明出处: http://blog.csdn.net/sinat_15877283/article/details/51026711: 本文出自: [温利东的博客] 近期在看 @任玉刚 大神编写 ...

  6. android 跨进程通信

    转自:http://www.androidsdn.com/article/show/137 由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一 ...

  7. Android跨进程訪问(AIDL服务)

    我将AndroidAIDL的学习知识总结一下和大家共享 在Android开发中,AIDL主要是用来跨进程訪问. Android系统中的进程之间不能共享内存,因此,须要提供一些机制在不同进程之间进行数据 ...

  8. android 跨进程通讯 AIDL

    跨进程如何通讯?两个进程无法直接通讯,通过Android系统底层间接通讯.基于service的aidl实现跨进程通讯. 什么叫AIDL? Android interface definition la ...

  9. 【Android跨进程】IPC总结

    前言 IPC是Inter-Process Communication的缩写,含义就是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.两个进程可以是两个独立的app也可以是一个app的两个 ...

随机推荐

  1. java后台生成文件给前端下载(response输出流)

    1.设置 ContentType response.setContentType("application/x-download"); 2.设置文件名,并指定编码格式 fileNa ...

  2. virtio 驱动的数据结构理解

    ps:本文基于4.19.204内核 Q:vqueue的结构成员解释: A:结构如下,解析附后: struct virtqueue { struct list_head list;//caq:一个vir ...

  3. 基于SpringSecurity的@PreAuthorize实现自定义权限校验方法

    一.前言 在我们一般的web系统中必不可少的就是权限的配置,也有经典的RBAC权限模型,是基于角色的权限控制.这是目前最常被开发者使用也是相对易用.通用权限模型.当然SpringSecurity已经实 ...

  4. 【java】学习路径42-六种字符流使用实例

    第一种 OutputStreamWriter OutputStreamReader 第二种 FileWriter FileReader 第三种 BufferedWriter BufferedReade ...

  5. Linux之NFS服务搭建及autofs服务搭建

    NFS 网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的 ...

  6. 如何充分利用KingbaseES日志

    作为现代关系数据库中,KingbaseES带有许多用于微调的参数.需要考虑的领域之一是KingbaseES应该如何记录其活动.日志记录在Kingbases数据库管理中经常被忽略,如果不被忽略,通常会被 ...

  7. KingbaseES 创建只读(read_only)用户

    数据库版本: prod=> select version(); version --------------------------------------------------------- ...

  8. VLDB'22 HiEngine极致RTO论文解读

    摘要:<Index Checkpoints for Instant Recovery in In-Memory Database Systems>是由华为云数据库创新Lab一作发表在数据库 ...

  9. 从代码到发包,一个程序全搞定!Gitea 推出软件包自托管功能 Package Registry

    2022 年 7 月的最后一天,随着 Gitea 1.17.0 版本的正式发布,Gitea 开源社区推出了一项名为 Package Registry 的包管理功能,与 Gitea 代码仓库无缝集成,类 ...

  10. 操作系统学习笔记10 | I/O、显示器与键盘

    从这一部分开始介绍操作系统的设备驱动,操作系统通过文件系统的抽象驱动设备让用户能够使用显示器.键盘等交互工具.并讲解printf和scanf是如何实现敲下键盘将字符显示到屏幕上的. 参考资料: 课程: ...