Android上持久移动连接的最佳实践?

Posted

技术标签:

【中文标题】Android上持久移动连接的最佳实践?【英文标题】:Best practice for persistent mobile connections on Android? 【发布时间】:2012-06-21 16:18:50 【问题描述】:

我正在考虑使用从 android 应用到“云服务”的持久连接。这将一直在后台服务(或类似的服务)中运行。

我正在考虑使用网络套接字或 XMPP 来保持连接,基本上是在寻找不会耗尽电池的轻量级连接。我希望能够向此连接实时推送通知,因此不需要定期轮询。 我知道 C2DM 和其他商业解决方案,但我希望自己推出。这就是为什么我正在研究网络套接字(或其他轻量级连接)的原因。所以如果我走这条路,我应该注意哪些最佳实践?

我在想这样的事情:

    如何防止电池耗尽, 如何处理IP地址变更等?

【问题讨论】:

值得一读的 Android 文档:developer.android.com/training/efficient-downloads/index.html 您需要将其拆分为单独的 Android 和 ios 问题 - 两者完全不同(在 iOS 上您不能简单地拥有后台服务)。 @MartinH 问题已更新为仅与 Android 有关。 【参考方案1】:

这可能不是您正在寻找的答案,但我认为您可能需要重新考虑您的架构。

您对移动平台的期待

您的 IP 地址随机更改 您的物理互联网连接将随机丢失 操作系统决定你没有做任何有用的事情并杀死你的进程 连接类型随机变化(从 WIFI 到 4G 到 3G 到边缘),因此您的 IP 会发生变化

基本上,您的应用需要能够处理连接丢失,因为它几乎肯定会发生。

话虽如此,这完全取决于您对实时的定义。如果您愿意不断检查是否仍有可行的连接,则可以将任何延迟控制在分钟范围内。但这会耗尽电池电量,您无能为力。

【讨论】:

重新思考架构并不是一个糟糕的答案 :-) 这是发布问题的重点,只是试图与其他人一起审查这个想法。如果这只是一个坏主意,那就是很好的反馈。谢谢。但是,无论如何,我仍然对最佳实践感兴趣。 C2DM 做到了,所以问题是:他们是如何做到的,他们的最佳实践是什么?上述 cmets 是需要注意的有用事项。【参考方案2】:

有些事情并不顺利。即“实时推送通知”“防止电池耗尽”。你肯定要在这里做出妥协。

我只能建议尝试一些使用 XMPP 的 Android 应用,以了解它们如何处理持久连接、IP 地址更改和电池消耗。如果它们是开源的,您还可以查看代码并从中学习。 Yaxim、Project MAXS 和 Beem 等等。也许你也应该看看XEP-0286: XMPP on Mobile Devices

也就是说,当 Google 为您提供 C2DM 时,您确定要重新发明***吗?针对此用例进行了优化。我认为它有一些延迟,所以它不是“实时”的。但同样,您最终会得到一个解决方案,积极尝试建立持久连接并耗尽电池,或者您将不得不忍受某种延迟(约 0-30 分钟)。

【讨论】:

关于移动设备上 XMPP 的精彩链接。该文档中概述了一些好的设计模式。诸如压缩之类的事情,如果您必须发送,则发送您拥有的所有内容,因为无论如何功率级别都会提高,等等。 我正在寻找替代 Google C2DM 的唯一原因是因为 C2DM 要求用户在设备上拥有 Google 帐户。我正在设计一个将产品化并出售给银行的推送功能。不得不向他们解释他们的用户将需要谷歌帐户将是一个有点尴尬的对话。 我知道这是一个老问题,但 GCM 开关的规则有所改变。较新的设备不再需要 Google 帐户。 “它使用现有的 Google 服务连接。对于 3.0 之前的设备,这要求用户在他们的移动设备上设置他们的 Google 帐户。运行 Android 4.0.4 或更高版本的设备不需要 Google 帐户。” - developer.android.com/google/gcm/gcm.html

以上是关于Android上持久移动连接的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

目前持久性的最佳实践是啥?

Android最佳实践——深入浅出WebSocket协议

以 API 为主导的连接的 Mulesoft 最佳实践,是不是可以直接从客户端应用程序调用系统 API(无论是网络/移动)

出海移动应用的 MAD 最佳实践

Android 客户端应用程序中“数据层”的最佳实践

最佳实践Android设计:隐藏的webview、fragment、service?