在Android 应用中接收消息 | Firebase Cloud Messaging
文章推薦指數: 80 %
根据接收消息的应用的状态(前台/后台),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,您需要将以下内容添加到您的应用清单:
您可以指定自定义默认图标和颜色,当通知载荷中未设置相应的值时,系统会使用这些默认值。
将以下代码行添加到application标记内,以设置自定义默认图标和颜色:
未在通知载荷中明确设置图标的通知消息。
对于以下消息,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能够感知直接启动:
检查是否满足以下要求:
在直接启动模式下运行时,该服务不应访问受凭据保护的存储空间。
在直接启动模式下运行时,该服务不应尝试使用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
Русский
עברית
العربيّة
فارسی
हिंदी
বাংলা
ภาษาไทย
中文–简体
中文–繁體
日本語
한국어
延伸文章資訊
- 1【Flutter基礎概念與實作】 Day28–使用FCM發送通知給使用者
Firebase Cloud Messaging (FCM) is a cross-platform messaging solution that lets you reliably deli...
- 2通知- Firebase說明
撰寫訊息 · 在通知編輯器中,選取[Messages] 標籤。 · 選取[New Message]。 · 輸入訊息文字,也可以選填訊息標籤。 · 選取傳送日期:[Now] 或[Scheduled...
- 3使用Firebase 雲端傳訊進行遠端通知- Xamarin - Microsoft Learn
本逐步解說提供如何使用Firebase 雲端通訊實作遠端通知的逐步說明, (也稱為Xamarin.Android 應用程式中的推播通知) 。 它說明如何實作與Firebase ...
- 4FireBase FireBase推播應用介紹- appxtech - Medium
(1) 通知(Notification) :當APP處於背景FireBase會直接進行處理傳送,當APP處於前景時需調用onMessageReceived()才會收的到通知。 (2) 數據(Da...
- 5FCM 消息简介 | Firebase Cloud Messaging
通知消息,有时被称为“显示消息”。此类消息由FCM SDK 自动处理。 数据消息,由客户端应用处理。 通知消息包含一组用户可见的预 ...