不使用 Firebase 云消息传递或任何其他类似服务的 Android 推送通知

Posted

技术标签:

【中文标题】不使用 Firebase 云消息传递或任何其他类似服务的 Android 推送通知【英文标题】:Android Push Notifications Without using Firebase Cloud Messaging or any other similar service 【发布时间】:2019-02-08 05:29:25 【问题描述】:

我正在开发一个使用服务器-客户端架构的安卓聊天应用程序,用于学习目的。我自己用 Java 编写了服务器端(因为我正在努力学习),而客户端是一个 android 应用程序。我正在使用 TCP 套接字进行通信。

当两个客户端打开并连接应用时一切正常,但我希望客户端 A 在客户端 B 未打开应用时仍然能够向客户端 B 发送消息。强>

在做了一些研究后,我意识到我需要使用 android 推送通知,这将允许我的服务器与客户端(android 应用程序)通信,即使应用程序未打开或运行时也是如此通过在客户端触发意图。我做了更多的研究,我发现的每个教程都使用第三方服务作为中间人来实现这一点,例如 Firebase Cloud Messaging,这违背了我尝试通过自己做事来学习的目的。

因为我这样做是为了学习目的我不想使用任何这些服务,例如 Firebase Cloud Messaging,我想自己从我用 java 编写的服务器触发意图不使用中间人。

这里的主要目标是在应用关闭时从我的服务器向安卓应用发送消息,而不使用任何第三方软件,例如 Firebase Cloud Messaging。

我不确定如何实现这一目标,如果有人能指出正确的方向,我将不胜感激。 谢谢!

【问题讨论】:

浏览这个库,了解他们是如何实现的countly-server 虽然我建议不要花时间从头开始实施 这对于***来说可能有点太宽泛了。 【参考方案1】:

除了我想说的 sahand-zehtabchi 之外,这样的服务最好使用它自己的进程,在 Manifest 中使用android:process,这样我就不会在主应用程序终止时被杀死,也应该实现启动重新启动后再次获得<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 的许可并构建接收器:

<receiver android:name="de.example.BootBroadcastReceiver">  
  <intent-filter>  
    <action android:name="android.intent.action.BOOT_COMPLETED" />  
  </intent-filter>  
</receiver>

但是,对于设备的电池和内存使用而言,这样一个非常粘的后台服务当然不是一个非常好的架构。如果可能,最好使用任何现有的 Android 系统服务。

【讨论】:

该服务将如何接收客户端发送的消息? 谢谢!虽然这不是全貌,但它确实为我指明了正确的方向。因此,将@Sahand-zehtabchi 的评论和您的评论放在一起,我应该有一个可以启动 intent 的接收器。这个意图将打开一个到我的服务器的 TCP 套接字连接,接收可能保存在服务器端队列中的新消息,然后最终会创建一个 android 推送通知。我仍然不清楚的是,如果我的应用程序甚至没有打开,什么会触发此服务/意图/接收器执行每个设置的时间间隔?【参考方案2】:

我认为当应用程序在后台时,您可以启动一个服务并打开一个套接字然后开始监听新消息,当收到新消息时,您可以使用 android sdk 通知处理显示通知。

【讨论】:

以上是关于不使用 Firebase 云消息传递或任何其他类似服务的 Android 推送通知的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kotlin 的 Firebase 云消息传递 Android

Firebase 云消息传递 - 检查现有或可用主题

IOS Firebase 云消息传递“InvalidApnsCredential”

使用 Flutter 测试 Firebase 云消息传递

Firebase 云消息传递多个设备和一个帐户

Firebase 云消息传递 - iOS - 未注册或无法订阅主题