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

Android 12系统源码_多屏幕(一)多屏幕设备显示Activity

前言

  • 分屏:是指一个屏幕分出多个窗口,分别显示不同应用的界面,这在当前的手机设备中很常见。
  • 多屏:是指一个设备存在多个屏幕,这些可能是虚拟屏幕或者实体硬件屏幕,不同的应用同时显示在不同的屏幕中,或者相同应用的不同页面同时现在在不同的屏幕中。

在我们日常生活中所接触的大部分以Android系统为载体的智能化硬件设备,大多都只有一个屏幕,但是有的时候会出现需要多个屏幕的场景,特别是随着新能源汽车行业竞争的白热化,越来越多的车厂倾向于通过多屏幕来获得消费者的青睐,比如为汽车主驾副驾所对应的主屏副屏等等,这就导致车机系统的多屏幕场景越来越多;而在智能手机端,多屏协助的场景也越来越多,比如将手机屏幕内容实时投放到大屏电视上已得到更好的视觉体验;

一、模拟辅助设备

1.1、模拟辅助设备功能开关

1、在Android开发者选项里面有一个模拟辅助设备功能开关。
模拟辅助设备
2、此功能默认为无,当我们点击并选择一个分辨率的时候,屏幕上会多出来一个小窗口。
在这里插入图片描述
这个小窗口其实就是系统新创建的一个虚拟屏幕,只不过Android系统将该虚拟屏幕的视图实时绘制在了此窗口上。

1.2、屏幕设备信息

1、我们通过adb执行dumpsys display指令,可以看到系统中当前存在的屏幕设备的相关信息。

  Logical Displays: size=1Display 0:mDisplayId=0mPhase=1mLayerStack=0mHasContent=truemDesiredDisplayModeSpecs={baseModeId=1 allowGroupSwitching=false primaryRefreshRateRange=[0 60] appRequestRefreshRateRange=[0 60]}mRequestedColorMode=0mDisplayOffset=(0, 0)mDisplayScalingDisabled=falsemPrimaryDisplayDevice=内置屏幕mBaseDisplayInfo=DisplayInfo{"内置屏幕", displayId 0", displayGroupId 0, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, real 1080 x 2400, largest app 1080 x 2400, smallest app 1080 x 2400, appVsyncOff 1000000, presDeadline 16666666, mode 1, defaultMode 1, modes [{id=1, width=1080, height=2400, fps=60.000004, alternativeRefreshRates=[90.0, 120.00001]}, {id=2, width=1080, height=2400, fps=120.00001, alternativeRefreshRates=[60.000004, 90.0]}, {id=3, width=1080, height=2400, fps=90.0, alternativeRefreshRates=[60.000004, 120.00001]}], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[1, 2, 3, 4], mMaxLuminance=420.0, mMaxAverageLuminance=210.1615, mMinLuminance=0.323}, userDisabledHdrTypes [], minimalPostProcessingSupported false, rotation 0, state ON, type INTERNAL, uniqueId "local:4630946545580055170", app 1080 x 2400, density 440 (419.449 x 419.257) dpi, layerStack 0, colorMode 0, supportedColorModes [0, 7, 9], address {port=130, model=0x40446d58ef1f1a}, deviceProductInfo DeviceProductInfo{name=, manufacturerPnpId=QCM, productId=1, modelYear=null, manufactureDate=ManufactureDate{week=27, year=2006}, connectionToSinkType=0}, removeMode 0, refreshRateOverride 0.0, brightnessMinimum 0.0, brightnessMaximum 1.0, brightnessDefault 0.07496032, installOrientation ROTATION_0}mOverrideDisplayInfo=DisplayInfo{"内置屏幕", displayId 0", displayGroupId 0, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, real 1080 x 2400, largest app 2313 x 2269, smallest app 1080 x 949, appVsyncOff 1000000, presDeadline 16666666, mode 1, defaultMode 1, modes [{id=1, width=1080, height=2400, fps=60.000004, alternativeRefreshRates=[90.0, 120.00001]}, {id=2, width=1080, height=2400, fps=120.00001, alternativeRefreshRates=[60.000004, 90.0]}, {id=3, width=1080, height=2400, fps=90.0, alternativeRefreshRates=[60.000004, 120.00001]}], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[1, 2, 3, 4], mMaxLuminance=420.0, mMaxAverageLuminance=210.1615, mMinLuminance=0.323}, userDisabledHdrTypes [], minimalPostProcessingSupported false, rotation 0, state ON, type INTERNAL, uniqueId "local:4630946545580055170", app 1080 x 2269, density 440 (419.449 x 419.257) dpi, layerStack 0, colorMode 0, supportedColorModes [0, 7, 9], address {port=130, model=0x40446d58ef1f1a}, deviceProductInfo DeviceProductInfo{name=, manufacturerPnpId=QCM, productId=1, modelYear=null, manufactureDate=ManufactureDate{week=27, year=2006}, connectionToSinkType=0}, removeMode 0, refreshRateOverride 0.0, brightnessMinimum 0.0, brightnessMaximum 1.0, brightnessDefault 0.07496032, installOrientation ROTATION_0}mRequestedMinimalPostProcessing=falsemFrameRateOverrides=[]mPendingFrameRateOverrideUids={}

2、默认情况下系统只有一个屏幕设备信息,而在我们开启模拟辅助显示设备功能开关之后,Android系统中便会多出来一个屏幕设备信息。

  Logical Displays: size=2Display 0:mDisplayId=0mPhase=1mLayerStack=0mHasContent=truemDesiredDisplayModeSpecs={baseModeId=1 allowGroupSwitching=false primaryRefreshRateRange=[0 60] appRequestRefreshRateRange=[0 60]}    mRequestedColorMode=0mDisplayOffset=(0, 0)mDisplayScalingDisabled=falsemPrimaryDisplayDevice=内置屏幕mBaseDisplayInfo=DisplayInfo{"内置屏幕", displayId 0", displayGroupId 0, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, real 1080 x 2400, largest app 1080 x 2400, smallest app 1080 x 2400, appVsyncOff 1000000, presDeadline 16666666, mode 1, defaultMode 1, modes [{id=1, width=1080, height=2400, fps=60.000004, alternativeRefreshRates=[90.0, 120.00001]}, {id=2, width=1080, height=2400, fps=120.00001, alternativeRefreshRates=[60.000004, 90.0]}, {id=3, width=1080, height=2400, fps=90.0, alternativeRefreshRates=[60.000004, 120.00001]}], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[1, 2, 3, 4], mMaxLuminance=420.0, mMaxAverageLuminance=210.1615, mMinLuminance=0.323}, userDisabledHdrTypes [], minimalPostProcessingSupported false, rotation 0, state ON, type INTERNAL, uniqueId "local:4630946545580055170", app 1080 x 2400, density 440 (419.449 x 419.257) dpi, layerStack 0, colorMode 0, supportedColorModes [0, 7, 9], address {port=130, model=0x40446d58ef1f1a}, deviceProductInfo DeviceProductInfo{name=, manufacturerPnpId=QCM, productId=1, modelYear=null, manufactureDate=ManufactureDate{week=27, year=2006}, connectionToSinkType=0}, removeMode 0, refreshRateOverride 0.0, brightnessMinimum 0.0, brightnessMaximum 1.0, brightnessDefault 0.07496032, installOrientation ROTATION_0}mOverrideDisplayInfo=DisplayInfo{"内置屏幕", displayId 0", displayGroupId 0, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, real 1080 x 2400, largest app 2313 x 2269, smallest app 1080 x 949, appVsyncOff 1000000, presDeadline 16666666, mode 1, defaultMode 1, modes [{id=1, width=1080, height=2400, fps=60.000004, alternativeRefreshRates=[90.0, 120.00001]}, {id=2, width=1080, height=2400, fps=120.00001, alternativeRefreshRates=[60.000004, 90.0]}, {id=3, width=1080, height=2400, fps=90.0, alternativeRefreshRates=[60.000004, 120.00001]}], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[1, 2, 3, 4], mMaxLuminance=420.0, mMaxAverageLuminance=210.1615, mMinLuminance=0.323}, userDisabledHdrTypes [], minimalPostProcessingSupported false, rotation 0, state ON, type INTERNAL, uniqueId "local:4630946545580055170", app 1080 x 2269, density 440 (419.449 x 419.257) dpi, layerStack 0, colorMode 0, supportedColorModes [0, 7, 9], address {port=130, model=0x40446d58ef1f1a}, deviceProductInfo DeviceProductInfo{name=, manufacturerPnpId=QCM, productId=1, modelYear=null, manufactureDate=ManufactureDate{week=27, year=2006}, connectionToSinkType=0}, removeMode 0, refreshRateOverride 0.0, brightnessMinimum 0.0, brightnessMaximum 1.0, brightnessDefault 0.07496032, installOrientation ROTATION_0}mRequestedMinimalPostProcessing=falsemFrameRateOverrides=[]mPendingFrameRateOverrideUids={}Display 2:mDisplayId=2mPhase=1mLayerStack=2mHasContent=falsemDesiredDisplayModeSpecs={baseModeId=4 allowGroupSwitching=false primaryRefreshRateRange=[0 60] appRequestRefreshRateRange=[0 60]}    mRequestedColorMode=0mDisplayOffset=(0, 0)mDisplayScalingDisabled=falsemPrimaryDisplayDevice=叠加视图 #1mBaseDisplayInfo=DisplayInfo{"叠加视图 #1", displayId 2", displayGroupId 0, FLAG_PRESENTATION, FLAG_TRUSTED, real 1280 x 720, largest app 1280 x 720, smallest app 1280 x 720, appVsyncOff 0, presDeadline 33333332, mode 4, defaultMode 4, modes [{id=4, width=1280, height=720, fps=60.000004, alternativeRefreshRates=[]}], hdrCapabilities null, userDisabledHdrTypes [], minimalPostProcessingSupported false, rotation 0, state ON, type OVERLAY, uniqueId "overlay:1", app 1280 x 720, density 213 (213.0 x 213.0) dpi, layerStack 2, colorMode 0, supportedColorModes [0], deviceProductInfo null, removeMode 0, refreshRateOverride 0.0, brightnessMinimum 0.0, brightnessMaximum 0.0, brightnessDefault 0.0, installOrientation ROTATION_0}mOverrideDisplayInfo=DisplayInfo{"叠加视图 #1", displayId 2", displayGroupId 0, FLAG_PRESENTATION, FLAG_TRUSTED, real 1280 x 720, largest app 1280 x 1280, smallest app 720 x 720, appVsyncOff 0, presDeadline 33333332, mode 4, defaultMode 4, modes [{id=4, width=1280, height=720, fps=60.000004, alternativeRefreshRates=[]}], hdrCapabilities null, userDisabledHdrTypes [], minimalPostProcessingSupported false, rotation 0, state ON, type OVERLAY, uniqueId "overlay:1", app 1280 x 720, density 213 (213.0 x 213.0) dpi, layerStack 2, colorMode 0, supportedColorModes [0], deviceProductInfo null, removeMode 0, refreshRateOverride 0.0, brightnessMinimum 0.0, brightnessMaximum 0.0, brightnessDefault 0.0, installOrientation ROTATION_0}mRequestedMinimalPostProcessing=falsemFrameRateOverrides=[]mPendingFrameRateOverrideUids={}

可以发现此事屏幕变成了两个。

二、将页面显示到特定屏幕中

2.1 获取当前屏幕设备信息

1、在Android系统默认情况下,我们新建一个Activity,并将其启动。

DisplayInfoActivity.java

public class DisplayInfoActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_activity);TextView tvDisplayInfo = findViewById(R.id.tv_display_info);Display display = getDisplay();tvDisplayInfo.setText(display.toString());}
}

main_activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/tv_display_info"android:layout_width="match_parent"android:layout_height="200dp"android:gravity="center"android:text="屏幕设备信息"android:textColor="#F00"android:textSize="30sp" /></LinearLayout>

2、默认显示效果如下所示。
在这里插入图片描述
通过Activity显示的信息我们可以发现,该页面当前显示的屏幕设备id为0,名字叫做内置屏幕。

2.2 将页面显示到其他屏幕上

1、当我们为Android系统开启了模拟辅助显示设备的功能之后,此时我们通过代码打开一个新的Activity,并为其指定displayid为2,这样这个新的Activity就会显示到这个新的虚拟屏幕中。

DisplayInfoActivity.java

public class DisplayInfoActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_activity);TextView tvDisplayInfo = findViewById(R.id.tv_display_info);Display display = getDisplay();tvDisplayInfo.setText(display.toString());findViewById(R.id.btn_open_activity).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(DisplayInfoActivity.this, DisplayInfoActivity.class);ActivityOptions activityOptions = ActivityOptions.makeBasic();activityOptions.setLaunchDisplayId(2);//指定要显示到displayid为2的屏幕设备上startActivity(intent, activityOptions.toBundle());}});}}

main_activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/tv_display_info"android:layout_width="match_parent"android:layout_height="200dp"android:gravity="center"android:text="屏幕设备信息"android:textColor="#F00"android:textSize="30sp" /><Buttonandroid:id="@+id/btn_open_activity"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="在模拟辅助设备中显示新页面" />
</LinearLayout>

2、当我们点击按钮的时候,当前页面会从主屏幕消失,并显示到模拟辅助功能所开启的窗口里面。
在这里插入图片描述
通过Activity显示的信息我们可以发现,该页面当前显示的屏幕设备id为2,名字叫做叠加视图,也就是新增的虚拟屏幕设备ID。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 超声波眼镜清洗机哪个性价比高?2024推荐四款清洁力高的超声波清洗机
  • 第十一章:图论part06 108.冗余连接 109.冗余连接II (补)
  • 3、pnpm yarn npm
  • MySQL笔记(十):视图
  • 【力扣】70.爬楼梯
  • 嵌入式初学-C语言-十七
  • 算法板子:分解质因数
  • 【等保测评】网络安全服务认证技术规范(等级保护测评)
  • openEuler 自定义ISO制作(logo,名称,ISO)
  • LeetCode刷题笔记第17题:电话号码的字母组合
  • web安全基础学习
  • R9000P 双系统安装 win11 和 ubuntu
  • VBA 程序运行中禁用鼠标键盘
  • 单 元 测 试
  • 前端工程师学习springboot2.x之配置idea热更新实现高效率开发节奏
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • JAVA SE 6 GC调优笔记
  • JavaScript DOM 10 - 滚动
  • October CMS - 快速入门 9 Images And Galleries
  • React 快速上手 - 07 前端路由 react-router
  • 测试如何在敏捷团队中工作?
  • 搭建gitbook 和 访问权限认证
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 深入浏览器事件循环的本质
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 协程
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​io --- 处理流的核心工具​
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #NOIP 2014# day.1 T2 联合权值
  • #QT(串口助手-界面)
  • (1)无线电失控保护(二)
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (7)svelte 教程: Props(属性)
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (笔试题)合法字符串
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (排序详解之 堆排序)
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)Linux Shell编程——输入输出重定向
  • (一) storm的集群安装与配置
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)linux 命令大全
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?