在辅助监视器上运行单独的应用程序

2023-12-01

Android 支持将应用程序渲染到辅助屏幕(4.2 中添加),但是否可以在主显示器上运行一个应用程序,在辅助显示器上运行另一个应用程序?


Android SDK 附带一个Presentation允许前台活动在外部显示器上显示替代内容的类。这是针对“第二屏幕”应用程序而构建的,您可能在外部显示器上观看电影并使用触摸屏控制播放、与朋友聊天等。Presentation它实际上是一个Dialog,因此仅在由前台活动驱动时才有效。

然而,这是可能的,使用WindowManager, 有一个Service在外部显示器上显示内容。我有a PresentationService class演示了该技术并简化了其使用。给定一个Display代表外部显示器的对象(例如,DisplayManager), 你可以有WindowManager直接内容Display,从一些View您膨胀或以其他方式创建的。

/***
  Copyright (c) 2014 CommonsWare, LLC

  Licensed under the Apache License, Version 2.0 (the "License"); you may
  not use this file except in compliance with the License. You may obtain
  a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
 */

package com.commonsware.cwac.preso;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.view.ContextThemeWrapper;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;

/**
 * A service that drives a presentation from the background. Use this when
 * presentations need to span activities or when they should be occurring even
 * if the app's UI has moved to the background.
 *
 * This is an abstract class -- create a subclass and override getThemeId() and
 * buildPresoView().
 */
public abstract class PresentationService extends Service implements
    PresentationHelper.Listener {
  /**
   * @return the theme to use for driving the resources used by
   * this presentation
   */
  protected abstract int getThemeId();

  /**
   * Override this to provide the UI that goes into the presentation.
   * This works somewhat like a fragment's onCreateView().
   *
   * @param ctxt a Context, in case you need one, but note that it will
   *            <i>not</i> be an activity
   * @param inflater a LayoutInflater, in case you need one for creating
   *                 the UI
   * @return the View that should be shown on the external display
   */
  protected abstract View buildPresoView(Context ctxt,
                                         LayoutInflater inflater);

  private WindowManager wm=null;
  private View presoView=null;
  private PresentationHelper helper=null;

  /**
   * {@inheritDoc}
   */
  @Override
  public IBinder onBind(Intent intent) {
    return(null);
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public void onCreate() {
    super.onCreate();

    helper=new PresentationHelper(this, this);
    helper.onResume();
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public void onDestroy() {
    helper.onPause();

    super.onDestroy();
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public void showPreso(Display display) {
    Context presoContext=createPresoContext(display);
    LayoutInflater inflater=LayoutInflater.from(presoContext);

    wm=
        (WindowManager)presoContext.getSystemService(Context.WINDOW_SERVICE);

    presoView=buildPresoView(presoContext, inflater);
    wm.addView(presoView, buildLayoutParams());
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public void clearPreso(boolean switchToInline) {
    if (presoView != null) {
      try {
        wm.removeView(presoView);
      }
      catch (Exception e) {
        // probably the window is gone, don't worry, be
        // happy
      }
    }

    presoView=null;
  }

  protected WindowManager.LayoutParams buildLayoutParams() {
    return(new WindowManager.LayoutParams(
                                          WindowManager.LayoutParams.MATCH_PARENT,
                                          WindowManager.LayoutParams.MATCH_PARENT,
                                          0,
                                          0,
                                          WindowManager.LayoutParams.TYPE_TOAST,
                                          0, PixelFormat.OPAQUE));
  }

  private Context createPresoContext(Display display) {
    Context displayContext=createDisplayContext(display);
    final WindowManager wm=
        (WindowManager)displayContext.getSystemService(WINDOW_SERVICE);

    return(new ContextThemeWrapper(displayContext, getThemeId()) {
      @Override
      public Object getSystemService(String name) {
        if (Context.WINDOW_SERVICE.equals(name)) {
          return(wm);
        }

        return(super.getSystemService(name));
      }
    });
  }
}

(来源自v0.4.6)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在辅助监视器上运行单独的应用程序 的相关文章

  • Android应用程序开发中的EditText警告

    在 xml 文件中声明 EditText 时 我收到了如下警告 没有标签视图通过 android labelFor id id start 属性指向此文本字段 编辑文本代码是
  • Android 应用程序因 Firebase 电话身份验证而崩溃

    我正在使用 firebase 进行电话号码身份验证 当我使用我的电话号码时 它会自动验证它 但是当我使用另一个电话号码时 我得到类转换异常 它说 getGoogleApiForMethod 返回 Gms stackoverflow上也有类似
  • Android:如何在多语言资源中重用字符串

    自从我的第一个 Android 项目以来 这个问题一直困扰着我 考虑以 en 作为默认值的多语言字符串资源 res values strings xml lt The default language en res values de st
  • Android 中读取未提交的事务

    我正在进行大量数据库操作 这会向我的数据库添加大约 10 000 条记录 由于这可能需要很长时间 因此最好使用事务 db startTransaction do write operations db setTransactionSucce
  • 标记上存在语法错误,需要 AnnotationName - 查询错误

    我收到了令牌语法错误 AnnotationName 预期出现在以下行 query findInBackground new FindCallback
  • 如何在android中将多个图像合并为一个图像?

    我正在开发 android 的分布式应用程序 我已将单个图像分成 4 个部分 然后对其进行处理 现在我想将 4 个位图图像组合成一个图像 我怎样才能做到这一点 Bitmap parts new Bitmap 4 Bitmap result
  • AdMob 广告未显示

    因此 我使用 Play Services SDK 实施了 AdMob 广告 我已经 按照书本 做了所有事情 但广告不会显示 如果我将 AdView 背景设置为白色 它会显示空白 但不显示广告 我正在使用 Fragments 但我将 AdVi
  • SQLite 中的 NOT NULL 列和错误捕获

    我有一个由用户定义的 EditText 填充的数据库 所有编辑文本都不允许有空字段 我知道我可以通过几个简单的 if 语句来检查这一点 if myEditText getText toString equals display error
  • com.google.android:android:jar 的 dependency.dependency.version' 丢失

    我正在尝试使用 Eclipse 运行一个简单的虚拟 Android 项目 并且我正在尝试使用 Maven amd 我已按照已接受答案的教程进行操作this https stackoverflow com questions 6735562
  • 在我授予许可后,表面视图不显示相机

    public View onCreateView LayoutInflater inflater Nullable ViewGroup container Bundle savedInstanceState View view inflat
  • Android Fragment 中的 SharedPreferences

    我正在尝试读取 Fragment 内的 SharedPreferences 我的代码用于获取任何其他活动中的首选项 SharedPreferences preferences getSharedPreferences pref 0 我收到错
  • Android键盘点击搜索输入时出现和消失

    我在用谷歌地图 Js API当我搜索一个地方时 我的输入搜索栏工作正常 当我通过 iPhone 设备使用它时 它也工作得很好 但是当我通过Android 设备然后键盘立即出现和消失 我已经找到了一些关于当我按下搜索栏时 android 键盘
  • GpsStatusListener:尽管状态为 GpsStatus.GPS_EVENT_FIRST_FIX,但修复中未使用卫星

    我向我的位置管理器添加了一个 GPS 状态侦听器 以便查看何时获得第一个修复 当我收到 GPS EVENT FIRST FIX 时 我会循环遍历所有卫星 但为什么修复中没有使用它们 usedInFix 我的日志对所有卫星都显示 错误 fin
  • 即时应用程序上的文本转语音崩溃

    我正在实现一个即时应用程序 该应用程序利用 Android 设备上提供的文本转语音功能 我已经设法得到了TextToSpeech按照 Android 开发博客文章中详细说明的说明 实例已初始化并可在非即时应用程序中正常工作Android 中
  • 如果从超链接打开,应用程序将启动两次

    我正在开发一个应用程序 可以从多个地方启动 例如日历中的超链接 我在以下场景中面临问题 如果应用程序已启动并在后台运行 并且用户单击本机日历中的事件 超链接来启动应用程序 我的应用程序作为新实例启动两次 在正在运行的应用程序列表中 我可以看
  • 抽屉式导航不显示片段

    我创建了一个新的 Android Studio 项目 我的 MainActivity 是导航抽屉活动 所以 我无法显示碎片 我在互联网上和这里读过很多帖子 解释 我打开导航抽屉 选择菜单 播客 PodcastsFragment 应该显示 但
  • Android图层列表不显示比例可绘制项目?

    使用下面的图层列表 我的比例绘制从未显示 这是为什么 菜单 对话框 标题 xml
  • Android appwidget 远程视图未更新

    当我从某些活动更新小部件时 列表远程视图不会更新 我的意思是刷新自身 它会出现直到应用程序小部件的更新 日志显示 但不会进入列表视图的适配器以用新数据填充它 public void onUpdate Context context AppW
  • 尝试在后台使用 AsyncTask 解析 JSON 时强制关闭

    我是 Android 开发新手 正在研究 json 数据 我设法让解析工作 我想显示一个 ProgressDialog 我读到我需要使用 AsyncTask 但由于某种原因 一旦我将相同的工作代码放入 doInBackground 中 即使
  • DOM 中不再存在缓存元素

    就像在类似的问题中一样 我使用appium java 尝试选择元素 在移动应用程序中 我要转到页面 之后有许多元素 android widget ImageView 0 我需要选择 6 个 例如 这样的元素并执行其他步骤 Byt 只能选择一

随机推荐

  • Power BI 上个月 DAX 滚动总计

    我正在 POWER BI 中工作 并尝试计算上个月滚动总计的 DAX 表达式 我有一个过滤器 我选择某个月份 我想计算上个月的滚动总数 下面的计算非常适合计算所选日期范围的滚动总计 如何计算前几个月的滚动总额 Rolling Total C
  • 在 Android 中使用 Html.fromHtml() 突出显示文本颜色?

    我正在开发一个应用程序 其中会有一个搜索屏幕 用户可以在其中搜索特定关键字 并且该关键字应该是 突出显示 我找到了 Html fromHtml 方法 但我想知道这是否是正确的做法或 不是 请让我知道您对此的看法 或者比处理简单得多Spann
  • 仅从特定文件夹进行 Git 合并

    我已经为客户 X 创建了一个 Rails 网站 我现在有一个客户 Y 他想要一个与客户 X 执行完全相同的操作但具有不同外观的网站 我从 clientXcode 创建了一个 git 分支 并将其命名为 clientYcode 然后我对视图进
  • 有没有办法根据 R 中另一个数据框中的共享值构建成对数据框?

    例如 DF1 是 Id1 Id2 1 10 2 10 3 7 4 7 5 10 并想要 DF2 Id1 Id2 1 2 1 5 2 5 3 4 数据框 DF2 是 DF1 中 Id1 列中的一组值 它们共享 DF1 中 Id2 中的公共值
  • 将多维数组元素转换为不同类型

    假设我有这个多维数组 float vertices new float 0f 1 28f 1 28f 2 56f 3 84f 2 56f 5 12f 1 28f 3 84f 0f 1 28f 0f 0f 1 28f new float 0f
  • 使用数组方法的素数列表

    我有一个获取素数列表的代码 def primes numbers num primes 2 3 step Math sqrt num 1 2 do i is prime true primes each do p here if p gt
  • 单元测试 ASP.Net MVC 授权属性以验证重定向到登录页面

    这可能只是需要另一双眼睛的情况 我一定错过了一些东西 但我不明白为什么这种东西不能被测试 我基本上试图通过使用 Authorize 属性标记控制器来确保未经身份验证的用户无法访问视图 并且我尝试使用以下代码对此进行测试 Fact publi
  • 重新打开窗口抛出 Gtk-CRITICAL **:gtk_widget_get_window:断言“GTK_IS_WIDGET(小部件)”失败

    我有简单的 python3 gtk3 代码 它连接到 dbus 并监听所有事件 当用户单击托盘中的图标时 他必须看到包含所有显示的早期事件的窗口 代码 我不知道问题出在哪里并且代码大小 gt 100行 https github com ra
  • string.h 中的 strupr() 和 strlwr() 是 ANSI 标准的一部分吗?

    我在互联网上寻找这个 并且在每个具有 string h 功能的地方都没有提到这两个 是因为什么 它们并不存在于每个编译器中 它们是来自 Microsoft C 库的非标准函数 此后 MS 已弃用它们 转而采用重命名的函数 strlwr an
  • C++ 中的 OpenID 库?

    我需要在 C 网站中使用 openid 但找不到可以使用的工作库 我正在尝试使用这个 http kin klever net libopkele requirements 但它会停止配置并显示以下消息 检查 OPENSSL 配置 错误 未找
  • Django 在调试模式下损坏管道

    我在 Nginx 后面的远程服务器上有 django 1 3 如果我使用 apache mod wsgi 运行 django 我可以查看 apache 日志文件中的错误 没关系 但我想在控制台中使用 如果我运行 django 自己的开发服务
  • TFS 构建代理用户功能的值可以在构建步骤中获得吗?

    我正在尝试在 TFS 中编写一个构建步骤 该步骤依赖于了解构建代理存储 nuget exe 的位置 标准 nuget install 步骤以破坏构建执行的方式破坏了参数的顺序 所以我想使用batch shell ps 步骤之一自己运行exe
  • 检查连续元素之间的差异是否相同

    我是在 Prolog 中使用算术的新手 我做过一些小程序 但主要涉及逻辑 我正在尝试实现一个将返回的函数true or false每个连续元素对之间的差异是否相同 我的输入如下所示 sameSeqDiffs 3 5 7 9 2 我觉得我需要
  • Gradle 替代 mvn install

    我在 mvn 上构建了 2 个不同的项目 我正在尝试更换为 Gradle 项目 1 是一个 SDK 项目 2 使用该 sdk 示例 在 maven 的时候 它使用 mvn install 创建工件 将整个项目添加到本地存储库中 我喜欢这样在
  • 如何将 linq 结果转换为 HashSet 或 HashedSet

    我有一个 ISet 类的属性 我正在尝试将 linq 查询的结果获取到该属性中 但不知道如何执行此操作 基本上 寻找最后一部分 ISet
  • 执行程序时,代码块打开 2 个控制台窗口

    我最近安装了 Code Blocks 并使用它进行 C 编程 我编写了一个基本的 Hello World 程序 当我运行该程序时 会打开 2 个控制台窗口而不是 1 个 如果只有输出 则第一个控制台在显示输出后关闭 然后第二个窗口保持打开状
  • 如果数据库发生变化,自动刷新内容

    当 mysql 数据库表更改时 如何自动将数据库行 PHP 的值添加到页面 而不刷新页面本身 所以 它有点像这样 自动刷新浏览器以响应文件系统更改 but当数据库发生变化时 不要刷新浏览器来更改文件系统 而是更新内容 而不刷新任何内容 谢谢
  • 使用Session存储Datatable

    目前 我们使用会话在页面中存储数据表 这样我们就不必一次又一次地访问数据库来获取相同的数据表 但我担心它会占用服务器内存 如果有一天大量用户登录 服务器的响应会变慢 我们的应用程序也可能崩溃 请告诉我将数据表存储到会话中是个好主意还是我们应
  • flex / bison:如何在同一输入文件上切换两个词法分析器

    我如何移交打开的文件 例如由另一个扫描仪读取到下一个扫描仪 并将其交给解析器 Flex 缓冲区无法轻松地从一台扫描仪传输到另一台扫描仪 许多细节对于扫描仪来说是私有的 需要进行逆向工程 从而导致可维护性的丧失 然而 只要语义类型兼容 将两个
  • 在辅助监视器上运行单独的应用程序

    Android 支持将应用程序渲染到辅助屏幕 4 2 中添加 但是否可以在主显示器上运行一个应用程序 在辅助显示器上运行另一个应用程序 Android SDK 附带一个Presentation允许前台活动在外部显示器上显示替代内容的类 这是