如何在应用程序未运行时通知用户有关收到的 GTalk 聊天记录

How to notify the user about received GTalk chats when the app is not running

我使用 GTalk 服务器和 (a)Smack 库实现了一个聊天客户端。到目前为止,一切都很好。现在,我想不通的是如何在应用程序关闭时通知用户收到的聊天记录,就像所有其他聊天应用程序一样。我正在阅读推送通知,但我发现的所有示例也都有服务器组件,但我显然没有,因为我的应用程序只是 GTalk 的客户端。

我应该使用 GCM 并为此实现服务器端吗?我是否应该尝试启动一个在启动时侦听传入消息的服务(类似于 this example)?

服务绝对是要走的路,你可以保留它运行这样你的 XMPP 连接就保持打开状态。

您可以从服务器接收消息,如果应用程序关闭,您可以通过广播接收器显示您的通知,当应用程序打开时,您可以禁用之前的广播接收器并注册一个新的接收器来管理您 activity 例如。

这几乎是我的实现。

竖起大拇指表示赞赏!

享受

您已经有了监听消息、维护网络连接等的服务,它Google消息服务。您想要重新发明轮子,并复制现有功能。当您使用没有 Google 或其他供应商服务的设备时,这是有意义的,但在典型设备上,您的服务将与 Google(亚马逊、诺基亚)共存,并且保持多个网络连接就可以了更多 cpu 唤醒,浪费内存,这会导致电池耗尽。

所以,使用GCM/GMS是必须的。也许回退到自制服务会在没有 GCM 的设备上帮助您。

关于 "GTalk client" 的注释。您的应用程序不能是功能齐全的 GTalk 客户端:Google Talk 是 Google 平台(现已更名为 Hangouts)的 部分 。它使用许多 Google 专有 XMPP 扩展,您不能从第三方客户端使用这些扩展:您无权访问消息 history/sync、群聊,您无法在 GCM 中为 GTalk 注册设备通知,voice/video 功能只能部分访问。并且随着 GTalk 的弃用而支持环聊 - 你也失去了基本的 XMPP 兼容性并且根本没有现代 API。

因此,如果您想构建 messaging/voip 应用程序,您 应该 拥有自己的服务器、自己的用户数据库、身份验证(您的应用程序仍然能够进行身份验证用户作为 Google 用户并导入他们的联系人),消息存储和同步,当然你的消息服务器应该在 GCM 中注册用户并在你的客户端应用程序未连接时将消息转发到 Google 服务。

有一些商业平台(比如 Parse,但我没有测试过)可以为您提供 "third-party server component" 和 SDK,您应该将其插入到您的客户端应用程序中,他们会关心所有"server-side" 您项目的一部分,包括 GCM。

您应该使用包含 XMPPConnection 的 Android Service

另请参阅: - aSmack as a service - https://github.com/Flowdalic/asmack/wiki/Should-applications-using-aSmack-use-foreground-Services%3F