Как эффективно использовать постоянный XMPP с Android

Я хочу разработать приложение для обмена мгновенными сообщениями. GCM, для толкания данных является популярным (и эффективным) способом, если вы находитесь на android, но я не использую его по следующим причинам:

  1. Он удаляет более 100 неподтвержденных сообщений.
  2. Он не будет работать на устройствах, у которых нет приложений Google.

Вместо этого я решил настроить традиционный сервер XMPP (openFire), и я использую smack api (TCP-соединение) для подключения. Пока все идет хорошо, но у меня есть несколько проблем.

Это небольшой тестовый код, который я написал (он работает в службе):

Log.d("TAG","service has started"); SmackConfiguration.setDefaultPacketReplyTimeout(10000); XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder() .setUsernameAndPassword("admin", "football100") .setServiceName("harsh-pc") .setHost("192.168.0.200") .setPort(5222).setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) .build(); final AbstractXMPPConnection conn2 = new XMPPTCPConnection(config); try { conn2.connect(); conn2.login(); Presence presence = new Presence(Presence.Type.available); presence.setStatus("online"); // Send the packet (assume we have an XMPPConnection instance called "con"). conn2.sendStanza(presence); } catch (SmackException | IOException | XMPPException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.d("TAG", e.toString()); } StanzaFilter filter=new StanzaFilter() { @Override public boolean accept(Stanza stanza) { return true; } }; StanzaListener listener= new StanzaListener() { @Override public void processPacket(Stanza packet) throws SmackException.NotConnectedException { Log.d("TAG","recevied stuff"); ChatManager chatmanager = ChatManager.getInstanceFor(conn2); Chat newChat = chatmanager.createChat("harsh@harsh-pc"); newChat.sendMessage("Reply :) "); } }; conn2.addAsyncStanzaListener(listener,filter); ChatManager chatmanager = ChatManager.getInstanceFor(conn2); Chat newChat = chatmanager.createChat("harsh@harsh-pc"); try { Random r=new Random(); // newChat.sendMessage(Integer.toString(r.nextInt())); Thread.sleep(1500); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); Log.d("TAG",e.toString()); } } }).start(); final Thread sleeper=new Thread(new Runnable() { @Override public void run() { for(;;){ try { Thread.sleep(100000); Log.d("TAG","SLEEPI"); } catch (InterruptedException e) { e.printStackTrace(); } } } });sleeper.start(); 

Обратите внимание на последнюю часть этого фрагмента. Мне нужно запустить бесконечный цикл, чтобы я мог продолжать слушать входящие пакеты (если я не включаю этот код, я не могу перехватить входящие пакеты).

Мои вопросы:

  1. Этот метод будет принимать огромное количество батареи?
  2. Будет ли этот метод мешать устройству спать?
  3. Есть ли лучший способ добиться успеха (без использования GCM)?
  4. Есть ли способ интегрировать GCM с OPENFIRE?

У нас было такое же требование в прошлом, когда мы предоставили внешнюю функциональность чата с нашим приложением, для которого мы использовали XMPP [using aSmack],

Хорошо известно, что вы выяснили, что вам нужно использовать внешнюю службу, чтобы обеспечить постоянное соединение xmpp с сервером, но убедитесь, что служба должна быть фоновой службой и сделать ее липким сервисом.

Либо использовать GCM или XMPP на самом деле зависит от того, как вы разрабатываете свою систему, вы можете использовать оба из них в своем приложении, чтобы сделать его более стабильным и более сложным. !!!!!

Тем не менее его длинный снимок для создания такой сложной системы вы всегда можете использовать с простым решением, доступным XMPP.

Этот метод будет принимать огромное количество батареи? Это не должно !!! Поскольку вы используете интервал ping по умолчанию здесь (который на самом деле составляет 30 минут), он не должен потреблять больше батареи. Если вы использовали интервал ping менее 5 минут, тогда вам следует беспокоиться о проблеме дренажа батареи!

Будет ли этот метод мешать устройству спать? По моему пониманию, вы используете TCP-соединение здесь, если нет данных о устройстве ввода-потока, которое может войти в спящий режим, как только некоторые данные поступят, устройство начнет просыпаться и вы отправите некоторые данные в один и тот же сокет [например, сердцебиение / Ping], чтобы процессор не просыпался. Но все же это поведение может меняться в зависимости от мобильного производства.

Есть ли лучший способ добиться успеха (без использования GCM)? XMPP всегда является сильной альтернативой gcm, если вы знаете, что вы действительно ищете. Вы всегда можете попытаться оптимизировать свою систему для выхода теста.

Есть ли способ интегрировать GCM с OPENFIRE? Я смущен здесь, что вы действительно хотите задать здесь !!! Gcm (CCS) – это реализация Google XMPP-сервера, вы всегда можете создать клиент XMPP, используя smack, но для интеграции GCM с Openfire означает, что вы просматриваете связь между сервером и сервером, что выходит за рамки ваших требований приложения в соответствии с моим пониманием !! !!

Ниже приведены некоторые полезные ссылки, которые могут помочь вам в ваших исследованиях

Должны ли приложения, использующие aSmack, использовать foreground Services?

Как сохранить стабильное соединение XMPP на Android с (a) привкус?

Как создать службу на Android Что делает Persistent XMPp-подключение с XMPP-сервером?

Храните соединение XMPP (используя asmack) в режиме реального времени на Android