如何在android服务中处理保持活动连接

时间:2012-08-15 17:11:16

标签: android android-intent xmpp smack asmack

我正在使用asmack作为Android IM应用程序,我正在使用带有AIDL接口的远程服务。

在我的服务的onStartCommand方法内部,我编写如下代码。我创建连接,然后使用它登录。当任何人在我的应用程序的主要活动的onCreate方法中运行我的应用程序时,运行我的服务getApplicationContext.StartService(serviceIntent)。它工作正常,但在服务内部附加的几分钟(有时10分钟,超过10分钟)messageListener停止接收消息。但我知道连接存在,因为同时我使用xmppConnection发送消息,它正在向用户B发送消息,但它没有收听来自用户B的消息。我不知道为什么我的听众会停止听到消息。

public int onStartCommand(final Intent intent, final int flags, final int startId) {
    ConnectionConfiguration config = new ConnectionConfiguration(URL, MyPort, Host);
    xmppConnection = new XMPPConnection(config);
    xmppConnection.connect();
    xmppConnection.login("someid@sample.com", "testpass");
    xmppConnection.addPacketListener(myMessageListener, new PacketTypeFilter(Message.class));
    return START_STICKY;
}
private PacketListener myMessageListener = new PacketListener() {
    public void processPacket(Packet packet) {
        Message msg = (Message) packet;
    }
}

请指导。

1 个答案:

答案 0 :(得分:4)

如果没有您注意到,您的连接是否因错误而关闭? 您应该为每个回调添加连接侦听器和日志以调试连接状态。

在Android上可以有一个“僵尸”套接字:你仍然可以写信给它,但收件人永远不会收到这些信息,当然你也无法从中收到新的信息。 它可能在网络状态发生变化后发生。

检测我使用XMPP Ping,从客户端发出警报(每15分钟不重复一次)。我禁用白色空间保持活力。 这会破坏客户端和服务器(NAT或代理服务器)之间可能存在的大多数超时机制。 另外,如果您没有收到ping的任何答案(例如20秒内),您可以假设连接处于错误状态并手动重新连接。