Я пишу свое первое приложение для Android и пытаюсь наладить связь между услугами и действиями. У меня есть служба, которая будет работать в фоновом режиме и делать некоторые записи GPS и времени. У меня будет Активность, которая будет использоваться для запуска и остановки Сервиса.
Итак, во-первых, я должен быть в состоянии выяснить, работает ли Служба при запуске Действия. Здесь есть и другие вопросы, так что я думаю, что смогу это выяснить (но не стесняйтесь предлагать советы).
Моя настоящая проблема: если активность запущена, а служба запущена, мне нужен способ для отправки сообщений в активность. Простые строки и целые числа на данный момент - сообщения о статусе в основном. Сообщения не будут появляться регулярно, поэтому я не думаю, что опрос службы - это хороший способ, если есть другой путь. Я хочу получить это сообщение только тогда, когда действие было запущено пользователем - я не хочу запускать действие из службы. Другими словами, если вы запустите Activity, а служба будет запущена, вы увидите некоторые сообщения о состоянии в пользовательском интерфейсе Activity, когда произойдет что-то интересное. Если вы не запустите действие, вы не увидите эти сообщения (они не так интересны).
Похоже, я должен быть в состоянии определить, запущена ли служба, и если да, добавить активность в качестве прослушивателя. Затем удалите Activity как слушателя, когда Activity приостановится или остановится. Это действительно возможно? Единственный способ понять, как это сделать, - это заставить Activity реализовать Parcelable и создать файл AIDL, чтобы я мог передать его через удаленный интерфейс Сервиса. Хотя это кажется излишним, и я понятия не имею, как Activity должна реализовывать writeToParcel () / readFromParcel ().
Есть ли более простой или лучший способ? Спасибо за любую помощь.
РЕДАКТИРОВАТЬ:
Для тех, кто заинтересован в этом позже, есть пример кода от Google для обработки этого через AIDL в каталоге примеров: /apis/app/RemoteService.java
источник
busy-wait
активность? Объясните пожалуйста ?Activity.onCreate()
?Intents
, отправляя данные черезParcellable
сообщения между ними?Аскер, вероятно, давно прошел мимо этого, но в случае, если кто-то еще ищет это ...
Есть другой способ справиться с этим, который, я думаю, может быть самым простым.
Добавьте
BroadcastReceiver
к своей деятельности. Зарегистрируйте его, чтобы получить какое-либо пользовательское намерение,onResume
и отмените его регистрациюonPause
. Затем отправьте это намерение из вашей службы, если вы хотите отправить свои обновления статуса или что у вас есть.Убедитесь, что вы не будете несчастны, если какое-то другое приложение прислушается к вашему
Intent
(может ли кто-нибудь сделать что-нибудь вредоносное?), Но кроме этого, вы должны быть в порядке.Образец кода был запрошен:
В моем сервисе у меня есть это:
(
RefreshTask.REFRESH_DATA_INTENT
это просто постоянная строка.)В своей деятельности по прослушиванию я определяю
BroadcastReceiver
:Я объявляю мой получатель на вершине класса:
Я переопределить,
onResume
чтобы добавить это:И я переопределить,
onPause
чтобы добавить:Теперь я слушаю, как моя служба говорит: «Эй, иди обновляйся». Я мог бы передавать данные
Intent
вместо обновления таблиц базы данных и затем возвращаться, чтобы найти изменения в моей деятельности, но, поскольку я все равно хочу, чтобы изменения сохранялись, имеет смысл передавать данные через БД.источник
Broadcasts
это фантастика, и, кроме того, если вы не хотите, чтобы ваша трансляция выходила за рамки вашего собственного процесса, рассмотрите возможность использованияLocalBroadcast
: developer.android.com/reference/android/support/v4/content/…Используйте,
LocalBroadcastManager
чтобы зарегистрировать получателя для прослушивания трансляции, отправленной с локального сервиса внутри вашего приложения, ссылка здесь:http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html
источник
LocalBroadcastManager
теперь осуждается в пользуLiveData
или других инструментов шаблона наблюдателя: developer.android.com/reference/androidx/localbroadcastmanager/...Я удивлен, что никто не дал ссылку на библиотеку событий Отто
http://square.github.io/otto/
Я использую это в моих приложениях для Android, и это работает без проблем.
источник
android:process=":my_service"
они не могут общаться.Использование Messenger - это еще один простой способ связи между Сервисом и Деятельностью.
В действии создайте обработчик с соответствующим мессенджером. Это будет обрабатывать сообщения от вашего Сервиса.
Посланник может быть передан в службу, прикрепив его к сообщению:
Полный пример можно найти в демонстрациях API: MessengerService и MessengerServiceActivity . Обратитесь к полному примеру, чтобы узнать, как работает MyService.
источник
myService.send(message);
должно бытьmessenger.send(message);
вместо.Другой метод, который не упоминается в других комментариях, - это привязка к сервису из действия с использованием bindService () и получение экземпляра сервиса в обратном вызове ServiceConnection. Как описано здесь http://developer.android.com/guide/components/bound-services.html
источник
Вы также можете использовать
LiveData
это работает какEventBus
.Затем добавьте наблюдателя от вашего
Activity
.Вы можете прочитать больше из этого блога.
источник
Другим способом может быть использование наблюдателей с поддельным классом модели через деятельность и сам сервис, реализуя вариацию шаблона MVC. Я не знаю, является ли это лучшим способом для достижения этой цели, но это способ, который работал для меня. Если вам нужен пример, попросите об этом, и я что-нибудь опубликую.
источник
Мой метод:
Класс для управления отправкой и получением сообщения от / к службе / деятельности:
В примере деятельности:
В примере обслуживания:
Отправить сообщение от Activity / Service:
Как это работает:
на активности вы запускаете или привязываете сервис. Методы «OnBind» службы возвращают Binder его MessageManager. В Activity через реализацию методов интерфейса «Service Connection» «OnServiceConnected» вы получаете этот IBinder и инициализируете его с помощью MessageManager. После того, как Activity инициирует свой MessageManager, MessageHandler отправляет и Handshake в службу, чтобы он мог установить своего отправителя «MessageHandler» («private Messenger mMsgSender;» в MessageManager). При этом сервис узнает, кто отправляет его сообщения.
Вы также можете реализовать это с помощью «отправителя» Списка / Очереди Messenger в MessageManager, чтобы вы могли отправлять несколько сообщений в разные Действия / Службы, или вы можете использовать «получатель» Списка / Очереди Messenger в MessageManager, чтобы вы могли получить несколько сообщение из разных видов деятельности / услуг.
В экземпляре «MessageManager» у вас есть список всех полученных сообщений.
Как вы можете видеть, соединение между «Activity Messenger» и «Service Messenger» с помощью этого экземпляра «MessageManager» является автоматическим, оно выполняется с помощью метода «OnServiceConnected» и с помощью «Рукопожатия».
Надеюсь, что это полезно для вас :) Большое спасибо! Пока: D
источник
Чтобы ответить на вопрос @MrSnowflake, приведите пример кода. Это XABBER в настоящее время с открытым исходным кодом
Application
класса .Application
Класс централизации и координацииListeners
и ManagerInterfaces и многое другое. Менеджеры всех видов загружаются динамически.Activity´s
Запущенный в Xabber сообщит в какомListener
они виде. И когдаService
начало это сообщить вApplication
классе, как началось. Теперь , чтобы отправить сообщение наActivity
все , что вам нужно сделать , это сделать вашActivity
статьlistener
какой тип вам нужно. ВOnStart()
OnPause()
реестре / отрег. ОнService
может попроситьApplication
класс о том, с чемlistener
ему нужно поговорить, и если он там, то действие готово к получению.Пройдя через
Application
урок, вы увидите, что происходит гораздо больше, чем это.источник
Связывание - это еще один способ общения
Реализуйте интерфейс в Activity
Обеспечить реализацию метода
Привязать активность к сервису
Зарегистрируйтесь и отмените обратный вызов, когда Служба будет связана и не связана с Активностью.
Инициализировать обратный вызов
При необходимости вызывайте метод обратного вызова.
источник
serviceConnection
внеonCreate
. Пожалуйста, отредактируйте его.Как упомянул Мадхур, вы можете использовать автобус для общения.
В случае использования шины у вас есть несколько вариантов:
Библиотека шины событий Otto (устарела в пользу RxJava)
http://square.github.io/otto/
Зеленый робот EventBus
http://greenrobot.org/eventbus/
NYBus (RxBus, реализованный с использованием RxJava. Очень похож на EventBus)
https://github.com/MindorksOpenSource/NYBus
источник
Помимо LocalBroadcastManager, Event Bus и Messenger уже ответили на этот вопрос, мы можем использовать Pending Intent для связи с сервисом.
Как уже упоминалось здесь, в моем блоге
источник