Android 4.4 双显示屏支持实现思路(双屏异显)

本文探讨了在Android 4.4上实现双屏异显的需求,分析了现有多Display框架,指出其不足,并提出了完善方案。内容涉及JAVA FW应用、GUI FW、Native FW和Input子系统对多Display的支持,强调了应用程序端、WindowManagerService、SurfaceFlinger和Input子系统的改进需求。
摘要由CSDN通过智能技术生成

      本文是多年前在Intel Baytrail 平台上所做过的一个项目的思路总结。当时设备上有同时支持VGA/HDMI显示设备(很Intel吧,跟PC的接口很像吧),需求是在Android 上支持VGA/HDMI两个屏幕同时显示,并且同时需要显示运行两个应用程序在不同的显示屏幕下,简单的就是需要你在HDMI显示屏上看视频的同时,在VGA显示屏幕上操作一个应用。本文简单介绍了实现方式,至于代码不方便放出来,再说Android N都出来了,对这个功能已经接近支持了。本文将按照以下的思路来组织.


  

在Android 的Framework框架当中,在多display显示方面,已经有比较完整的框架支持,虽然目前可能还不太完善,本文档将简单介绍下android的多display 框架,力争能分析清楚当前框架,找出不足之处,最终能够提出完善当前框架的方案。因此,本文档将分成以下三个部分:

  1. ◆现有多Display 框架分析。
  2. ◆现有多Display 框架的不足。
  3. ◆完善多Display 框架的方案。

现有多Display 框架分析

在android 4.4.4的代码当中,我们已经能够看到android已经有了大量关于多Display支持的代码,并且当前android也已经支持通过WIFI Display将图像投影到一个WIFI设备,也增加了一个Presentation的特殊Dialog允许将该Dialog绘制在另外一个Display设备上。本文将从以下四个方面分析当前android版本对多Display框架的支持:

  1. ◆JAVA FW应用部分,需要提醒注意的是,这个应用部分并不是指应用程序,而是指android FW与应用程序相连接的那一部分。
  2. ◆JAVA GUI FW部分,主要是DisplayManagerService 以及WindowManagerService对Display当中窗口的管理。
  3. ◆ Native GUI FW部分,主要是SurfaceFlinger当中对Display当中窗口的绘制,以及图像输出
  4. ◆Android Input子系统对多Display的支持。

 

由于android多Display与android GUI系统紧密耦合,所以在讨论android多Display之前,我们先大致了解下android GUI框架,在Android framework GUI系统当中,最核心最重要的是系统提供的三个系统service,分别是ActivityManagerService与WindowManagerService.这两个Java层面的Service, 顾名思义,这两个service将分别管理activity跟window。以及一个SurfaceFlinger这么一个Native层的Service。这个service主要负责对所有界面的compose操作。下图是android GUI框架的一个简图,简单描述了应用程序,JAVA GUI FW,Native GUI FW 这三者之间的关系:


稍微解释下上面这张图,应用程序端的三个组件是由Framework当中的三个service来分别负责管理的,Activity由AMS负责管理,其在AMS中对应的是一个ActivityRecord对象,AMS将管理其生命周期。Window则虚拟对应WMS中的一个WindowState.说是“虚拟对应”是因为Window跟WMS并没有直接的关系,只存在逻辑上的关系。WMS将管理窗口的Z轴以及每个窗口显示的大小。mDoctorView与SF中的Layer也是虚拟对应的关系,归纳一点就是Layer为mDoctorView提供显示buffer,从而让mDoctorView这棵递归树能将自己所有的子view都画到这个buffer当中,最终SF将compose其管理的所有的Layer,最终显示到屏幕之上。

WindowManagerService与SurfaceFlinger在android GUI框架当中是分工协作的,WindowManagerService管理逻辑关系,包括Z-Order, 显示区域大小等等,SurfaceFlinger则根据WindowManagerService的输入负责具体绘制以及compose。

 

应用部分

在应用程序部分,android最主要是在WindowImpl.java以及ContexImpl.java这两个类

中增加了一个类型为Display的成员变量mDisplay。下面我们分别从Activity创建,以及应用往WindowManagerService添加window这两个流程分析下应用部分针对多Display的改动。

   

Activity的创建

先补充一点Activity创建的一些背景知识,Activity是android当中应用程序的一个基本

单元,抛开其中的复杂流程而言,由上面所简单介绍到的android GUI 框架,应用程序端与android 负责管理activity的系统服务ActivityManagerService之间大致关系如下图:


  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值