在收到的Firebase通知(FCM)上打开应用程序

我想在收到通知时自动打开应用程序,Firebase和新的FCM通知可以这样做吗?

我知道我可以设置click_action,但这只是为了自定义哪个活动将在通知点击开始,我需要的东西,会收到通知时自动启动。

我尝试了快速入门消息传递的Firebase示例,并有一个onMessageReceived()方法,但只有当应用程序在前台时才有效。 有什么东西会执行而应用程序在后台以及? GCM可以通过从收到通知时调用的广播接收器直接启动活动意图来做类似我想要的事情。

快速回答:

要通过FCM自动打开应用程序,您需要使用一个data-message ,该data-message保证始终调用FirebaseMessagingService.onMessageReceived()方法。

然后,您可以在.onMessageReceived()方法中添加您的逻辑来启动首选活动。

警告:在没有任何用户交互的情况下启动UI对于大多数应用程序来说是非常糟糕的做法! 请在此阅读MarkG答案: 如何从服务中启动活动?

中断用户目前正在做的事情被认为是糟糕的deviseforms,特别是在应该在后台运行的东西。
因此,当用户决定是时候调查时,您应该考虑使用通知来启动所需的活动。 […]

完整的解释:

FCM与GCM类似,可以接收两种types的消息:

  1. 显示的消息:
    有效载荷{"notification" : { "body" : "hello world"}}
    这些消息在应用程序处于后台时自动显示,如果应用程序已处于前台状态,则会调用FirebaseMessagingService.onMessageReceived()
  2. 数据的消息:
    有效载荷{"data" : { "key1" : "value1"}}
    这些消息总是调用 FirebaseMessagingService.onMessageReceived()
    即使应用程序已closures或在后台。

click_action是通知有效载荷的参数,因此它适用于显示消息。

指示与用户单击通知关联的操作。
如果设置了此项,则用户单击通知时将启动具有匹配意图filter的活动。

https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

它看起来像指南的这一部分是背景应用程序的难题的关键:

接收消息
使用扩展FirebaseMessagingService的服务 。 您的服务应该覆盖为大多数消息types提供的onMessageReceivedcallback,但以下情况除外:

当您的应用在后台时发送通知。
在这种情况下,通知将传送到设备的系统托盘。 用户点击通知会默认打开应用程序启动器。

带有通知和数据有效负载的消息。
在这种情况下,通知被传送到设备的系统托盘,并且数据有效载荷以您的启动程序活动的意图附加内容传送。

本质上,当应用程序是背景时,它不是真正的响应或运行在这一点上。 相反,消息被传递到系统托盘。 但是,下面解释解决scheme。

如果要打开应用程序并执行特定的操作,请在通知负载中设置click_action,并将其映射到要启动的Activity中的intentfilter。 例如,将click_action设置为OPEN_ACTIVITY_1以触​​发一个意图filter,如下所示:

 <intent-filter> <action android:name="OPEN_ACTIVITY_1" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> 

我总结了这里的步骤,希望它有帮助

步骤1

遵循FCM用户指南 。 通过推送来自Firebase控制台的消息,确保一切正常工作。

第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步

安装Google高级REST客户端

input下面的参数:

 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" }, } 

您可以在Firebase控制台>设置窗格>云消息传递标签中使用YOUR_SERVER_KEY

YOUR_DEVICE_FCM_TOKEN是onTokenRefresh()上的FirebaseInstanceId.getInstance().getToken() onTokenRefresh()

注意

在没有用户交互的情况下启动用户界面就是糟糕的用户体验,您可能需要将开始活动replace为启动服 我只是将活动用于testing目的,所以它会比服务更具视觉效果。 Thanks @ 2ndgab介绍Google高级REST客户端工具。

[Android]如果您使用的是Firebase通知(不是Firebase云消息传递),则只需在您的build.gradle中包含Firebase消息传递,然后将您的应用链接到Firebase控制台上的项目即可。

如果你的应用程序在后台,任何从控制台发送的消息都会给你一个系统通知,如果被触摸,它会激活你的应用程序。

看看这里: https : //youtu.be/KpTSpVh9SfY?t=10m22s