2017-06-04 65 views
1

我正在嘗試爲Android Auto添加MediaBrowserService到現有的媒體播放器應用程序。該應用程序具有管理MediaSessionCallbacks和相關狀態的單個活動。它已被設置爲發出事件,背景MediaBrowserService消耗並用於構建其內容樹。Android Auto - 後臺服務與活動之間的通信

這一切工作正常時,流程就像是:

Start my app -> Start Android Auto -> Browse media

然而,它屬於平在其正面當流量:

Start Android Auto -> Browse media

...作爲,當應用程序未啓動並在Android Auto啓動之前在後臺運行時。

的問題似乎是,雖然我MediaBrowserService將使用Android Auto自動啓動,它不會當它這樣做創建我的應用程序的Activity的相應實例(這意味着沒有事件通知MediaBrowserService,因此沒有內容在Android Auto中可用)。

理想情況下,似乎MediaBrowserService需要能夠檢查並查看應用程序的「主」Activity是否正在運行,並在其中產生新實例。但不確定這是否可能,並且往往認爲這是採取這種做法的錯誤方法。

解決此問題的正確方法是什麼?我不想複製MediaBrowserService實施中的所有應用程序的MediaSession處理和回放相關代碼。儘可能保持輕量級。有沒有辦法確保ActivityMediaBrowserService處於活動狀態時始終運行?

回答

0

答案是重構。很多很多的重構。

簡而言之,Android期望使用活動來填充particular architectural niche。具體而言,您正在通過設備的屏幕向用戶顯示界面。其他使用情況,例如在後臺運行的「無頭」Activity,似乎既不被期望也不被支持。

因此,答案是將所有應用程序的播放相關代碼從Activity中移出,並將其移到背景Service中,並提供用於傳遞相關命令(以及接收數據,狀態更新等)的API )從前景Activity(如果/當用戶正在與應用程序的用戶界面進行交互時)或從/到MediaBrowserService(如果/當用戶正在通過Android Auto的UI進行交互時)。如果/需要的話,啓動服務是可以輕鬆完成的任何環境。

這似乎是解決方案。如果你有一個非常平凡的現有代碼庫,你肯定會很乏味。更好地預測這類問題,並從一開始就相應地構建您的應用程序;在你的Activity實現之外保留與你的應用的用戶界面不直接相關的東西。