Активность пробуждения службы Android Paho MQTT

Я пытаюсь использовать библиотеку Paho Android MQTT (загружена отсюда). Образец сервисного приложения работает нормально, методы subscribe и publish также работают нормально, когда образец приложения запущен. Когда я закрываю его, устройство больше не получает уведомления о сообщениях.

Есть ли у кого-нибудь опыт, как правильно изменить/внедрить службу, чтобы получать сообщения, даже если приложение не запущено?


person wyzard    schedule 25.01.2015    source источник
comment
Вам когда-нибудь удавалось решить вашу проблему? Я сталкиваюсь с аналогичной проблемой, пытаясь сохранить работу службы даже после закрытия приложения.   -  person Coova    schedule 16.02.2015
comment
Еще нет. К сожалению, сейчас я слишком занят (на работе), чтобы заниматься этим хобби-проектом, но я отправлю вам свое решение, если смогу заставить его работать.   -  person wyzard    schedule 17.02.2015
comment
Я добился некоторого прогресса. Я реализовал службу (START_STICKY), которая содержит методы объекта MqttClient (и методы setCallback, connect, subscribe и т. д.). Таким образом я добился того, что мое приложение получает уведомления обратного вызова, даже если моя активность не запущена. Сейчас моя проблема: на устройствах Xiaomi я не могу реализовать функцию «запуск службы при загрузке», потому что в MIUI есть встроенный компонент безопасности, который это запрещает, но это уже другая проблема.   -  person wyzard    schedule 25.07.2015


Ответы (5)


Вы должны внедрить фоновую службу, см.: http://developer.android.com/training/run-background-service/index.html

Или, в зависимости от варианта использования, вы можете реализовать push-уведомления на стороне сервера и получать их, когда клиент не подписан на брокера MQTT.

person Teixi    schedule 03.02.2015
comment
Спасибо, я попробую это. - person wyzard; 05.02.2015
comment
См. пример службы Android MQTT Paho здесь: git.eclipse.org/c/paho/org.eclipse.paho.mqtt.java.git/tree/ - person Teixi; 06.07.2015

Насколько я понимаю тема Пахо приносит все что нужно. В моем приложении служба paho mqtt никогда не останавливается, пока я этого не захочу. Я зарегистрировал Paho-сервис в манифесте к Android следующим фрагментом.

‹!-- Mqtt Service --›
‹service android:name="com.ibm.android.service.MqttService" /›

Это должно сработать.

Дополнительные сведения см. в описании http://www.eclipse.org/paho/files/android-javadoc/index.html

person kdoteu    schedule 08.07.2015
comment
Если вы понизите ответы, пожалуйста, скажите, почему. Особенно когда ты минусуешь все мои ответы. Я здесь, чтобы учиться, поэтому, когда есть что-то, что я могу сделать лучше, скажи мне! - person kdoteu; 08.07.2015
comment
Спасибо. У меня снова появилось свободное время, поэтому я скоро продолжу этот проект. :) - person wyzard; 14.07.2015
comment
С чего вы начали службу? Если служба запускается из действия, то служба должна быть уничтожена вместе с действием. Однако вы можете повторно подключиться, но, как говорилось в других сообщениях, это не гарантирует соединение или обратные вызовы. - person Clocker; 26.07.2015
comment
Служба должна запускаться из ОС Android с точки зрения @Kane. Так что это не зависит от деятельности. - person kdoteu; 26.07.2015
comment
Не могли бы вы предоставить образец для нас, пожалуйста? Если я правильно понимаю: есть MqttService, который подключается к брокеру и подписывается на указанные темы, публикует сообщения и т.д..., и должен быть другой собственный сервис, который позволяет моему приложению получать сообщения даже в фоновом режиме если моя активность уничтожила ? Если я прав, из чего должен состоять мой фоновый сервис? - person wyzard; 26.07.2015

Служба Mqtt в некотором роде является библиотекой, а не общей службой. Он просто подключается к данному брокеру и подписывается на указанные темы вашим приложением. Биржевой MqttAndroidService вообще не знает ни брокера, ни темы после запуска ОС Android.

Таким образом, правильным подходом является наличие серверной службы для вашего приложения, которая знает подробности о брокере и темах. А ваш сервис отвечает за своевременное [пере]подключение брокера Mqtt и подписку на темы.

person Kane    schedule 13.04.2015
comment
Возможно, вы правы, но странно, что на официальном сайте paho заявлено, что сервис долго работает для обработки отправки и получения сообщений от имени клиентских приложений Android, когда основное действие приложений может быть не запущено - person user2814778; 03.05.2015

Android-библиотека Paho работает нормально. Просто сложно поддерживать состояние подключения, когда приложение переходит в фоновый режим. Чтобы обеспечить любые другие функции, такие как сохранение параметров подключения, темы для публикации/подписки в фоновом состоянии необходимо будет переписать на уровне библиотеки.

Мои наблюдения: -

  1. Как только соединение установлено, MqttService поддерживает соединение, даже если приложение работает в фоновом режиме. Если системный диспетчер служб не убьет приложение и его службы. Все это возможно, если сеть остается бесперебойной.

  2. У службы есть собственный диспетчер тревог, чтобы поддерживать себя в рабочем состоянии.

Я провел эксперимент и сделал небольшое решение, которое может помочь сохранить доступ к объекту подключения во время работы приложения. Если только вы не отключитесь.

PS: - Решение чертовски простое. Но это просто работает как шарм.

https://github.com/ameykshirsagar/mqttconnectionpersistence

Мне еще предстоит реализовать реализацию, которая поддерживает работу MqttService даже после уничтожения активности приложения.

person Amey Kshirsagar    schedule 21.07.2016

Если под «закрыть» вы подразумеваете «принудительно остановить» приложение, то да, это полностью останавливает приложение, и вы не будете получать сообщения (но, вероятно, в любом случае это то, что хотел пользователь).

Однако, если под «закрытием» вы подразумеваете, что пользователь/андроид убивает приложение, то вы не получаете уведомления, потому что вы больше не «подключены» к брокеру.

Решением будет создание пользовательского Service для управления подключениями.

Ознакомьтесь с моим ответом здесь для подробное решение того, что сработало для меня.

person Pravin Sonawane    schedule 09.12.2016