Android辅助显示-跨活动调用的持久性
我正在使用AndroidAndroid辅助显示-跨活动调用的持久性,android,multithreading,android-activity,hdmi,Android,Multithreading,Android Activity,Hdmi,我正在使用AndroidMediaRouter(API 16)和Presentation(API 17)类来生成和管理辅助显示。我按照中的示例创建了独特的非镜像输出,到目前为止效果良好(使用通过HDMI电缆连接到HDTV的Nexus 10进行测试) 现在,我遇到了这样一种情况:我希望在活动X中创建的演示对象继续在辅助显示器上运行,即使活动X调用另一个活动Y。在这种情况下,活动X仍在堆栈上,但活动Y现在位于堆栈顶部 问题在于,当活动Y启动时,物理辅助显示器将恢复为镜像。当我退出Activity Y
MediaRouter
(API 16)和Presentation
(API 17)类来生成和管理辅助显示。我按照中的示例创建了独特的非镜像输出,到目前为止效果良好(使用通过HDMI电缆连接到HDTV的Nexus 10进行测试)
现在,我遇到了这样一种情况:我希望在活动X
中创建的演示对象继续在辅助显示器上运行,即使活动X
调用另一个活动Y
。在这种情况下,活动X
仍在堆栈上,但活动Y
现在位于堆栈顶部
问题在于,当活动Y
启动时,物理辅助显示器将恢复为镜像。当我退出Activity Y
时,Activity X
演示文稿的内容会返回(因为我从未对其调用过disease()
)
因此,问题是:即使下级活动在本地设备上运行,我如何使演示文稿连接到在该显示器上运行的辅助显示器?
更新:我想到的一种方法是从后台线程实例化演示
对象;随后创建的另一个活动
不应干扰后台线程写入其表示
对象的内容。但我不确定这是否有效,因为通常不允许从后台线程更新UI
另一种方法是,如果可能的话,禁止下级
活动
使用辅助显示,从而防止在新的活动
激活时将辅助显示恢复为镜像。但我也没有找到一个方法来做到这一点。再次感谢您的建议。我实施了@commonware建议的一种方法(由Mark Allison在回答我的问题时独立提出)。谢谢你的建议
综上所述,问题是,我无法在本地设备上通过活动调用在后台运行第二个屏幕演示文稿。这是因为表示
类是作为对话框
的子类实现的,因此与活动
实例相关联。因此,当一个新的活动启动时,第二个屏幕返回到镜像(而不是显示我专门为它生成的其他内容)
解决方案是将所有“从属”活动
重构为原始活动
的片段(即启动第二个屏幕的片段)。然后,我不再调用startActivity()
,而是使用FragmentTransactions
启动/停止新的Fragments
。净效果是启动演示文稿的活动仍在运行,因此当新活动启动时,辅助显示不再中断
我的情况更加复杂,因为顶层的活动
(启动第二个屏幕)实际上是一个SherlockFragmentActivity
,它使用ViewPager
和FragmentStatePagerAdapter
——所以我不得不将所有这些都塞进片段
。它还需要显式管理操作栏
选项卡、菜单项和主图标
总的来说,我认为代码的透明度有点低。。。但它是有效的
注意:谷歌已经实现了一个辅助屏幕界面,这很好。但我不知道他们为什么这么做。与其将演示文稿
类拖入对话框
,不如提供一个更通用的解决方案,可以轻松地在后台运行,也就是说,不考虑设备上的前台活动
。如上所述,这样的解决方案可以避免我进行大量代码重构。让这个问题死而复生,愿意在某个时候帮助有同样问题的人
我最近遇到了一个更深层次但又相似的问题:我必须在系统的任何地方(我使用嵌入式安卓系统)和主屏幕上显示演示文稿,任何应用程序都可以使用
我首先想到创建一个服务来管理演示文稿的显示,并在应用程序启动时初始化。但问题是我无法显示演示文稿,因为正如您所提到的,它继承自一个对话框,并且出现了与构建对话框时调用getApplicationContext()时相同的问题
我的解决办法是:
有一个名为WindowManager.LayoutParam的窗口,用于显示电池电量不足警报对话框等警报。使用此属性,您可以从服务创建一个对话框并正确显示它。由于表示类是该对话框的子类,只需设置此属性即可使其正常工作
神奇发生在这里:
WindowManager.LayoutParams l = mPresentation.getWindow()
.getAttributes();
l.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
mPresentation.show();
只是提醒一下,为了实现这一点,应用程序XML应该具有SYSTEM\u ALERT\u WINDOW权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
我认为这应该也能解决你的问题,但这有点离题,你需要适当的处理,以便在需要时尽快停止演示 您是否绝对需要活动X和活动Y作为单独的活动?您不能使用片段X1和片段X2使用单个活动X实现相同的视觉效果吗?只是想一想…@commonware:谢谢你的建议。正如你所建议的,将X和Y结合成一个具有不同片段的单一活动是可能的,但在这种情况下,不是没有大量手术。活动X实际上是一个SherlockFragmentActivity,它正忙于管理多个选项卡/片段(通过ViewPager和FragmentStatePagerAdapter)