6

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

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

问题是Activity Y启动时,物理辅助显示器会恢复为镜像。当我 exit时, PresentationActivity Y的内容会返回(因为我从未调用过它)。Activity X'sdismiss()

所以问题是:即使从属活动正在本地设备上运行,我如何才能将演示文稿附加到在该显示器上运行的辅助显示器?

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

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

4

2 回答 2

2

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

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

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

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

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

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

于 2013-03-01T15:50:14.500 回答
1

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

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

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

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

魔法发生在这里:

 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" />

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

于 2015-10-21T20:14:36.153 回答