收到firebase通知的打开应用程序(FCM)

时间:2016-05-31 19:38:39

标签: android firebase firebase-cloud-messaging firebase-notifications

我希望在收到通知时自动打开应用程序,Firebase和新的FCM通知是否可以实现?

我知道我可以设置click_action,但这仅用于自定义通知点击会启动哪些活动,我需要在收到通知时自动启动的内容。

我尝试了快速启动消息传递firebase示例,并且有一个onMessageReceived()方法,但它仅在应用程序位于前台时才有效。应用程序在后台运行时是否会执行某些操作? 通过直接启动广播接收器的活动意图,GCM可以做我喜欢的事情,这是在收到通知时调用的。

5 个答案:

答案 0 :(得分:52)

快速回答:

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

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

警告:在没有任何用户交互的情况下启动UI对于大多数应用程序来说是非常糟糕的做法!请在此处阅读 MarkG 答案:   How to start an Activity from a Service?

  

[...]中断用户当前正在做的事情被认为是糟糕的设计形式,尤其是应该在后台运行的东西。   因此,当用户决定调查时,您应该考虑使用通知[...]启动所需的活动。 [...]

完全解释:

FCM的工作方式与GCM类似,可以接收两种类型的消息:

  1. display-messages:
    有效负载 {"notification" : { "body" : "hello world"}}
    这些消息在应用程序处于后台时会自动显示 ,如果应用已在前台,则会调用FirebaseMessagingService.onMessageReceived()

  2. 数据消息:
    有效负载{"data" : { "key1" : "value1"}}
    这些消息始终会调用 FirebaseMessagingService.onMessageReceived()
    即使应用程序已关闭或在后台运行。
  3. 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步

安装Google Advanced REST client

输入以下参数:

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控制台上的项目。

如果您的应用程序位于后台,则从控制台发送的任何消息都会为您提供系统通知,如果触摸该通知,则会激活您的应用。

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

答案 4 :(得分:0)

解决这个问题的方法实际上很容易。无需意图,只需安装“ @ ionic-native / background-mode”。

Here is a full explanation和一个git存储库来解决此问题