在安卓上使用asmack保持XMPP连接的活跃状态

12

我正在开发一款应用程序,通过XMPP接收推送通知(我知道C2DM,但由于一些限制我不能使用它),问题是连接在一段时间后被垃圾回收了,我无法向Android设备发送推送通知。

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

1个回答

20
我不确定“垃圾回收”是否是正确的术语。更可能的是,您的活动被Android关闭,因为您在Activity中创建了连接。
但是您是正确的,为了保持稳定的连接,您需要将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方法,而Beem使用Binder与XmppConnection进行通信。
请注意,我们通过GTalkSMS实现了一个相当稳定的连接,但它从来没有像原始的GTalk服务/客户端那样好。其中一个原因是smacks默认的保持活动检查计时器为5分钟,对于想要尽可能节省电池的移动设备来说太频繁了。因此,我不得不将其设置为更高的值,这带来了一些缺点。当涉及到这一点时,您总是需要在快速、响应和稳定的连接与电池寿命之间进行权衡。

1
我创建了一个服务,在onCreate()方法中,我按照您的建议使用了ServiceHandler、Looper和Handler Thread,现在我的连接保持稳定,我的服务仍在运行。再次感谢。 - danilodeveloper
你能分享你的代码吗,@danilodeveloper?我遇到了这样的问题。当我不在聊天界面时(例如在其他活动界面),我无法接收消息。请分享你的XMPP连接类。 - Devendra Singh
嗨@DevendraSingh,不幸的是我5年前就问过这个问题了,我现在没有那段代码了。非常抱歉:( - danilodeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接