Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android辅助显示-跨活动调用的持久性_Android_Multithreading_Android Activity_Hdmi - Fatal编程技术网

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

Android辅助显示-跨活动调用的持久性,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

我正在使用Android
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)