использование синхронной и асинхронной связи между Activity и сервисом на Android

#android

#Android

Вопрос:

В настоящее время я пишу приложение, которое состоит из сервиса и activity. Служба работает в фоновом режиме, выполняя некоторую обработку звука в реальном времени. Если пользователь хочет получить некоторую информацию о запущенной службе или хочет изменить настройки сервиса, activity запускается и привязывается к сервису.

В настоящее время я использую систему асинхронного обмена сообщениями для связи между сервисом и activity. Например, служба может отправлять некоторые результаты activity через сообщение, а activity может обрабатывать это сообщение и показывать результаты. Это работает нормально, но писать материалы для обмена сообщениями для каждого сообщения сложно. И это не всегда необходимо. Иногда я хочу только спросить службу, установлен ли флаг или нет. Если я делаю это асинхронно, я должен отправить сообщение в службу, которая запрашивает значение флага, а затем служба должна отправить сообщение обратно в activity, чтобы ответить на запрос.

Итак, я хочу иметь некоторый механизм получения и настройки, который может синхронно обращаться к сервису. Это можно сделать с помощью binder, который тоже работает.

Проблема в том, что иногда мне нужна синхронная связь, чтобы получить значение флагов и т.д., А Иногда мне нужна асинхронная связь, чтобы передать результаты из сервиса в activity. Итак, что мне нужно, так это связующее и мессенджер. Но я не знаю, как это можно сделать, потому что сервис может возвращать только один объект из метода onBind (), либо объект binder, либо объект messenger.

Есть ли у вас какие-либо предложения, как это можно сделать, или какой-либо другой подход для реализации асинхронной и синхронной связи между activity и сервисом?

Заранее спасибо!

Тобиас

Ответ №1:

Если вы уже привязаны к сервису, ваша activity может предоставить службе объект listener, который затем будет вызываться службой при возникновении событий.

Вам просто нужно убедиться, что вы отменяете регистрацию этого объекта-прослушивателя перед отключением от службы, и сделайте оба до того, как activity будет уничтожена, чтобы ваша служба не заканчивалась сильной ссылкой на несуществующую activity.