12

我已经在我的应用程序中实现了 Firebase,并且我正在发送带有额外数据的推送。当我的应用程序处于前台时,我正在正确处理数据并显示我自己的通知,但是当 Firebase 在应用程序“归巢”(未杀死)时“自动”显示通知时,我在获取数据时遇到了问题。根据DOCS Activity应该得到Intent满足我的价值观的额外内容,而不是应用程序回到前面,恢复旧状态。

设想:

  1. 打开应用程序,按主页
  2. 通过 Firebase 控制台发送推送,Firebase 正在创建Notification没有调用onMessageReceived(根据文档中的表格,它应该?)
  3. 当用户选择通知应用程序将被带到与“homed”相同的状态时,并Intent使用用于Activity在顶部打开的“原始”附加功能来实现

我有登录onCreate, onNewIntent, onResume( Activity) 和onMessageReceived( Service),只有onResume被调用,其中我正在打印如下附加内容:

if (getIntent().getExtras() != null) {
        for (String key : getIntent().getExtras().keySet()) {
            Object value = getIntent().getExtras().get(key);
            Log.d("Activity onResume", "Key: " + key + " Value: " + value);
        }
    }
4

4 回答 4

6

具有通知和数据有效负载的消息,包括后台和前台。在这种情况下,数据有效负载将传递给您的启动器活动意图的附加部分。如果您想在其他活动中获取它,则必须在数据有效负载上定义 click_action。因此,在您的启动器活动中获得额外的意图。

编辑:-

文档中:- 在后台时,应用程序在通知托盘中接收通知有效负载,并且仅在用户点击通知时处理数据有效负载。

因此,在单击通知时使用 getIntent() 附加功能检查启动器活动的 oncreate() 方法。

于 2018-08-24T09:52:25.427 回答
6

所以我一直在寻找这个答案并阅读相同的内容。它必须在某个地方。我知道这是一岁了,但他们还没有真正说清楚。在与通知关联的 pendingActivity 中(在我的例子中是 MainActivity ),我添加了以下内容。请注意,我正在通过 Google Codelabs com.example.android.eggtimernotifications 工作,而不是在答案中。

    override fun onResume() {
        super.onResume()
        intent?.run {
            val keys = this.extras?.keySet()
            if (!keys.isNullOrEmpty()) {
                keys.forEach { key ->
                    when (this.extras!![key]) {
                        is Long -> println("$key = ${this.getLongExtra(key, 0L)}")
                        is Int -> println("$key = ${this.getIntExtra(key, 0)}")
                        is String -> println("$key = ${this.getStringExtra(key)}")
                        is Boolean -> println("$key = ${this.getBooleanExtra(key, false)}")
                        else -> println("unkonwn Type")
                    }
                }
            }
        }
    }

这导致了以下情况。

  • I/System.out:google.delivered_priority = 高
  • I/System.out:google.sent_time = 1585284914411
  • I/System.out: google.ttl = 2419200
  • I/System.out:google.original_priority = 高
  • I/System.out: 麦片 = Shreddies
  • I/System.out:来自 = /topics/breakfast
  • I/System.out:牛奶 = 1 杯
  • I/System.out:糖 = 无
  • I/System.out: google.message_id = 0:1585284914700957%f6ddf818f6ddf818
  • I/System.out:collapse_key = com.example.android.eggtimernotifications

数据键是谷物、原料、牛奶和糖。

于 2020-03-27T05:27:10.280 回答
1

根据文档云消息传递文档消息可以以 3 种状态传递:

  1. 通知
  2. 数据
  3. 通知和数据

后台处理:

对于 2.onMessageReceived将在没有 UI 和额外处理的情况下调用。稍后你可以展示一些自定义的东西。

3. android 将显示通知并保存数据,直到有用户交互。单击后,它只是恢复您现有的活动。你onNewIntent没有被触发,因为你的启动模式不是FLAG_ACTIVITY_SINGLE_TOP

您还应该检查您的 logcat 输出是否有:Google Play services out of date.

于 2018-08-24T09:40:55.840 回答
1

当应用程序在后台时,不会调用 onMessageReceived()。几个月前我有这个问题。我通过覆盖 handlerIntent 方法来解决它。但是您的 Firebase 消息传递库应该

implementation 'com.google.firebase:firebase-messaging:10.2.1'

之后:

@Override
    public void handleIntent(Intent intent) {
        try
        {
            if (intent.getExtras() != null)
            {
                RemoteMessage.Builder builder = new RemoteMessage.Builder("MessagingService");

                for (String key : intent.getExtras().keySet())
                {
                    builder.addData(key, intent.getExtras().get(key).toString());
                }

                onMessageReceived(builder.build());
            }
            else
            {
                super.handleIntent(intent);
            }
        }
        catch (Exception e)
        {
            super.handleIntent(intent);
        }
    }

如果您不想降级您的图书馆,那么

您可以指定 click_action 来指示用户点击通知时应启动的意图。如果未指定 click_action,则使用主要活动。

当意图启动时,您可以使用

getIntent().getExtras();

检索一个集合,该集合将包括与通知消息一起发送的任何数据。

有关通知消息的更多信息,请参阅https://firebase.google.com/docs/cloud-messaging/android/receive#sample-receive

于 2018-08-24T09:47:34.213 回答