我用firebase来建立我的项目。
它还将使用FCM(firebase云消息)。
但是有一个问题。
我不能处理FCM(创建我的自定义通知)时,应用程序在后台。
The official site tutorial说
案例1:应用程序前台-〉覆盖"onMessageReceived()"以创建自定义通知。
案例2:App后台-〉系统会直接创建通知,我们不需要也不能做任何事情,因为本例中它没有触发"onMessageReceived()"。
但是,如果我可以什么都不做时,应用程序是后台,我不能创建我的自定义通知。(例如,用户点击通知后,它会弹出一个窗口显示详细信息。
那么,当应用程序在后台时,我如何使用FCM处理通知?
5条答案
按热度按时间dy2hfwbg1#
谷歌更改了版本"com. google. firebase:firebase消息传递:11.6.0"中的Firebase源代码。
handelIntent现在是"public final void方法"。这意味着我们不能覆盖它。
如果您想使用该解决方案,请将版本更改为"com. google. firebase:firebase-messaging:11.4.2"**
有比official site tutorial更好的方法
官方网站称,该通知将在应用程序处于后台时由系统创建。因此,您无法通过覆盖"onMessageReceived()"来处理它。因为"onMessageReceived()"仅在应用程序处于前台时触发。
但事实并非如此,实际上通知(当应用程序在后台时)是由Firebase库创建的。
在我追踪了Firebase库的代码之后。我找到了一个更好的方法。
原因:
因为方法将被触发应用程序在前台或后台。所以我们可以处理FCM消息,并创建我们的自定义通知在这两种情况下。
方法:
如果你不知道你设置的消息格式,打印它并尝试解析它。
Here is the basic illustration
原因:
我们可以创建自定义通知。但是由Firebase库创建的通知仍然存在(实际上它是由"super. handleIntent(intent)"创建的。下面有详细的解释。)然后我们将有两个通知。这很奇怪。所以我们必须删除由Firebase库创建的通知
方法(项目构建级别为Android 6.0以上版本):
识别我们想要删除的通知并获取信息。然后使用"notificationManager. cancel()"删除它们。
lmyy7pcs2#
但是,如果我可以什么都不做时,应用程序是后台,我不能创建我的自定义通知。(例如,用户点击通知后,它会弹出一个窗口显示详细信息。
那么,当应用程序在后台时,我如何使用FCM处理通知?
首先,您需要创建正确的消息有效负载,并将其发送到fcm服务器。
data
payload是用户点击通知后您希望显示为消息详细信息的实际数据,notification
payload表示生成的通知的外观(可以设置的属性多得多),您不需要自己构建通知,只需在此处设置其属性。要在用户点击通知后显示您的活动,您需要设置对应于
click_action
的Intent filter:因此,当用户点击通知时,具有上述Intent过滤器Activity将自动启动。最后一步是在点击通知后启动Activity时检索数据。这非常简单。自定义数据通过bundle传递给Activity。在Activity的
onCreate
方法中执行以下操作:如果应用程序没有运行或在后台运行,以上所有操作都有效。如果您的应用程序在前台运行,则不会创建通知。相反,您将收到
onMessageReceived()
事件,以便您可以在那里处理相同的数据(我猜您知道如何处理)。参考:
https://firebase.google.com/docs/cloud-messaging/http-server-refhttps://github.com/firebase/quickstart-android/tree/master/messaging
ezykj2lf3#
你需要使用FCM数据消息来创建自定义通知,即使你的应用在后台,
onMessageReceived
也会被调用,这样你就可以处理数据并显示自定义通知。https://firebase.google.com/docs/cloud-messaging/android/receive
必须从服务器发送的数据消息格式:
rqdpfwrv4#
handleIntent()
解决方案它可能适用于一些设备和一些旧版本的 FCM,也如果你@override
方法,没有在官方文档中描述的firebase你可能会遇到一些问题,你使用它在你自己的风险!.解决方案是什么
除了 FCM 之外,您还需要使用自己的推送通知服务,如 Telegram。
或者在 GCM 旁边使用 * SyncAdapter *,如 Gmail。
因此,如果你需要它像那些应用程序一样成功地工作,你必须使用你自己的黑客。
dwbf0jvd5#
公共类FirebaseMessageReceiver扩展了FirebaseMessageService {
}