2017-01-24 60 views
5

我有一个Android应用程序,它具有聊天客户端作为其功能之一。聊天客户端使用基于Android的Smack库的XMPP,并在后台运行Openfire作为XMPP服务器。使用BOSH建立连接整个XMPP连接处理是作为服务实现的,即使应用程序的活动不在前台,也可以在后台运行并侦听传入消息。到目前为止,一切都很好。Android/Smack:让XMPP连接在睡眠模式下保持活动状态

唯一的问题似乎是睡眠模式。在模拟器中(当设置为“保持唤醒”状态)或使用电话时,XMPP连接处于暂停状态,应用程序可以发送和接收消息。但是,一旦手机进入睡眠模式,XMPP连接将中断 - 我可以在Openfire服务器的管理控制台中看到用户处于脱机状态。直观地说,我想一直接收消息,例如WhatsApp。

当然,我在网上搜索包括Stackoverflow,但我无法得到明确的答案。通常情况下,用例似乎是必须定期执行一项任务,例如每小时执行一次。但是,在聊天客户端的情况下,这似乎并不起作用。因为我认为这是一个常见的情况 - 毕竟,有没有那么多的聊天应用或使用聊天功能在那里 - 这是我的问题:

  • 我如何必须改变/延长应用程序,我可以在手机正在睡觉时收到聊天消息?我发现了WakeLock。这是要走的路还是这些不适合我的使用情况?

  • 由于棒棒糖,还有JobScheduler API本身使用WakeLock。好点?

  • 例如,WhatsApp如何处理这种情况?

在旁注:我有使用模拟器调试睡眠模式的问题。当我在模拟器中关闭“保持唤醒”状态时,屏幕在1分钟后变黑并且XMPP连接断开。但我不知道如何唤醒/切换模拟器,一旦它变黑。 Android Studio实际上告诉我某些时候设备或其他东西已经消失,我必须重新启动模拟器。

回答

2

解决此问题的确切方法是使用推送通知。

XMPP连接的自然行为是在指定的空闲间隔后断开连接,即设备进入休眠状态。

即将到来的WhatsApp的情况下,它也使用相同的XMPP并维护一个服务器,充当交换消息的包装类。该服务器检查消息状态是否已交付。 如果未收到邮件,它会在收到邮件时发送推送通知,现在位于推送服务的设备端,它会检查连接是否处于活动状态并进行身份验证。

如果未通过身份验证,它将重新建立连接。通过这种方式,大多数聊天应用程序管理此超时异常。

希望这有助于:)

+0

您不需要推送通知,也不是“XMPP连接在指定空闲间隔后断开连接的自然行为”。 – Flow

2

你不需要推送通知,你不需要WakeLock秒。而不是简单地

  • 白名单您的应用程序从打盹模式
  • 使用粘性(START_STICKY)后台服务
  • 使用啪的ServerPingWithAlarmManager
  • CONNECTIVY_CHANGED意图法案由Android发送,并使用XMPPTCPConnection“中,且s instantShutdown()案件。
+0

它是如何影响电池寿命的。如果我理解正确,将来自打盹模式的应用列入白名单需要手机用户确定。 – Christian

+0

对电池寿命的影响取决于有多少XMPP节点通过电线。因此你应该避免不必要的流量。 – Flow

+0

@流逝最后一个话题的目标是什么?谢谢 – joao2fast4u

相关问题