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



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

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

问题是,当Activity Y启动时,物理辅助显示器将恢复为镜像。 当我退出Activity Y时,Activity X's演示文稿的内容会返回(因为我从未打电话给dismiss()(。

因此,问题是:即使从属活动正在本地设备上运行,如何保持附加到辅助显示器的演示文稿在该显示器上运行?

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

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

我实现了@CommonsWare建议的方法之一(马克·艾利森(Mark Allison(在他的博客上回答了我的问题(。 感谢您的建议!

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

解决方案是将所有"从属"Activities重构为原始ActivityFragments(即启动第二个屏幕的那个(。 然后,我不是调用startActivity(),而是使用 FragmentTransactions 启动/停止新Fragments。 实际效果是启动演示文稿的活动仍在运行,因此当新活动启动时,辅助显示不再中断。

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

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

注意:谷歌已经实现了辅助屏幕界面,这很好。 但我不确定他们为什么这样做。 与其将Presentation类硬塞进Dialog,如果他们提供一个更通用的解决方案,可以轻松地在后台运行,即无论设备上的前景Activities如何,那就太好了。 如上所述,像这样的解决方案将使我免于大量代码重构。

这个问题从死里复活,愿意及时帮助有同样问题的人,

最近遇到了一个更深层次但类似的问题:我必须在系统上的任何地方显示演示文稿(我使用嵌入式 android(,并且在主屏幕中可以使用任何应用程序。

我首先想到创建一个服务来管理演示文稿的显示,并在应用程序启动时初始化。但问题是我无法显示演示文稿,因为正如您提到的,它继承自对话框,并且在构建对话框时调用 getApplicationContext(( 时发生的相同问题。

我的解决方案是: 有一个名为TYPE_SYSTEM_ALERT的WindowManager.LayoutParam,用于显示低电量警报对话框等警报。使用此属性,您可以从服务创建对话框并正确显示它,并且由于演示文稿类是对话框的子级,只需设置此属性即可使其工作。

神奇的事情发生在这里:

 WindowManager.LayoutParams l = mPresentation.getWindow()
                    .getAttributes();
 l.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
 mPresentation.show();

只是提醒一下,为了实现您的,应用程序XML应该具有SYSTEM_ALERT_WINDOW权限。

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

我认为这也应该解决您的问题,但它有点微妙,您需要适当的处理以在需要时尽快停止演示。

最新更新