当应用程序在后台时,FCM Intent 在哪里提供数据?

sna*_*msm 11 android push-notification firebase firebase-cloud-messaging android-push-notification

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

设想:

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

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

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

小智 7

所以我一直在寻找这个答案并阅读了同样的答案。它必须在某个地方。我知道这已经一年了,但他们仍然没有真正说清楚。在与通知关联的待处理活动(在我的例子中是 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")
                    }
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这导致了以下结果。

  • 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/早餐
  • 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

数据键是谷物、牛奶、糖。


Nai*_*nal 6

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

编辑:-

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

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

  • 如果您收到通知,则单击通知并检查是否单击通知启动器活动的 getIntent 被调用? (2认同)