返回顶部
首页 > 资讯 > 移动开发 >Android Presentation实现双屏异显
  • 821
分享到

Android Presentation实现双屏异显

Android 2022-06-06 11:06:35 821人浏览 泡泡鱼
摘要

一、概述 现在越来越多的Android设备有多个屏幕,双屏异显应用场景最多的应该就是类似于收银平台那种设备,在主屏上店员能够对点商品进行选择录入,副屏则是展示给我们的账单详情,

一、概述

现在越来越多的Android设备有多个屏幕,双屏异显应用场景最多的应该就是类似于收银平台那种设备,在主屏上店员能够对点商品进行选择录入,副屏则是展示给我们的账单详情,但是它只通过了一个软件系统就实现了双屏异显这个功能,而Presentation正是这其中的关键。

二、Presentation分析

1.简述:首先从它的继承关系上来看Presentation是继承自Dialog的,就是说它其实就是一种特殊的Dialog用于在第二个屏幕上显示内容的,它在创建时会和它的目标展示屏幕相关联,包括它的context和一些配置参数等。

2.Context:然而这里提到的context和它的容器所处的context会有不同,它会用自身的context去加载presentation的布局和相关资源以此来确保在目标屏幕上能够展示正确的大小和获取合适的屏幕密度。

3.自动移除:虽说presentation和它相关联的Activity的context不同,但是他们也不是完全分离的关系,当和presentation相关联的屏幕被移除后,presentation也会自动的被移除,所以当Activity处于pause和resume的状态时Presentation也需要特别注意当前显示的内容的状态。

4.屏幕选择:因为有时候我们的Android设备有多个屏幕,所以选择合适的屏幕去展示就显得非常重要了,所以在我们显示Presentation的时候需要去让我们的系统去选择合适的屏幕来进行展示,以下是两种方式去选择一个合适的屏幕。

这是我们选择展示presentation最简单的一种方式,media router是一种系统层级的服务,它能够追踪到系统当中所有可用的音频和视屏route,当有路径被选中或取消选中,还有当适合用presentation进行显示的时候的route改变的时候它会发送一个通知,然后应用本身会监控这个通知自动的去选择presentation的展示或者隐藏,这里的推荐使用的presentation display其实只是media router推荐的,如果我们的应用需要在第二个屏幕上进行显示就使用,如果不用的话就用本地来展示内容。  

利用media router去选择presentation的显示屏幕
利用display manager去选择persentation的显示屏幕

DisplayManager能够监控到我们系统当中的所有连接上的显示设备,然而不是所有的设备都适用于作为副屏来进行内容展示的,比如当一个Activity想显示一个presentation在主屏幕上,其实效果就会相当于在主Activity当中显示了一个特殊的Dialog,所以当我们选择这种方式去选用Presentation去显示的时候就必须给它绑定一个可用的display。

三、源码分析

首先来看它的构造函数


public Presentation(Context outerContext, Display display, int theme) {
 super(createPresentationContext(outerContext, display, theme), theme, false);
 mDisplay = display;
 mDisplayManager = (DisplayManager)getContext().getSystemService(DISPLAY_SERVICE);
 final Window w = getWindow();
 final WindowManager.LayoutParams attr = w.getAttributes();
 attr.token = mToken;
 w.setAttributes(attr);
 w.setGravity(Gravity.FILL);
 w.setType(TYPE_PRESENTATION);
 setCanceledOnTouchOutside(false);
 }

在它的形参中第一个Context参数非常重要,这是应用正在展示presentation的一个context,它是Presentation自己创建的它自己的一个context,基于这个context才能正确的在它所关联的屏幕上展示合适的信息。然后代码里面设置了这个window的相关属性。

接着我们看看它自身的Context的创建


private static Context createPresentationContext(
 Context outerContext, Display display, int theme) {
 //首先判断传入的context和display是否为空,为空则抛出异常
 if (outerContext == null) {
 throw new IllegalArgumentException("outerContext must not be null");
 }
 if (display == null) {
 throw new IllegalArgumentException("display must not be null");
 }
 Context displayContext = outerContext.createDisplayContext(display);
 //这里是对它的主题的判断,为0即为默认主题
 if (theme == 0) {
 TypedValue outValue = new TypedValue();
 displayContext.getTheme().resolveAttribute(
  com.android.internal.R.attr.presentationTheme, outValue, true);
 theme = outValue.resourceId;
 }
 // Derive the display's window manager from the outer window manager.
 // We do this because the outer window manager have some extra infORMation
 // such as the parent window, which is important if the presentation uses
 // an application window type.
 final WindowManagerImpl outerWindowManager =
 (WindowManagerImpl)outerContext.getSystemService(WINDOW_SERVICE);
 final WindowManagerImpl displayWindowManager =
 outerWindowManager.createPresentationWindowManager(displayContext);
 //因为ContextThemeWrapper的父类是我们的Context
 //所以这里最终返回的就是Presentation给我们创建好的Context
 return new ContextThemeWrapper(displayContext, theme) {
 //在这个方法中又返回的是Object对象
 @Override
 public Object getSystemService(String name) {
 if (WINDOW_SERVICE.equals(name)) {
  return displayWindowManager;
  //如果和这个传入的name相同的话返回的就是上面windowManager创建出来的WindowManager的一个具体实现
 }
 //否则就返回的是Context这个抽象类中的一种服务类型
 return super.getSystemService(name);
 }
 };
 }

接着我们继续看一下Presentation对屏幕增加、移除和改变的监听


private final DisplayListener mDisplayListener = new DisplayListener() {
 @Override
 public void onDisplayAdded(int displayId) {
 }
 @Override
 public void onDisplayRemoved(int displayId) {
 if (displayId == mDisplay.getDisplayId()) {
 handleDisplayRemoved();
 }
 }
 @Override
 public void onDisplayChanged(int displayId) {
 if (displayId == mDisplay.getDisplayId()) {
 handleDisplayChanged();
 }
 }
 };

这里我们看到它对add并没有进行处理,所以我们进一步去看一下onDisplayRemoved中的关键handlerDisplayRemoved和onDisplayChanged中的核心handlerDisplayChanged的实现

handlerDisplayChanged:


private void handleDisplayChanged() {
 onDisplayChanged();
 // We currently do not support configuration changes for presentations
 // (although we could add that feature with a bit more work).
 // If the display metrics have changed in any way then the current configuration
 // is invalid and the application must recreate the presentation to get
 // a new context.
 if (!isConfigurationStillValid()) {
 Log.i(TAG, "Presentation is being dismissed because the "
  + "display metrics have changed since it was created.");
 cancel();
 }
 }

在这个方法中,我们遗憾的发现Google程序员并没有对当前屏幕配置发生改变后做特殊的处理,所以当我们的屏幕尺寸等信息改变时,我们的presentation必须重新Create去重新获取context,再重新进行显示。


@Override
 protected void onStart() {
 super.onStart();
 mDisplayManager.reGISterDisplayListener(mDisplayListener, mHandler);
 // Since we were not watching for display changes until just now, there is a
 // chance that the display metrics have changed. If so, we will need to
 // dismiss the presentation immediately. This case is expected
 // to be rare but surprising, so we'll write a log message about it.
 if (!isConfigurationStillValid()) {
 Log.i(TAG, "Presentation is being dismissed because the "
  + "display metrics have changed since it was created.");
 mHandler.sendEmptyMessage(MSG_CANCEL);
 }
 }

同时在onStart中我们也能发现,因为它暂时还没有对display change进行监听,而这里又是有可能会改变的,所以在这种情况下它是打印了一个log去通知一下。 

handlerDisplayRemoved这个方法的话是系统自动去发送一个消息,然后调用后把presentation自动取消掉。

四、总结

在基本分析了Presentation之后,主要要注意一下它的Context以及和Activity之间绑定的关系,其实从简单来看,它就是一个Dialog,不过是可以显示在多个屏幕上。当然上述分析深度尚浅,更深入的理解和一些问题要在后续工作中多使用再继续观察。

您可能感兴趣的文章:android开发教程之textview内容超出屏幕宽度显示省略号Android下Activity全屏显示实现方法Android编程之界面实现全屏显示的方法(2种方法)Android判断NavigationBar是否显示的方法(获取屏幕真实的高度)分享Android平板电脑上开发应用程序不能全屏显示的问题解决android 中去掉窗口全屏显示的简单方法Android从网络中获得一张图片并显示在屏幕上的实例详解Android实现固定屏幕显示的方法Android使用百度地图出现闪退及定位时显示蓝屏问题的解决方法


--结束END--

本文标题: Android Presentation实现双屏异显

本文链接: https://lsjlt.com/news/28395.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android Presentation实现双屏异显
    一、概述 现在越来越多的Android设备有多个屏幕,双屏异显应用场景最多的应该就是类似于收银平台那种设备,在主屏上店员能够对点商品进行选择录入,副屏则是展示给我们的账单详情,...
    99+
    2022-06-06
    Android
  • Android 双屏异显(Presentation) 开发,将第二个页面投屏到副屏上
    1. 背景 最近开发的一个项目,有两个屏幕,需要将第二个页面投屏到副屏上, 这就需要用到Android的双屏异显(Presentation)技术了,研究了一下,这里做下笔记。 我们那个副屏是一块汽车的...
    99+
    2023-09-01
    android 双屏异显 Presentation 副屏 投屏
  • Android之 双屏异显控制
    一 简介 1 我们用的手机基本上只有一个屏幕,那这里的双屏指的什么呢?其实现在手机都是支持双屏的,我们可以在开发者选项里面来打开这个控制,来看下什么是双屏。 可以打开设置 -> 开发者选项 -> 模拟辅助显示设备来开启副屏显示,还可以选择显...
    99+
    2023-09-01
    android
  • Android三种双屏异显实现方法介绍
    在各种产品脑洞大开的时代,需求也是日益新异,笔者最近开发了一套双屏异显app。现在做一些总结 1.双屏异显第一种实现方式(官方提供的Presentation) Android 提供了...
    99+
    2023-01-31
    Android双屏异显 Android双屏异显实现方式
  • ubuntu如何实现双屏显示
    ubuntu实现双屏显示的操作步骤:打开"软件和更新",找到“附加驱动 ”选项。系统默认是最后一个选项,需要改为选择“NAVIDIA”的驱动。重新启动ubuntu。检查和设置双屏,可在终端输入:“xrandr”查看显示器相关信息。最后,在设...
    99+
    2024-04-02
  • RK3288如何增加双屏异显 eDP+LVDS
    这期内容当中小编将会给大家带来有关RK3288如何增加双屏异显 eDP+LVDS,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。CPU:RK3288系统:Android 5.1下面是官方文档中的信息。rk3...
    99+
    2023-06-05
  • AndroidPresentation双屏异显开发流程详细讲解
    目录1. 背景2. 创建主屏布局3. 创建副屏布局4. 将页面投屏到副屏上4.1 MediaRouter4.2 DisplayManager5. 横屏状态下双屏异显的处理6. 将需要...
    99+
    2023-01-31
    Android Presentation双屏异显 Android Presentation Android双屏异显
  • Android下Activity全屏显示实现方法
    本文较为详细的讲述了Android下Activity全屏显示实现方法。分享给大家供大家参考。具体方法如下: 方法一: 使用xml的方法,在该项目的AndroidManifest...
    99+
    2022-06-06
    方法 activity Android
  • Android App实现闪屏页广告图的全屏显示实例
    目录1. 适配长屏幕的全面屏2. 适配刘海屏或者水滴屏凹形屏幕的显示模式1. 适配长屏幕的全面屏 至于全屏展示,就得做适配工作,有以下两种方式可进行适配: 在 Android 8.0...
    99+
    2024-04-02
  • Android实现固定屏幕显示的方法
    本文实例讲述了Android实现固定屏幕显示的方法。分享给大家供大家参考。具体如下: 在Android开发中我们会碰到开发屏幕扭转的情况,如何固定住屏幕ScreenOrient...
    99+
    2022-06-06
    方法 Android
  • Android怎么实现设备的异显功能
    这篇文章主要讲解了“Android怎么实现设备的异显功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android怎么实现设备的异显功能”吧!一、什么是异显无线投屏或者有线投屏的时候,安卓...
    99+
    2023-06-29
  • Android 实现全屏和无标题栏的显示
    在Android实现没有标题栏的方法有两种: 在代码中添加 requestWindowFeature(Window.FEATURE_NO_TITLE); 在清单文件And...
    99+
    2022-06-06
    标题栏 Android
  • Android 屏保实现
    一、原理 当达到某一条件时超过一段时间时,弹出popwindow,大小为全屏,当条件不满足或者用户点击时,让popwindow消失。 二、屏保...
    99+
    2022-06-06
    屏保 Android
  • Android 实现全屏显示的几种方法整理
    Android 实现全屏显示的几种方法整理 A、设置主题实现全屏 直接在AndroidManifest.xml文件中设定Activity主题为全屏模式 android:the...
    99+
    2022-06-06
    方法 Android
  • Android如何实现图片显示与屏幕适配
    这篇文章主要介绍Android如何实现图片显示与屏幕适配,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android 图片显示与屏幕适配的问题在Android开发中比较头疼的是Android的分辨率问题,那么这里给大...
    99+
    2023-05-30
    android
  • Android如何实现设备的异显功能详解
    目录前言一、什么是异显二、实现步骤2.1权限2.2定义分屏的界面2.3操作分屏界面总结前言 大家都知道无线投屏或者有线投屏的功能,但应该很少有人知道安卓中的异显功能? 这篇文章是为了...
    99+
    2024-04-02
  • 解决 Android APP 启动页白屏问题及如何实现全屏显示
    目录 一、白屏原因分析 二、解决白屏方案 方案一、提供 .png 背景图 方案二、使用 Layout-list 制作背景 1.  制作替代白屏的背景:bg_splash.xml 2. 将 bg_splash.xml 设为 Window 背景...
    99+
    2023-09-09
    android
  • Android双目三维重建:Android双目摄像头实现双目测距
    Android双目三维重建:Android双目摄像头实现双目测距 目录 Android双目三维重建:Android双目摄像头实现双目测距 1.开发版本 2.Android双目摄像头 3.双目相机标定  (1)双目相机标定-Python版  ...
    99+
    2023-09-04
    android 双目测距 android双目测距 android三维重建 三维重建
  • Android开发如何实现浏览器全屏显示功能
    这篇文章给大家分享的是有关Android开发如何实现浏览器全屏显示功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:业务需求:浏览器设置中支持全屏显示的功能。分析:只需要在设置界面上增加是否全屏的che...
    99+
    2023-05-30
    android 浏览器
  • android屏幕全屏的实现代码
    去掉标题栏:requestWindowFeature(Window.FEATURE_NO_TITLE);API上是这么说的:int    ...
    99+
    2022-06-06
    Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作