当应用程序处于后台时,FCM Intent在何处传递数据?

时间:2018-08-24 09:06:48

标签: android firebase push-notification firebase-cloud-messaging android-push-notification

我已经在我的应用程序中实现了Firebase,并且正在发送带有额外数据的推送。当我的应用程序处于前台时,我可以正确处理数据并显示我自己的通知,但是当应用程序“驻留”(未终止)时,Firebase显示“自动”通知时,获取数据存在问题。根据{{​​3}} Activity应该获得新的Intent,并且附加值由我的价值观来满足,而应用程序只是回到最前面,恢复了旧状态。

场景:

  1. 打开应用程序,按Home
  2. 通过Firebase控制台发送推送消息,Firebase正在创建Notification而没有调用onMessageReceived(根据文档中的表格,应该吗?)
  3. 当用户选择通知应用程序将以与“归属”状态相同的状态显示在最前面时,Intent会在顶部打开Activity时使用“原始”附加功能来实现

我在onCreateonNewIntentonResumeActivity)和onMessageReceivedService)中只有{{1 }}被称为,其中我将打印以下内容:

onResume

4 个答案:

答案 0 :(得分:3)

同时具有通知和数据有效载荷(后台和前台)的消息。在这种情况下,数据有效载荷将交付给启动程序活动的其他目的。如果要在其他活动中使用它,则必须在数据有效负载上定义click_action。因此,您可以在启动器活动中获得更多的意图。

修改:-

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

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

答案 1 :(得分:2)

所以我一直在寻找这个答案并阅读相同的内容。必须在某些地方。 我知道这已经一岁了,但是他们仍然没有真正弄清楚。 在与通知关联的endingActivity中(在我的情况下是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:谷物=碎屑
  • I / System.out:从= / topics / breakfast
  • I / System.out:牛奶= 1杯
  • I / System.out:sugar = none
  • I / System.out:google.message_id = 0:1585284914700957%f6ddf818f6ddf818
  • I / System.out:collapse_key = com.example.android.eggtimernotifications

数据键是谷物,牛奶和糖。

答案 2 :(得分:1)

根据文档Cloud messaging docs,消息可以三种状态发送:

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

背景处理:

对于2。onMessageReceived将在没有UI和其他处理的情况下被调用。稍后,您可以显示一些自定义内容。

当涉及到3时,android将显示通知并保留数据,直到有用户交互为止。单击后,它只是恢复您现有的活动。您的onNewIntent未启动,因为您的启动模式不是FLAG_ACTIVITY_SINGLE_TOP

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

答案 3 :(得分:0)

当应用程序在后台时,不会调用

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,则使用main活动。

启动意图后,您可以使用

getIntent().getExtras();

检索包含与通知消息一起发送的所有数据的Set。

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