#android
#Android
Вопрос:
В настоящее время я пишу приложение, которое состоит из сервиса и activity. Служба работает в фоновом режиме, выполняя некоторую обработку звука в реальном времени. Если пользователь хочет получить некоторую информацию о запущенной службе или хочет изменить настройки сервиса, activity запускается и привязывается к сервису.
В настоящее время я использую систему асинхронного обмена сообщениями для связи между сервисом и activity. Например, служба может отправлять некоторые результаты activity через сообщение, а activity может обрабатывать это сообщение и показывать результаты. Это работает нормально, но писать материалы для обмена сообщениями для каждого сообщения сложно. И это не всегда необходимо. Иногда я хочу только спросить службу, установлен ли флаг или нет. Если я делаю это асинхронно, я должен отправить сообщение в службу, которая запрашивает значение флага, а затем служба должна отправить сообщение обратно в activity, чтобы ответить на запрос.
Итак, я хочу иметь некоторый механизм получения и настройки, который может синхронно обращаться к сервису. Это можно сделать с помощью binder, который тоже работает.
Проблема в том, что иногда мне нужна синхронная связь, чтобы получить значение флагов и т.д., А Иногда мне нужна асинхронная связь, чтобы передать результаты из сервиса в activity. Итак, что мне нужно, так это связующее и мессенджер. Но я не знаю, как это можно сделать, потому что сервис может возвращать только один объект из метода onBind (), либо объект binder, либо объект messenger.
Есть ли у вас какие-либо предложения, как это можно сделать, или какой-либо другой подход для реализации асинхронной и синхронной связи между activity и сервисом?
Заранее спасибо!
Тобиас
Ответ №1:
Если вы уже привязаны к сервису, ваша activity может предоставить службе объект listener, который затем будет вызываться службой при возникновении событий.
Вам просто нужно убедиться, что вы отменяете регистрацию этого объекта-прослушивателя перед отключением от службы, и сделайте оба до того, как activity будет уничтожена, чтобы ваша служба не заканчивалась сильной ссылкой на несуществующую activity.