我正在使用 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
(启动第二个屏幕)实际上是一个使用 SherlockFragmentActivity
和 ViewPager
的 FragmentStatePagerAdapter
这一事实,我的情况变得更加复杂——所以我不得不将所有这些都塞进一个 Fragment
中。它还需要对 ActionBar
选项卡、菜单项和主页图标进行显式管理。
总的来说,我认为代码不太透明......但它有效!
注意:Google 实现了辅助屏幕界面是件好事。但我不确定他们为什么要这样做。与其将 Presentation
类硬塞到 Dialog
中,不如提供一个更通用的解决方案,可以轻松地在后台运行,即不管设备上的前台 Activities
是什么,那就太好了。如上所述,这样的解决方案可以让我免于进行大量代码重构。
关于Android 辅助显示 - 跨 Activity 调用的持久性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15091067/