在Android上保持XMPP连接(使用asmack)

时间:2011-10-05 13:20:33

标签: android xmpp push smack keep-alive

我正在开发一个通过XMPP接收推送通知的应用程序(我知道C2DM,但它有一些限制,我不能因为它而使用),问题是连接一段时间后被垃圾收集而且我无法向Android设备发送推送通知。

我认为我需要实现一个Android服务,但我不知道如何实现一个可以保持连接活动的服务。 有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:20)

我不确定“垃圾收集”是否是正确的术语。您的活动更有可能被Android关闭,因为您在活动中创建了连接。

但你是对的,为了保持稳定的连接,你需要将XMPP连接放入Service。但要确保连接在一个额外的线程中,因为服务本身不是一个额外的进程或线程。这可以通过例如Handler来完成。

HandlerThread thread = new HandlerThread(SERVICE_THREAD_NAME);
thread.start();
handlerThreadId = thread.getId();
serviceLooper = thread.getLooper();
serviceHandler = new ServiceHandler(serviceLooper);

然后,您可以通过消息/意图与服务线程进行通信。另一种选择是Binder接口。

您还可以查看其他人如何执行此操作:BeemGTalkSMS都是实现与Android服务的XMPP连接的开源项目。 GTalkSMS使用IntentService approach,而Beem使用Binder与XmppConnection进行通信。

请注意,我们与GTalkSMS建立了非常稳定的连接,但它从未像股票GTalk服务/客户那样好。一个原因是smacks默认保持活动检查计时器是5分钟,这是移动设备的常用方式,当您想要尽可能多地节省电池时。所以我不得不将它设置为更高的值,这带来了一些缺点。在这方面,您将始终在快速,响应和稳定的连接与电池寿命之间进行权衡。