如何有效地使用持久性XMPP与android

时间:2015-05-15 16:30:42

标签: java android push-notification xmpp

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

  1. 删除超过100封未传递的邮件。
  2. 它不适用于没有谷歌应用程序的设备。
  3. 相反,我决定建立一个传统的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集成?

1 个答案:

答案 0 :(得分:5)

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

众所周知,您已经发现需要使用外部服务才能与服务器建立持久性xmpp连接,但请确保服务应该是后台服务并使其成为粘性服务。

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

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

  

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

     

此方法会阻止设备休眠吗?   根据我的理解,你在这里使用TCP连接,除非输入流设备上没有数据可以进入睡眠状态   一些数据到达设备将被唤醒,或者您发送一些数据   socket [如heartbeat / ping]让cpu保持清醒。但仍然如此   行为可能因不同的移动制造商而异。

     

有没有更好的方法来完成任务(不使用GCM)?   只要您知道什么,XMPP始终是gcm的强大替代品   你真的在寻找。你可以随时尝试优化你的系统   对于击球手输出。

     

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

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

Should applications using aSmack use foreground Services?

How to keep a XMPP connection stable on Android with (a)smack?

How To Create Service In Android Which Makes Persist Xmpp Connection With XMPP Server?

Keep XMPP connection (using asmack) alive on Android