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
Реализация (ы).