我希望在收到通知时自动打开应用程序,Firebase和新的FCM通知是否可以实现?
我知道我可以设置click_action,但这仅用于自定义通知点击会启动哪些活动,我需要在收到通知时自动启动的内容。
我尝试了快速启动消息传递firebase示例,并且有一个onMessageReceived()方法,但它仅在应用程序位于前台时才有效。应用程序在后台运行时是否会执行某些操作? 通过直接启动广播接收器的活动意图,GCM可以做我喜欢的事情,这是在收到通知时调用的。
答案 0 :(得分:52)
要通过FCM自动打开应用程序,您需要使用data-message
,这样可以保证始终调用FirebaseMessagingService.onMessageReceived()
方法。
然后,您可以在.onMessageReceived()
方法中添加逻辑以启动首选活动。
警告:在没有任何用户交互的情况下启动UI对于大多数应用程序来说是非常糟糕的做法!请在此处阅读 MarkG 答案: How to start an Activity from a Service?
[...]中断用户当前正在做的事情被认为是糟糕的设计形式,尤其是应该在后台运行的东西。 因此,当用户决定调查时,您应该考虑使用通知[...]启动所需的活动。 [...]
FCM的工作方式与GCM类似,可以接收两种类型的消息:
{"notification" : { "body" : "hello world"}}
FirebaseMessagingService.onMessageReceived()
。
{"data" : { "key1" : "value1"}}
FirebaseMessagingService.onMessageReceived()
, click_action
是通知有效负载的参数,因此它适用于display-messages。
表示与用户点击通知相关联的操作 如果设置了具有匹配意图过滤器的活动 在用户点击通知时启动。
https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support
答案 1 :(得分:16)
看起来this section of the guide是背景应用难题的关键:
接收消息
使用扩展的服务 FirebaseMessagingService。您的服务应该覆盖onMessageReceived
回调,为大多数邮件提供 类型,但以下情况除外:当您的应用在后台时发送的通知。
在这 如果是,通知将传送到设备的系统托盘。一个 用户点按通知会默认打开应用启动器。包含通知和数据有效负载的邮件。
在这种情况下, 通知将传递到设备的系统托盘和数据 有效载荷是在发射器意图的额外内容中提供的 活性。
基本上,当应用程序背景化时,它不是真正响应或在此时运行。因此,消息将传递到系统托盘。但是,就在下面,解释了解决方案。
如果您要打开应用并执行特定操作[在后台运行时],请设置 通知有效内容中的click_action并将其映射到intent 在要启动的活动中过滤。例如,设置 click_action 到 OPEN_ACTIVITY_1 以触发像 以下内容:
<intent-filter>
<action android:name="OPEN_ACTIVITY_1" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
答案 2 :(得分:8)
我总结了这里的步骤,希望它有用
第1步
关注FCM user guide。通过从Firebase console推送消息,确保一切正常。
第2步
按如下所示更改自定义FirebaseMessagingService类:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d(TAG, "From: " + remoteMessage.getFrom());
startActivity(new Intent(this, SplashActivity.class));
}
}
现在再次使用Firebase控制台推送消息,您会发现onMessageReceived
仅在您的应用位于前台时触发。因为Firebase控制台只能发送Notification message
。要发送Data message
,我们需要第3步。
第3步
输入以下参数:
url: https://fcm.googleapis.com/fcm/send
method: POST
Raw header:
Content-Type: application/json
Authorization:key=YOUR_SERVER_KEY
Raw payload:
{
"to" : "YOUR_DEVICE_FCM_TOKEN",
"data" : {
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
},
}
FirePro控制台中提供了YOUR_SERVER_KEY&gt;设置窗格&gt;云消息传递选项卡
YOUR_DEVICE_FCM_TOKEN FirebaseInstanceId.getInstance().getToken()
上onTokenRefresh()
注意
在没有用户交互的情况下启动UI是糟糕的用户体验,您可能需要将启动活动替换为启动服务或后台的某些内容。我只是将活动用于测试目的,因此它比服务更具视觉效果。 感谢@2ndgab介绍Google Advanced REST客户端工具。
答案 3 :(得分:2)
[Android]产品 如果您使用的是Firebase通知(而非Firebase云消息传递),您只需在build.gradle中包含Firebase消息,然后将您的应用链接到Firebase控制台上的项目。
如果您的应用程序位于后台,则从控制台发送的任何消息都会为您提供系统通知,如果触摸该通知,则会激活您的应用。
答案 4 :(得分:0)
解决这个问题的方法实际上很容易。无需意图,只需安装“ @ ionic-native / background-mode”。
Here is a full explanation和一个git存储库来解决此问题