如何有效地使用android的持久XMPP

har*_*ash 5 java android xmpp push-notification

我想开发一个即时消息应用程序.GCM,用于推送数据是一种流行的(和有效的)方式,如果你在Android上,但由于以下原因我没有使用它:

  1. 它删除了超过100个未传递的消息.
  2. 它不适用于没有谷歌应用程序的设备.

相反,我决定建立一个传统的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();
Run Code Online (Sandbox Code Playgroud)

请注意此代码段的最后一部分.我必须运行一个无限循环,以便我可以继续监听传入的数据包(如果我不包含此代码,我无法拦截任何传入的数据包).

我的问题是:

  1. 这种方法会占用大量电池吗?
  2. 这种方法会阻止设备睡觉吗?
  3. 有没有更好的方法来完成任务(不使用GCM)?
  4. 有没有办法将GCM与OPENFIRE集成?

Dev*_*Dev 5

我们过去有同样的要求,我们在我们的应用程序中提供了外部聊天功能,我们使用了XMPP [使用aSmack],

很清楚你已经弄清楚你需要使用外部服务才能与服务器建立持久性xmpp连接,但要确保服务应该是后台服务并使其成为粘性服务.

使用GCM或XMPP实际上取决于您设计系统的方式,您可以在应用程序中使用它们,以使其更稳定并导致更复杂!

制作如此复杂的系统仍然是一个很长的过程,你可以随时使用XMPP提供的简单解决方案.

这种方法会占用大量电池吗? 它不应该!因为你在这里使用默认的ping间隔(实际上是30分钟),它不应该消耗更多的电池.如果你使用ping间隔不到5分钟那么你应该担心电池排水问题!

这种方法会阻止设备睡觉吗? 根据我的理解,你在这里使用TCP连接,除非输入流设备上没有数据可以进入休眠状态,一旦一些数据到达设备将被唤醒,或者你在同一个套接字上发送一些数据[如心跳/ ping]以保持CPU清醒.但是这种行为仍然可以根据不同的移动设备制造而变化.

有没有更好的方法来完成任务(不使用GCM)? 只要你知道你真正想要的是什么,XMPP总是gcm的强大替代品.你可以随时尝试优化你的系统以获得电池输出.

有没有办法将GCM与OPENFIRE集成? 我在这里很困惑你真的想问这里!!! gcm(CCS)是XMPP服务器的google实现,你可以随时使用smack创建一个XMPP客户端,但是将GCM与Openfire集成意味着你正在寻找服务器到服务器的通信,这超出了你的应用要求范围,根据我的理解! !

以下是一些有用的链接,可以帮助您进行研究

使用aSmack的应用程序是否应使用前台服务?

如何在Android上保持XMPP连接稳定(a)smack?

如何在Android中创建服务与XMPP服务器保持持久的Xmpp连接?

在Android上保持XMPP连接(使用asmack)