android - 如何处理android服务中的保持连接

标签 android android-intent xmpp smack asmack

我将 asmack 用于 android IM 应用程序,我在其中使用带有 AIDL 接口(interface)的远程服务。

在我的服务的 onStartCommand 方法中,我编写了如下代码。我创建连接,然后使用它登录。当任何人在我的应用程序的主要 Activity 的 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;
    }
}

请指导。

最佳答案

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

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

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

关于android - 如何处理android服务中的保持连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11973850/

相关文章:

android - 获取另一个 Activity 的值(value)放在另一个 Activity 的 ListView 的编辑文本中

java - 用于基于 LAN 的多用户游戏的 XMPP

xmpp - 如何使用 XMPP 协议(protocol)正确连接 strope.js 客户端与 Prosody 服务器

Android Firebase 后台通知未触发

java - 如何在 ADT 上设置 HoloEverywhere?

java - 在android中转换日期格式?

java - EC2 上 Openfire 服务器的不可靠行为

android - 如何导入 android.support.v7.* (appcompat) 到 AIDE

java - 如何在不覆盖的情况下将所有映射从 Bundle 传输到另一个 bundle?

android - SplashScreen - 关闭时间