Android 辅助显示 - 跨 Activity 调用的持久性

标签 android multithreading android-activity hdmi

我正在使用 Android MediaRouter (API 16) 和 Presentation (API 17) 类来生成和管理辅助显示。我遵循了 ApiDemos 中的示例以创建独特的非镜像输出,到目前为止它运行良好(使用通过 HDMI 电缆连接到 HDTV 的 Nexus 10 进行测试)。

现在,我希望在 Activity X 中创建的 Presentation 对象继续在辅助显示器上运行,即使 Activity X 调用另一个 Activity Y。在这种情况下,Activity X 仍在堆栈中,但 Activity Y 现在位于堆栈之上。

问题是当 Activity Y 启动时,物理辅助显示器恢复为镜像。当我退出 Activity Y 时,Activity X 的 Presentation 的内容返回(因为我从未对其调用 dismiss())。

所以问题是:即使在本地设备上运行从属 Activity,我怎样才能让 Presentation 附加到在该显示器上运行的辅助显示器?

更新: 我想到的一种方法是从后台线程实例化 Presentation 对象;那么随后创建的另一个 Activity 不应干扰后台线程写入其 Presentation 对象的内容。但我不确定这是否可行,因为通常不允许从后台线程更新 UI。

另一种方法是,如果可能的话,禁用从属 Activity 对辅助显示器的使用,从而防止它在新的 Activity 出现时将辅助显示器恢复为镜像变得活跃。但我也没有找到办法做到这一点。再次感谢您的任何建议。

最佳答案

我实现了@CommonsWare 建议的一种方法(Mark Allison 独立地回答了我在 his blog 上的问题)。感谢您的建议!

回顾一下,问题是我无法在本地设备上通过 Activity 调用在后台运行第二个屏幕演示。这是因为 Presentation 类是作为 Dialog 的子类实现的,因此绑定(bind)到 Activity 实例。因此,当启动新的 Activity 时,第二个屏幕会返回镜像(而不是显示我专门为其生成的其他内容)。

解决方案 是将所有“从属”Activities 重构为原始 Fragments(即启动第二个屏幕的代码)的 Activity。然后,我没有调用 startActivity() ,而是使用 Fragments 启动/停止新的 FragmentTransactions 。最终效果是启动 Presentation 的 Activity 仍在运行,因此当新的 Activity 启动时辅助显示不再中断。

由于顶层 Activity(启动第二个屏幕)实际上是一个使用 SherlockFragmentActivityViewPagerFragmentStatePagerAdapter 这一事实,我的情况变得更加复杂——所以我不得不将所有这些都塞进一个 Fragment 中。它还需要对 ActionBar 选项卡、菜单项和主页图标进行显式管理。

总的来说,我认为代码不太透明......但它有效!

注意:Google 实现了辅助屏幕界面是件好事。但我不确定他们为什么要这样做。与其将 Presentation 类硬塞到 Dialog 中,不如提供一个更通用的解决方案,可以轻松地在后台运行,即不管设备上的前台 Activities 是什么,那就太好了。如上所述,这样的解决方案可以让我免于进行大量代码重构。

关于Android 辅助显示 - 跨 Activity 调用的持久性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15091067/

相关文章:

java - 如何在android中使用dip和sip

java - Tomcat 内部多任务处理的高性能

ios - 在后台线程中处理 JPEG 图像

java - 通过 Intent.putExtra 发送字节数组不起作用

android - 将值从 Activity 传递到广播接收器并从广播接收器启动服务

Android 启动模式不起作用

android - 如何使用选择器为 ImageView 着色?

android - 接口(interface)中的属性不能有支持字段

android - FFMpeg:将图像与音频合并特定持续时间

multithreading - 用于在 ipython/jupyter 笔记本中运行单元格的新线程