Поддерживайте XMPP-соединение (с использованием asmack) на Android

#android #xmpp #push #smack #keep-alive

#Android #xmpp #толкать #чмок #поддерживайте-alive

Вопрос:

Я разрабатываю приложение, которое получает push-уведомления через XMPP (я знаю C2DM, но у него есть некоторые ограничения, и я не могу использовать его из-за этого), проблема заключается в том, что через некоторое время происходит сбор мусора, и я не могу отправить push-уведомление на устройство Android.

Я думаю, что мне нужно внедрить службу Android, но я понятия не имею, как реализовать службу, которая поддерживала бы соединение. Кто-нибудь может мне помочь?

Ответ №1:

Я не уверен, что «сбор мусора» является правильным термином здесь. Более вероятно, что ваша активность просто закрывается Android, потому что вы создаете соединение в Activity.

Но вы правы, чтобы поддерживать стабильное соединение, вам нужно поместить XMPP-соединение в службу. Но убедитесь, что соединение находится в дополнительном потоке, потому что служба сама по себе не является дополнительным процессом или потоком. Это можно сделать, например, с помощью обработчика.

 HandlerThread thread = new HandlerThread(SERVICE_THREAD_NAME);
thread.start();
handlerThreadId = thread.getId();
serviceLooper = thread.getLooper();
serviceHandler = new ServiceHandler(serviceLooper);
  

Затем вы можете взаимодействовать со служебным потоком с помощью сообщений / намерений. Другой альтернативой может быть интерфейс Binder.

Вы также можете посмотреть, как это делают другие: Beem и GTalkSMS — это проекты с открытым исходным кодом, которые реализуют XMPP-соединение с сервисом Android. GTalkSMS использует подход IntentService, тогда как Beem использует связующее для связи с XMPPConnection.

Обратите внимание, что мы достигаем довольно стабильного соединения с GTalkSMS, но оно никогда не бывает таким хорошим, как стандартный сервис / клиент GTalk. Одна из причин заключается в том, что таймер проверки работоспособности smacks по умолчанию составляет 5 минут, что часто бывает для мобильного устройства, когда вы хотите сэкономить как можно больше заряда батареи. Поэтому мне пришлось установить для него более высокое значение, что имеет некоторые недостатки. У вас всегда будет компромисс между быстрым, отзывчивым и стабильным подключением и временем автономной работы, когда дело доходит до этого.

Комментарии:

1. Я создал службу, для которой в методе onCreate() я написал ваше предложение с помощью ServiceHandler, Looper и Handler Thread, и теперь мое соединение сохраняется, и моя служба все еще работает. Еще раз спасибо.

2. не могли бы вы поделиться своим кодом @danilodeveloper Я столкнулся с такой проблемой. я не получил сообщение в фоновом режиме. (например, если я участвую в другом действии, а не в чате.) пожалуйста, поделитесь своим классом подключения xmpp.

3. Привет @DevendraSingh, к сожалению, я спросил об этом 5 лет назад, у меня больше нет кода. Извините за это: (