2011-10-05 116 views
12

我正在开发一个应用程序,它通过XMPP接收推送通知(我知道C2DM,但它有一些限制,因此我无法使用),问题是连接,一段时间后垃圾收集,我不能发送推送通知到Android设备。在Android上保持XMPP连接(使用asmack)alive

我想我需要实现一个Android服务,但我不知道如何实现一个服务,将保持连接活着。 有人可以帮助我吗?

回答

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进行通信。

请注意,我们achive与GTalkSMS一个相当稳定的连接,但它从来没有像股票的GTalk服务/客户端那么好。其中一个原因是,默认的保持活动状态检查计时器为5分钟,这对于想要尽可能节省电量的移动设备来说通常是一种方法。所以我必须将其设置为更高的值,这有一些缺点。当涉及到这个问题时,您将始终在快速,响应和稳定连接与电池寿命之间进行权衡。

+1

我在方法onCreate()中创建了一个服务,我使用ServiceHandler,Looper和Handler Thread写了你的消息,现在我的连接继续存在,并且我的服务仍在运行。再次感谢。 – danilodeveloper

+0

你会分享你的代码@danilodeveloper我正面临着这样的问题。我没有在后台收到msg(如果我在另一个不在聊天活动中的活动),请分享您的xmpp连接类。 –

+0

嗨@DevendraSingh,不幸的是我在5年前问过,我没有这个代码了。对于那个很抱歉 :( – danilodeveloper