Chcę opracować aplikację do obsługi wiadomości błyskawicznych. GCM, za popychanie danych jest popularnym (i wydajne) do zrobienia, jeśli jesteś na Android, ale nie używam go z powodu następujących powodów:Jak skutecznie korzystać z trwałego XMPP z Androidem
- To usuwa ponad 100 niedostarczonych wiadomości.
- Nie będzie działać na urządzeniach, które nie mają aplikacji Google.
Zamiast tego zdecydowałem się na skonfigurowanie tradycyjnego serwera XMPP (openFire), a do połączenia używam interfejsu API Smack (połączenie TCP). Do tej pory wszystko idzie dobrze, ale mam kilka obaw.
Jest to mały kod testowy pisałem (działa w służbie):
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("[email protected]");
newChat.sendMessage("Reply :) ");
}
};
conn2.addAsyncStanzaListener(listener,filter);
ChatManager chatmanager = ChatManager.getInstanceFor(conn2);
Chat newChat = chatmanager.createChat("[email protected]");
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();
Wskazówka ostatnia część tego fragmentu. Muszę uruchomić nieskończoną pętlę, aby móc dalej nasłuchiwać przychodzących pakietów (jeśli nie dołączę tego kodu, nie jestem w stanie przechwycić żadnych przychodzących pakietów).
Moje pytania są następujące:
- Czy metoda ta zajmie ogromne ilości baterii?
- Czy ta metoda zapobiegnie spaniu urządzenia?
- Czy istnieje lepszy sposób na załatwianie spraw (bez korzystania z GCM)?
- Czy istnieje sposób na integrację GCM z OPENFIRE?
kiedy mówię 'integracji' z Openfire Miałem na myśli to : , jeśli aplikacja nie jest otwarta, a pojawi się wiadomość, openfire wyśle wiadomość przez GCM. Jeśli aplikacja zostanie uruchomiona, to połączenie z gniazdem zostanie nawiązane i będzie rozmawiał bezpośrednio z serwerem xmpp. –
Myślę, że szukasz niestandardowej wtyczki serwletu w Openfire, odnieś ten link 1. https: // community. igniterealtime.org/thread/50919 2. https://community.igniterealtime.org/thread/47895 – Dev
uwaga tutaj nigdy nie korzystałem z takiej wtyczki instate Użyłem funkcji Offline Messages XMPP http: // xmpp .org/extensions/xep-0160.html, Korzystając z tej funkcji, jeśli openfire wykryje, że odbierający jest zalogowany, przechowuje wiadomości i dostarcza wszystkie wiadomości w trybie offline, gdy tylko użytkownik odbierze połączenie internetowe i wyśle wiadomość [online/available]. – Dev