繁体   English   中英

Android / Smack:在睡眠模式下保持XMPP连接处于活动状态

[英]Android/Smack: Keep XMPP connection alive in sleep mode

我有一个Android应用程序,它有一个聊天客户端作为其功能之一。 聊天客户端使用基于Android的Smack库的XMPP,并在后台运行Openfire作为XMPP服务器。 使用BOSH建立连接整个XMPP连接处理实现为一种服务,即使应用程序的活动不在前台,也可以在后台运行和监听传入消息。 到目前为止,一切都很好。

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

当然,我在网上搜索过Stackoverflow,但我无法得到明确的答案。 用例通常似乎是必须定期执行任务,例如每小时一次。 但是,如果是聊天客户端,这似乎并不强烈。 因为我认为这是一个常见的用例 - 毕竟,有很多聊天应用程序或带有聊天功能的应用程序 - 这些是我的问题:

  • 如何在手机休眠时更改/扩展我可以收到聊天消息的应用程序?

  • 我偶然发现了WakeLock 这是要走的路还是这些不适合我的用例?

  • 从Lollipop开始,还有JobScheduler API本身使用WakeLock 好点?

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

另请注意:我使用模拟器进行调试时出现睡眠模式问题。 当我在模拟器中关闭“保持唤醒”时,屏幕在1+分钟后变黑并且XMPP连接中断。 但我不知道如何在模拟器变黑后重新唤醒/切换模拟器。 Android Studio实际上告诉我,设备或其他东西已经消失,我必须重新启动模拟器。

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

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

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

如果未经过身份验证,则会重新建立连接。 这样,大多数聊天应用程序都会管理此超时异常。

希望这可以帮助 :)

您不需要推送通知,您不需要WakeLock 相反

  • 从打盹模式将您的应用列入白名单
  • 使用粘性( START_STICKY )后台服务
  • 使用Smack的ServerPingWithAlarmManager
  • 对Android发送的CONNECTIVY_CHANGED意图采取行动,并在这种情况下使用XMPPTCPConnectioninstantShutdown()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM