41

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

我知道我可以设置 click_action 但这仅用于自定义单击通知时将启动的活动,我需要在收到通知时自动启动的东西。

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

4

4 回答 4

61

快速回答:

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

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

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

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

完整解释:

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

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

  2. data-messages:
    payload{"data" : { "key1" : "value1"}}
    这些消息总是调用 FirebaseMessagingService.onMessageReceived()
    即使应用程序已关闭或在后台。

click_action是通知负载的一个参数,因此它适用于显示消息。

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

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

于 2016-06-04T05:47:02.530 回答
19

看来本指南的这一部分是解决后台应用程序难题的关键:

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

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

带有通知和数据负载的消息。
在这种情况下,通知被传递到设备的系统托盘,数据负载被传递到启动器 Activity 的附加内容中。

本质上,当应用程序在后台运行时,此时它并没有真正响应或运行。因此,消息被传递到系统托盘。然而,就在下面,解释了解决方案。

如果您想打开您的应用并执行特定操作 [在后台运行时],请在通知负载中设置 click_action 并将其映射到您要启动的 Activity 中的意图过滤器。例如,将 click_action设置为OPEN_ACTIVITY_1以触发意图过滤器,如下所示:

<intent-filter>
  <action android:name="OPEN_ACTIVITY_1" />
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
于 2016-06-01T05:19:33.913 回答
8

我在这里总结了步骤,希望对您有所帮助

步骤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 Advanced REST 客户端

输入以下参数:

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

YOUR_SERVER_KEY 在 Firebase 控制台 > 设置窗格 > 云消息选项卡中可用

YOUR_DEVICE_FCM_TOKEN 已FirebaseInstanceId.getInstance().getToken()开启onTokenRefresh()

笔记

在没有用户交互的情况下启动 UI 是不好的 UX,您可能需要用启动服务或后台的东西替换启动活动。我只是将活动用于测试目的,因此它比服务更直观。感谢@2ndgab介绍 Google 高级 REST 客户端工具。

于 2017-07-14T08:44:28.350 回答
2

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

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

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

于 2016-06-23T23:31:28.703 回答