Android Auto - Связь между фоновым сервисом и Activity

Я пытаюсь добавить MediaBrowserService для Android 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 активен?

1 ответ

Ответ на это был рефакторинг. Много-много рефакторинга.

В двух словах, Android ожидает, что действия будут использоваться для заполнения определенной архитектурной ниши. В частности, ниша, где вы отображаете интерфейс для пользователя через экран устройства. Другие варианты использования, такие как "безголовый" Activity работает в фоновом режиме, кажется, не ожидается и не поддерживается.

Таким образом, ответ состоял в том, чтобы вынуть весь код приложения, связанный с воспроизведением, из Activity, переместить его в фон Serviceи предоставить API для передачи соответствующих команд (и получения данных, обновлений состояния и т. д.) с / на передний план Activity (если / когда пользователь взаимодействует с пользовательским интерфейсом приложения) или из / в MediaBrowserService (если / когда пользователь взаимодействует через пользовательский интерфейс Android Auto). Запуск службы - это то, что может быть легко сделано из любого контекста, если / когда это необходимо.

Это, кажется, решение. Конечно, это может быть утомительно, если у вас есть нетривиальная база кода, с которой вы работаете. Намного лучше предвидеть подобные проблемы и соответствующим образом спроектировать свое приложение с самого начала; храните вещи, которые не имеют прямого отношения к пользовательскому интерфейсу вашего приложения, за пределами вашего Activity Реализация (ы).

Другие вопросы по тегам