在Android 应用中接收消息 | Firebase Cloud Messaging

文章推薦指數: 80 %
投票人數:10人

根据接收消息的应用的状态(前台/后台),Firebase 通知的行为会有所不同。

如果您希望前台应用接收通知消息或数据消息,则需要编写代码来处理 onMessageReceived 回调 ... 产品 构建 发布与监控 吸引 用例 价格 文档 概览 基础知识 构建 发布与监控 吸引 参考文档 示例 社区 学习 活动 支持 English BahasaIndonesia Deutsch Español–AméricaLatina Français Italiano Polski Português–Brasil TiếngViệt Türkçe Русский עברית العربيّة فارسی हिंदी বাংলা ภาษาไทย 中文–简体 中文–繁體 日本語 한국어 转到控制台 登录 Firebase文档 FCM 概览 基础知识 添加Firebase-Apple平台(iOS+) 添加Firebase-Android 添加Firebase-Web 添加Firebase-Flutter 添加Firebase-C++ 添加Firebase-Unity 添加Firebase-服务器环境 管理Firebase项目 支持的平台和框架 使用EmulatorSuite 构建 EmulatorSuite Authentication RealtimeDatabase Firestore Storage ML Hosting CloudFunctions 安全规则 AppCheck Extensions 发布与监控 Crashlytics PerformanceMonitoring TestLab AppDistribution 吸引 Analytics RemoteConfig A/BTesting CloudMessaging In-AppMessaging DynamicLinks GoogleAdMob GoogleAds AppIndexing 参考文档 示例 产品 更多 用例 价格 文档 更多 概览 基础知识 更多 构建 更多 发布与监控 更多 吸引 更多 参考文档 示例 社区 更多 支持 转到控制台 概览 Analytics 简介开始记录事件设置用户属性调试事件跟踪屏幕设置用户ID衡量电子商务衡量广告收入在WebView中使用通过CloudFunctions扩展配置数据收集和使用方式错误代码 C++ 开始记录事件设置用户属性 Unity 开始记录事件设置用户属性 RemoteConfig 简介开始 RemoteConfig有哪些用途? RemoteConfig用例 主要概念和策略 参数和条件模板和版本控制配置加载策略实时传播更新RemoteConfig与Analytics以编程方式修改RemoteConfig 个性化 概览开始 API参考文档 RESTAPI参考文档条件表达式参考文档AndroidSDK参考文档SwiftSDK参考文档Obj-CSDK参考文档Flutter参考文档Unity参考文档C++参考文档 A/BTesting 简介FirebaseA/BTesting简介使用A/BTesting来创建RemoteConfig实验使用A/BTesting来创建消息传递实验使用A/BTesting来创建In-AppMessaging实验视频系列:了解A/BTesting CloudMessaging 简介FCM架构概览FCM消息简介了解消息递送管理FCM注册令牌 iOS+ 设置Apple平台客户端发送测试消息向多台设备发送消息在通知载荷中发送图片接收消息向主题发送消息向设备组发送消息使用Firebase控制台发送消息 Android 设置Android客户端发送测试消息向多台设备发送消息在通知载荷中发送图片接收消息设置和管理消息优先级向主题发送消息向设备组发送消息发送上行消息使用Firebase控制台发送消息 Flutter 设置Flutter客户端发送测试消息接收消息订阅主题 C++ 设置C++客户端接收消息向主题发送消息向设备组发送消息使用Firebase控制台发送消息 Unity 设置Unity客户端接收消息向主题发送消息向设备组发送消息发送上行消息使用Firebase控制台发送消息 Web(JavaScript) 设置JavaScript客户端发送测试消息向多台设备发送消息接收消息向主题发送消息向设备组发送消息使用Firebase控制台发送消息 服务器环境 您的服务器环境和FCM迁移到HTTPv1API授权发送请求构建发送请求接收上行消息从服务器管理主题 In-AppMessaging 简介开始探索用例编写宣传活动修改消息行为自定义消息 DynamicLinks 简介 用例 概览将Web用户转化为应用用户邀请用户使用您的应用奖励用户引荐操作系统集成 创建动态链接 简介iOSAndroidFlutterC++UnityREST手动构造网址 接收动态链接 iOSAndroidFlutterC++Unity使用自定义域名查看分析数据调试动态链接链接预览和社交元数据 GoogleAdMob 简介面向iOS的使用入门面向Android的使用入门将Analytics和Firebase与AdMob应用结合使用 在游戏中使用AdMob C++ 开始Cocos2d-x激励视频广告 Unity 开始 解决方案 测试采用新广告格式的情况 解决方案概览解决方案教程 优化广告频率 解决方案概览解决方案教程 GoogleAds 简介 AppIndexing 概览 相关产品 Authentication Crashlytics Extensions 构建 发布与监控 吸引 概览 基础知识 构建 发布与监控 吸引 参考文档 示例 学习 活动 添加Firebase-Apple平台(iOS+) 添加Firebase-Android 添加Firebase-Web 添加Firebase-Flutter 添加Firebase-C++ 添加Firebase-Unity 添加Firebase-服务器环境 管理Firebase项目 支持的平台和框架 使用EmulatorSuite EmulatorSuite Authentication RealtimeDatabase Firestore Storage ML Hosting CloudFunctions 安全规则 AppCheck Extensions Crashlytics PerformanceMonitoring TestLab AppDistribution Analytics RemoteConfig A/BTesting CloudMessaging In-AppMessaging DynamicLinks GoogleAdMob GoogleAds AppIndexing 欢迎参加我们将于2022年10月18日举办的Firebase峰会(线上线下同时进行),了解Firebase如何帮助您加快应用开发速度、满怀信心地发布应用并在之后需要时轻松地扩大应用规模。

立即报名 Firebase Firebase文档 FCM 吸引 发送反馈 在Android应用中接收消息 使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

根据接收消息的应用的状态(前台/后台),Firebase通知的行为会有所不同。

如果您希望前台应用接收通知消息或数据消息,则需要编写代码来处理onMessageReceived回调。

如需详细了解通知消息与数据消息之间的区别,请参阅消息类型。

处理消息 如需接收消息,请使用扩展FirebaseMessagingService的服务。

您的服务应该重写onMessageReceived和onDeletedMessages回调方法。

该服务应在收到消息后20秒(AndroidMarshmallow上为10秒)内对其进行处理。

这个时长可能会更短,具体取决于调用onMessageReceived之前发生的操作系统延迟。

这个时间段过后,各种操作系统行为(如AndroidO的后台执行限制)可能会影响您处理消息的能力。

如需了解详情,请参阅我们的消息优先级概述。

对于大多数消息类型,您都可以使用onMessageReceived,但以下情况除外: 当应用在后台时送达的通知消息。

在这种情况下,通知将传送至设备的系统任务栏。

默认情况下,用户点按通知即可打开应用启动器。

在后台接收的既包含通知又具有数据载荷的消息。

在这种情况下,通知将传送至设备的系统任务栏,数据载荷则传送至启动器Activity的intent的extras属性中。

总结: 应用状态 通知 数据 两者皆有 前台 onMessageReceived onMessageReceived onMessageReceived 后台 系统任务栏 onMessageReceived 通知:系统任务栏 数据:intent的extras属性。

如需详细了解消息类型,请参阅通知和数据消息。

对于所有提供了onMessageReceived的消息,您的服务应在收到消息后20秒(在AndroidMarshmallow上为10秒)内对其进行处理。

这个时长可能会更短,具体取决于调用onMessageReceived之前发生的操作系统延迟。

这个时间段过后,各种操作系统行为(如AndroidO的后台执行限制)可能会影响您处理消息的能力。

如需了解详情,请参阅我们的消息优先级概述。

修改应用清单 如需使用FirebaseMessagingService,您需要将以下内容添加到您的应用清单: AndroidManifest.xml 此外,建议您设置默认值以便自定义通知的外观。

您可以指定自定义默认图标和颜色,当通知载荷中未设置相应的值时,系统会使用这些默认值。

将以下代码行添加到application标记内,以设置自定义默认图标和颜色: AndroidManifest.xml 对于以下消息,Android会显示自定义的默认图标: 从NotificationsComposer发送的所有通知信息。

未在通知载荷中明确设置图标的通知消息。

对于以下消息,Android会使用自定义的默认颜色: 从NotificationsComposer发送的所有通知信息。

未在通知载荷中明确设置颜色的通知消息。

如果未设置自定义默认图标,而且通知载荷中也未设置图标,Android会显示以白色渲染的应用图标。

重写onMessageReceived 通过重写FirebaseMessagingService.onMessageReceived方法,您可以根据收到的RemoteMessage对象执行操作并获取消息数据: Java @Override publicvoidonMessageReceived(RemoteMessageremoteMessage){ //TODO(developer):HandleFCMmessageshere. //Notgettingmessageshere?Seewhythismaybe:https://goo.gl/39bRNJ Log.d(TAG,"From:"+remoteMessage.getFrom()); //Checkifmessagecontainsadatapayload. if(remoteMessage.getData().size()>0){ Log.d(TAG,"Messagedatapayload:"+remoteMessage.getData()); if(/*Checkifdataneedstobeprocessedbylongrunningjob*/true){ //Forlong-runningtasks(10secondsormore)useWorkManager. scheduleJob(); }else{ //Handlemessagewithin10seconds handleNow(); } } //Checkifmessagecontainsanotificationpayload. if(remoteMessage.getNotification()!=null){ Log.d(TAG,"MessageNotificationBody:"+remoteMessage.getNotification().getBody()); } //AlsoifyouintendongeneratingyourownnotificationsasaresultofareceivedFCM //message,hereiswherethatshouldbeinitiated.SeesendNotificationmethodbelow. }MyFirebaseMessagingService.java Kotlin+KTX overridefunonMessageReceived(remoteMessage:RemoteMessage){ //TODO(developer):HandleFCMmessageshere. //Notgettingmessageshere?Seewhythismaybe:https://goo.gl/39bRNJ Log.d(TAG,"From:${remoteMessage.from}") //Checkifmessagecontainsadatapayload. if(remoteMessage.data.isNotEmpty()){ Log.d(TAG,"Messagedatapayload:${remoteMessage.data}") if(/*Checkifdataneedstobeprocessedbylongrunningjob*/true){ //Forlong-runningtasks(10secondsormore)useWorkManager. scheduleJob() }else{ //Handlemessagewithin10seconds handleNow() } } //Checkifmessagecontainsanotificationpayload. remoteMessage.notification?.let{ Log.d(TAG,"MessageNotificationBody:${it.body}") } //AlsoifyouintendongeneratingyourownnotificationsasaresultofareceivedFCM //message,hereiswherethatshouldbeinitiated.SeesendNotificationmethodbelow. }MyFirebaseMessagingService.kt 重写onDeletedMessages 在某些情况下,FCM可能不会传递消息。

如果在特定设备连接FCM时,您的应用在该设备上的待处理消息过多(超过100条),或者设备超过一个月未连接到FCM,就会发生这种情况。

在这些情况下,您可能会收到对FirebaseMessagingService.onDeletedMessages()的回调。

当应用实例收到此回调时,应该执行一次与应用服务器的完全同步。

如果您在过去4周内未向该设备上的应用发送消息,FCM将不会调用onDeletedMessages()。

在后台应用中处理通知消息 当您的应用在后台运行时,Android会将通知消息传送至系统任务栏。

默认情况下,用户点按通知即可打开应用启动器。

此类消息包括既具有通知也具有数据载荷的消息(以及所有从Notifications控制台发送的消息)。

在这些情况下,通知将传送至设备的系统任务栏,数据载荷则传送至启动器Activity的intent的extras属性。

如需详细了解发送到您应用的消息,请参阅FCM报告信息中心。

该信息中心记录在Apple和Android设备上发送和打开的消息数量,以及Android应用的“展示次数”(用户看到的通知条数)数据。

后台受限应用(AndroidP或更高版本) FCM无法向被用户实施了后台限制(例如,通过“设置”->“应用和通知”->“[appname]”->“电池”实施后台限制)的应用传送消息。

一旦您的应用解除了后台限制,系统就会像以前一样向该应用传送新消息。

为了防止消息丢失以及其他后台限制影响,一定要避免AndroidVitals汇总信息中列出的不良行为。

这些行为可能会导致Android设备向用户建议对您的应用实施后台限制。

您的应用可以使用isBackgroundRestricted()方法检查其是否受到后台限制。

在直接启动模式下接收FCM消息 如果开发者希望在设备解锁前将FCM消息发送到应用,可以让Android应用在设备处于直接启动模式时接收消息。

例如,您可能希望应用的用户即使在设备锁定的情况下也能收到提醒通知。

构建此用例时,请遵循直接启动模式的常规最佳实践和限制。

请务必考虑支持直接启动的消息的公开范围;任何可接触到设备的用户无需输入用户凭据便可查看这些消息。

前提条件 必须对设备进行设置,以使其支持直接启动模式。

设备必须安装较新版本的GooglePlay服务(19.0.54或更高版本)。

应用必须使用FCMSDK(com.google.firebase:firebase-messaging)才能接收FCM消息。

在应用中启用直接启动模式消息处理 在应用级Gradle文件中,添加对FCM直接启动支持库的依赖项: implementation'com.google.firebase:firebase-messaging-directboot:20.2.0' 通过在应用清单中添加android:directBootAware="true"特性,使应用的FirebaseMessagingService能够感知直接启动: 请务必确保此FirebaseMessagingService服务可以在直接启动模式下运行。

检查是否满足以下要求: 在直接启动模式下运行时,该服务不应访问受凭据保护的存储空间。

在直接启动模式下运行时,该服务不应尝试使用Activities和BroadcastReceivers等组件或其他未标记为能够感知直接启动的Services。

在直接启动模式下运行时,该服务使用的库也不应访问受凭据保护的存储空间,并且不应调用non-directBootAware组件。

也就是说,该应用通过此服务调用所使用的库要么需要能够感知直接启动,要么应用需要检查它是否在直接启动模式下运行,并且不在该模式下调用这些库。

例如,FirebaseSDK支持直接启动(它们可以包含在应用中,不会在直接启动模式下导致应用崩溃),但许多FirebaseAPI都不支持在直接启动模式下调用。

如果应用使用自定义Application,则Application也需要能够感知直接启动(不能在直接启动模式下访问受凭据保护的存储空间)。

如需了解向处于直接启动模式下的设备发送消息的指南,请参阅发送支持直接启动的消息。

发送反馈 Exceptasotherwisenoted,thecontentofthispageislicensedundertheCreativeCommonsAttribution4.0License,andcodesamplesarelicensedundertheApache2.0License.Fordetails,seetheGoogleDevelopersSitePolicies.JavaisaregisteredtrademarkofOracleand/oritsaffiliates. Lastupdated2022-09-22UTC. [{ "type":"thumb-down", "id":"missingTheInformationINeed", "label":"没有我需要的信息" },{ "type":"thumb-down", "id":"tooComplicatedTooManySteps", "label":"太复杂/步骤太多" },{ "type":"thumb-down", "id":"outOfDate", "label":"内容需要更新" },{ "type":"thumb-down", "id":"translationIssue", "label":"翻译问题" },{ "type":"thumb-down", "id":"samplesCodeIssue", "label":"示例/代码问题" },{ "type":"thumb-down", "id":"otherDown", "label":"其他" }] [{ "type":"thumb-up", "id":"easyToUnderstand", "label":"易于理解" },{ "type":"thumb-up", "id":"solvedMyProblem", "label":"解决了我的问题" },{ "type":"thumb-up", "id":"otherUp", "label":"其他" }] 需要向我们提供更多信息? 学习 指南 参考 示例 库 GitHub 掌握动态 博客 Firebase峰会 Twitter YouTube 支持 与支持团队联系 StackOverflow Slack社区 Googlegroup 版本说明 常见问题解答 Android Chrome Firebase GoogleCloudPlatform 所有产品 条款 隐私权政策 English BahasaIndonesia Deutsch Español–AméricaLatina Français Italiano Polski Português–Brasil TiếngViệt Türkçe Русский עברית العربيّة فارسی हिंदी বাংলা ภาษาไทย 中文–简体 中文–繁體 日本語 한국어



請為這篇文章評分?