我正在尝试为现有媒体播放器应用添加Android Auto MediaBrowserService
。该应用只有一个活动来管理MediaSession
,Callbacks
和相关状态。它已设置为发出事件,后台MediaBrowserService
消耗并用于构建其内容树。
当流程如下时,一切正常:
Start my app -> Start Android Auto -> Browse media
但是,当流量为:
时,它会在脸上掉落 Start Android Auto -> Browse media
...就像在Android自动启动之前应用程序未启动并在后台运行时一样。
问题似乎是虽然我的MediaBrowserService
将由Android Auto自动启动,但它不会创建我的应用Activity
的相应实例(这意味着没有事件要通知) MediaBrowserService
,因此Android Auto中没有可用的内容。
理想情况下,MediaBrowserService
似乎需要能够检查应用程序的“main”Activity
是否正在运行,并且如果/不存在则生成新实例。但不确定这是否可能,而且往往觉得这是采取错误的做法。
解决此问题的正确方法是什么?我不想在MediaSession
实现中复制应用程序的所有MediaBrowserService
处理和回放相关代码。这应该保持尽可能轻。有没有办法确保应用Activity
始终在MediaBrowserService
处于活动状态时运行?
答案 0 :(得分:0)
答案是重构。大量的重构。
简而言之,Android希望使用Activities来填充particular architectural niche。具体来说,就是您通过设备屏幕向用户显示界面的位置。其他用例,例如在后台运行“无头”Activity
,似乎既没有预期也没有支持。
因此答案是从Activity
中取出所有应用程序的播放相关代码,将其移至后台Service
,并提供传递相关命令的API(和接收)数据,状态更新等)来自/到前台Activity
(如果/当用户与应用程序的UI交互时)或从/到MediaBrowserService
(如果/当用户正在进行交互时)通过Android Auto的用户界面)。如果需要,可以从任一上下文轻松地启动服务。
这似乎是解决方案。如果你有一个与你合作的非常重要的现有代码库,那肯定会很乏味。更好地预测这类问题,并从一开始就相应地构建您的应用程序;在Activity
实施之外保留与您的应用UI不直接相关的内容。