У меня есть служба, которая постоянно проверяет наличие новых задач. Если есть новая задача, я хочу обновить пользовательский интерфейс активности, чтобы отобразить эту информацию. Я нашел https://github.com/commonsguy/cw-andtutorials/tree/master/18-LocalService/ этот пример. Это хороший подход? Есть еще примеры?
Спасибо.
Ответы:
См. Ниже мой исходный ответ - этот шаблон хорошо сработал, но недавно я начал использовать другой подход к взаимодействию между сервисами и действиями:
Используйте RxJava для выполнения асинхронных операций.
Если службе необходимо продолжить фоновые операции, даже если активность не запущена, также запустите службу из класса приложения, чтобы она не останавливалась при отключении.
Преимущества, которые я обнаружил в этом подходе по сравнению с методом startService () / LocalBroadcast:
Пример кода. Сначала сервис:
И Activity, которая привязывается к сервису и получает обновления барометрической высоты:
Макет этого действия:
Если службе необходимо работать в фоновом режиме без привязки Activity, ее также можно запустить из класса Application при
OnCreate()
использованииContext#startService()
.Мой оригинальный ответ (от 2013 г.):
В вашем сервисе: (используя COPA в качестве сервиса в примере ниже).
Используйте LocalBroadCastManager. В onCreate вашего сервиса настройте вещатель:
Если вы хотите уведомить пользовательский интерфейс о чем-либо:
В вашей деятельности:
Создайте слушателя onCreate:
и зарегистрируйте его в onStart:
источник
onStart()
oronResume()
. В общем, если Activity просит сервис сделать что-то, но завершает работу до получения результата, разумно предположить, что результат больше не требуется. Точно так же при запуске Activity следует предполагать, что Служба не обрабатывает невыполненных запросов.для меня самым простым решением было отправить трансляцию, в действии oncreate я зарегистрировал и определил трансляцию следующим образом (updateUIReciver определяется как экземпляр класса):
И из службы вы отправляете намерение следующим образом:
не забудьте отменить регистрацию восстановления в действии при уничтожении:
источник
Я бы использовал связанный сервис для этого и общался с ним, внедряя слушателя в свою деятельность. Итак, если ваше приложение реализует myServiceListener, вы можете зарегистрировать его в качестве слушателя в своей службе после того, как вы связались с ним, вызовите listener.onUpdateUI из вашей связанной службы и обновите свой пользовательский интерфейс там!
источник
Я бы порекомендовал попробовать Otto , EventBus, специально созданный для Android. Ваше действие / пользовательский интерфейс может прослушивать события, отправленные в шину из службы, и отделяться от серверной части.
источник
Решение Клайда работает, но это широковещательная передача, которая, я уверен, будет менее эффективной, чем прямой вызов метода. Я могу ошибаться, но я думаю, что трансляции предназначены больше для общения между приложениями.
Я предполагаю, что вы уже знаете, как связать службу с действием. Я делаю что-то вроде кода ниже, чтобы решить эту проблему:
Я не упомянул биты для обеспечения безопасности потоков, что очень важно. Обязательно используйте блокировки или что-то подобное при проверке и использовании или изменении ссылок на фрагменты в службе.
источник
источник
Мое решение может быть не самым чистым, но оно должно работать без проблем. Логика заключается в том, чтобы просто создать статическую переменную для хранения ваших данных в
Service
и обновлять ваше представление каждую секунду в вашемActivity
.Допустим, у вас есть
String
файл,Service
который вы хотите отправитьTextView
на свойActivity
. Это должно выглядеть такВаша служба:
Ваша активность:
источник
android
да», если это список, попробуйте создать адаптер или сохранить данные с помощью sqllite / realm db.