【问题标题】:Android Auto - Communication between background service and ActivityAndroid Auto - 后台服务和活动之间的通信
【发布时间】:2017-06-04 12:46:46
【问题描述】:

我正在尝试将 Android Auto 的 MediaBrowserService 添加到现有的媒体播放器应用中。该应用程序有一个管理MediaSessionCallbacks 和相关状态的活动。它已被设置为发出事件,后台 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 是否正在运行,并在未运行时生成一个新实例。但不确定这是否可能,而且往往感觉这里采取的方法是错误的。

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

【问题讨论】:

    标签: java android android-auto mediabrowserservice


    【解决方案1】:

    这个问题的答案是重构。大量的重构。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      相关资源
      最近更新 更多