2

我正在尝试将MediaBrowserServiceAndroid Auto 添加到现有的媒体播放器应用程序中。该应用程序有一个管理MediaSession,Callbacks和相关状态的活动。它已被设置为发出事件,后台使用这些事件MediaBrowserService并用于构建其内容树。

当流程如下时,这一切都很好:

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

但是,当流量为:

Start Android Auto -> Browse media

...例如,当应用程序未启动并在启动 Android Auto 之前在后台运行时。

问题似乎是,虽然我MediaBrowserService将由 Android Auto 自动启动,但它不会Activity在这样做时创建我的应用程序的相应实例(这意味着没有通知事件MediaBrowserService,因此 Android Auto 中没有可用的内容)。

理想情况下,似乎MediaBrowserService需要能够检查并查看应用程序的“主”Activity是否正在运行,并在未运行时生成一个新实例。但不确定这是否可能,而且往往觉得这是错误的做法。

解决此问题的正确方法是什么?我不想在实现中复制所有应用程序的MediaSession处理和播放相关代码MediaBrowserService。这应该尽可能保持轻量级。有没有办法确保应用程序Activity在激活时始终运行MediaBrowserService

4

1 回答 1

2

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

简而言之,Android 期望将活动用于填充特定的架构利基。具体来说,您通过设备屏幕向用户显示界面的利基市场。其他用例,例如Activity在后台运行“无头”,似乎既不期望也不支持。

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

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

于 2017-07-12T13:12:31.337 回答