我正在使用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;
}
}
请指导。
答案 0 :(得分:4)
如果没有您注意到,您的连接是否因错误而关闭? 您应该为每个回调添加连接侦听器和日志以调试连接状态。
在Android上可以有一个“僵尸”套接字:你仍然可以写信给它,但收件人永远不会收到这些信息,当然你也无法从中收到新的信息。 它可能在网络状态发生变化后发生。
检测我使用XMPP Ping,从客户端发出警报(每15分钟不重复一次)。我禁用白色空间保持活力。 这会破坏客户端和服务器(NAT或代理服务器)之间可能存在的大多数超时机制。 另外,如果您没有收到ping的任何答案(例如20秒内),您可以假设连接处于错误状态并手动重新连接。