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

aft*_*tab 6 android xmpp smack android-intent asmack

我正在使用asmack作为一个Android IM应用程序,我正在使用AIDL接口的远程服务.

onStartCommand我的服务方法内部,我编写如下代码.我创建连接,然后使用它登录.当任何人在我的应用程序onCreate的主要活动方法中运行我的应用程序运行我的服务getApplicationContext.StartService(serviceIntent).它工作正常,但是messageListener我在服务内部附加的几分钟(有时10分钟,一些时间超过10分钟)停止接收消息.但我知道连接存在,因为同时我用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

请指导.

Gui*_*rot 4

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

在 Android 上,可能有一个“僵尸”套接字:您仍然可以向它写入数据,但接收者永远不会收到消息,当然您也无法从中读取新消息。网络状态更改后可能会发生这种情况。

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