Android Auto - 后台服务和Activity之间的通信

时间:2017-06-04 12:46:47

标签: java android android-auto mediabrowserservice

我正在尝试为现有媒体播放器应用添加Android Auto MediaBrowserService。该应用只有一个活动来管理MediaSessionCallbacks和相关状态。它已设置为发出事件,后台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处于活动状态时运行?

1 个答案:

答案 0 :(得分:0)

答案是重构。大量的重构。

简而言之,Android希望使用Activities来填充particular architectural niche。具体来说,就是您通过设备屏幕向用户显示界面的位置。其他用例,例如在后台运行“无头”Activity,似乎既没有预期也没有支持。

因此答案是从Activity中取出所有应用程序的播放相关代码,将其移至后台Service,并提供传递相关命令的API(和接收)数据,状态更新等)来自/到前台Activity(如果/当用户与应用程序的UI交互时)或从/到MediaBrowserService(如果/当用户正在进行交互时)通过Android Auto的用户界面)。如果需要,可以从任一上下文轻松地启动服务。

这似乎是解决方案。如果你有一个与你合作的非常重要的现有代码库,那肯定会很乏味。更好地预测这类问题,并从一开始就相应地构建您的应用程序;在Activity实施之外保留与您的应用UI不直接相关的内容。