2013-02-26 40 views
4

我正在使用Android MediaRouter(API 16)和Presentation(API 17)類生成&管理輔助顯示。我按照ApiDemos中的示例創建了獨特的非鏡像輸出,到目前爲止它工作正常(使用通過HDMI電纜連接到HDTV的Nexus 10進行測試)。Android輔助顯示 - 跨活動調用的持久性

現在,我希望在Activity X中創建的演示文稿對象繼續在輔助顯示屏上運行,即使Activity X調用另一個Activity Y。在這種情況下,Activity X仍處於堆棧中,但Activity Y現在位於其上。

問題是,當Activity Y啓動時,物理輔助顯示恢復爲鏡像。當我退出Activity Y時,Activity X's演示的內容會返回(因爲我從未在其上調用過dismiss())。

所以問題是:即使下級活動正在本地設備上運行,我如何讓演示文稿附加到在該顯示器上運行的輔助顯示器?

更新:我認爲這樣做的一種方式是從後臺線程實例化Presentation對象;那麼隨後創建的另一個Activity不應該干擾後臺線程正在寫入的內容對其Presentation對象。但我不確定這會起作用,因爲通常不允許從後臺線程更新UI。

如果可能的話,另一種方法是禁止從屬Activity使用輔助顯示,從而防止當新的Activity變爲活動狀態時輔助顯示恢復爲鏡像。但我還沒有找到辦法做到這一點。再次感謝您的任何建議。

+0

你絕對需要活動X和活動Y作爲單獨的活動嗎?難道你不能用單個Activity X使用Fragment X1和Fragment X2完成相同的視覺效果?只是一個想法... – CommonsWare 2013-02-26 15:05:19

+0

@CommonsWare:謝謝你的建議。按照你的建議,將X和Y組合成一個具有不同片段的活動也許是可能的,但在這種情況下,並非沒有很多手術。活動X實際上是一個SherlockFragmentActivity,它忙於管理多個選項卡/片段(通過ViewPager和FragmentStatePagerAdapter)。活動Y是兒童片段調用以提供「模態」類型操作的幾種活動之一。你認爲值得嘗試後臺線程方法嗎?或者這可能是一個死衚衕?再次感謝。 – gcl1 2013-02-26 15:22:56

+0

如果你的後臺線程能夠工作,我會感到很驚訝,因爲你的問題似乎並不是'Presentation'沒有被更新,而是被鏡像取代。 – CommonsWare 2013-02-26 15:24:50

回答

2

我實現了@CommonsWare建議的方法之一(Mark Allison獨立回答我的關於his blog的問題)。感謝您的建議!

在審查中,問題是我無法繼續在本地設備上調用Activity調用在後臺運行的第二個屏幕演示文稿。這是因爲Presentation類是作爲Dialog的子類實現的,因此與Activity實例相關聯。所以當一個新的Activity啓動時,第二個屏幕返回到鏡像(而不是顯示我專門爲其生成的其他內容)。

的解是重構所有的「下級」 Activities成原始Activity(即,在發起第二屏幕之一)的Fragments。然後,我使用FragmentTransactions開始/停止新的Fragments,而不是致電startActivity()。最終效果是開始演示的活動仍在運行,因此當新活動啓動時,輔助顯示不再中斷。

我的情況下,由事實頂級Activity(這將啓動第二個屏幕)實際上是一個使用ViewPagerFragmentStatePagerAdapter一個SherlockFragmentActivity進一步複雜 - 所以我不得不塞進一個Fragment這一切。它還需要明確管理ActionBar選項卡,菜單項和主頁圖標。

總體而言,我認爲代碼是不透明的...但它的工作原理!

注意:谷歌已經實現了輔助屏幕界面,這很好。但我不確定他們爲什麼如此做。而不是將Presentation課程拼湊成Dialog,如果他們提供了一個更易於在後臺運行的更通用的解決方案,即與設備上的前景Activities無關,那就不錯了。如上所述,像這樣的解決方案可以讓我從很多代碼重構中解脫出來。

+0

上述解決方案有效,但如果您的應用需要通過傳遞意圖(例如,打開相機或圖片庫)來打開外部應用,則仍存在問題。所以我仍然在尋找改進界面形式的其他想法和/或Google的幫助。所有建議歡迎,謝謝! – gcl1 2013-03-13 13:47:10

+0

同意 - 理想情況下,演示實施應該像一個獨立的應用程序一樣工作,用於輔助顯示。它的做法並不太有用。 – Price 2015-05-14 09:13:58

0

將這一問題從死願意回來幫某人在某處的時間同樣的問題,

我最近進入了一個更深,但類似的,問題:我在任何地方上顯示演示該系統(我使用嵌入式android),並在主屏幕上可以使用任何應用程序。

我首先想到創建一個服務來管理演示文稿的顯示,並在應用程序啓動時初始化。但是問題在於我無法顯示演示文稿,因爲正如您所提到的那樣,它會繼承自對話框,並且會在構建對話框時發生時調用getApplicationContext()時發生同樣的問題。

我的解決方案是: 有一個名爲TYPE_SYSTEM_ALERT的WindowManager.LayoutParam,用於顯示諸如低電量警報對話框之類的警報。使用此屬性,您可以從服務創建對話框並正確顯示它,並且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" /> 

我認爲這應該解決您的問題爲好,但它是一個有點精巧的,你需要一個適當的治療,只要您需要停止演示。