gpt4 book ai didi

android - 了解 Firebase 消息传递的客户端流程

转载 作者:行者123 更新时间:2023-12-03 14:36:56 28 4
gpt4 key购买 nike

我正在尝试深入研究 FCM 消息的客户端流程(一旦在 Android 设备上收到消息)。
我了解 Android 有一些原生 Firebase 系统服务,最初接收 Firebase 消息(如果设备未离线)。该消息是如何传递到预期应用程序的(使用广播、 Intent ?)?这个原生 Firebase 服务如何知道将消息发送到哪个应用程序?
文档中提到 FirebaseMessagingService设备上可以接收到 Firebase 消息 even when stopped .在这种情况下它是如何工作的?
在应用程序中,可以有一个 FirebaseMessagingService但有多个 FirebaseApp 实例。应用程序的这些不同 FirebaseApp 实例如何影响消息传递?
我很感激对流程的详细了解,我无法找到任何官方文档/博客。

最佳答案

对于他们不久前添加的流程的非常一般的概述,FCM Architectural Overview也许你已经找到了。
专门进入 Android,让我们从研究这部分问题开始:
-> “文档中提到设备上的 FirebaseMessagingService 即使在停止时也可以接收 Firebase 消息。在这种情况下它是如何工作的?”
background service在 Activity 停止后幸存下来。 “ native Firebase 系统服务”是 Service在 firebase SDK Manifest 中声明,它通过 Manifest merging 集成到您的应用中.

Your APK file can contain just one AndroidManifest.xml file, but your Android Studio project may contain several—provided by the main source set, build variants, and imported libraries


如您所见 Firebase SDK Manifest注册服务。请注意, Intent 过滤器的 priority 非常低 (-500) , 0 是默认值。因此,当您使用 .MyService 扩展 Firebase 服务时您的服务将被调用,请检查 official guide 中的“编辑您的 list ”步骤:

A service that extends FirebaseMessagingService. This is required if you want to do any message handling beyond receiving notifications on apps in the background.


如果您不这样做,您的服务将永远不会被调用,并且通知显示将由 firebase 服务管理。
但是服务如何接收事件呢?最好的猜测是通过一些套接字或轮询机制,如建议 here ,另一个提示是,firebase 会定期关闭连接以“执行负载平衡”,如 their protocol 中所述。 ,执行此“轮询”的 SDK 类可能是 TopicSyncTask .
回到我们,您的服务在后台“轮询”,当有事件显示它使用系统的 NOTIFICATION_SERVICE 创建通知时:
// Register the channel with the system
val notificationManager: NotificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

-> “这条消息是如何传递给预期的应用程序的(使用广播、 Intent ?)?”
通过带有 Intent 过滤器的 Intent : creates a notification 是您的服务发送到 Android 操作系统,添加 intent filter具体操作 com.google.firebase.MESSAGING_EVENT此时,Android 操作系统将查找任何具有 intent-filter 的 Activity 或 Service用同样的 Action 。如果您扩展了 firebase 服务,您的服务将通过覆盖 onMessageReceived 来调用。如 firebase guide所示.
这是否意味着任何应用程序都可以创建触发您的服务的 Intent ?不,因为 firebase SDK Manifest设置 android:exported=false .
-> “这个原生 Firebase 服务如何知道将消息发送到哪个应用程序?”
该服务知道您的应用程序唯一的包名,并在 creating the notification 时使用它。 .
-> “应用程序的这些不同 FirebaseApp 实例如何影响消息传递?”
不确定我是否理解正确,但此类任务将通过 google-services.json 解决。 ,有一个 official guide如果您需要访问应用程序中的多个项目。
总结一下流程是:
  • firebase 后台服务轮询事件(由 SDK 启动)
  • 该服务创建一个 Intent ,针对过滤 com.google.firebase.MESSAGING_EVENT 的任何 Activity/服务。
  • 您的服务onMessageReceived被调用(如果你没有扩展 firebase 服务,firebase onMessageReceived 将被调用)
  • 您的服务处理通知(如果您没有扩展 firebase 服务,它会调用您的应用程序,因为它知道您的应用程序包名称)
  • 关于android - 了解 Firebase 消息传递的客户端流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66699583/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com