簡體   English   中英

當應用程序處於后台時,FCM Intent 與數據交付在哪里?

[英]Where is FCM Intent with data delivered, when app is in background?

我已經在我的應用程序中實施了 Firebase,並且正在發送帶有額外數據的推送。 當我的應用程序處於前台時,我正在正確處理數據並顯示我自己的通知,但是當 Firebase 在應用程序“歸巢”(未終止)時“自動”顯示通知時,我在獲取數據時遇到了問題。 根據DOCSActivity應該獲得新的Intent ,並用我的價值觀實現額外的功能,而不是應用程序回到前面,恢復舊狀態。

設想:

  1. 打開應用程序,按主頁
  2. 通過 Firebase 控制台發送推送,Firebase 正在創建Notification而不調用onMessageReceived (根據文檔中的表,它應該?)
  3. 當用戶選擇通知應用程序將以與“主頁”相同的狀態被帶到前面時,並且Intent被用於在頂部打開Activity的“原始”附加功能實現

我在onCreateonNewIntentonResume ( 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);
        }
    }

具有通知和數據負載的消息,包括背景和前景。 在這種情況下,數據有效負載被傳送到您的啟動器活動的意圖的額外部分。 如果您想在其他活動中獲取它,則必須在數據負載上定義 click_action。 因此,在您的啟動器活動中獲得額外的意圖。

編輯:-

文檔中:- 在后台時,應用程序在通知托盤中接收通知有效負載,並且僅在用戶點擊通知時處理數據有效負載。

因此,在單擊通知時使用 getIntent() extras 檢查啟動器活動的 oncreate() 方法。

所以我一直在尋找這個答案並閱讀相同的內容。 它必須在某個地方。 我知道這是一歲了,但他們還沒有真正說清楚。 在與通知關聯的 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 = 高
  • 我/System.out: google.sent_time = 1585284914411
  • 我/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 = 無
  • 我/System.out: google.message_id = 0:1585284914700957%f6ddf818f6ddf818
  • I/System.out: collapse_key = com.example.android.eggtimernotifications

數據鍵是谷物、牛奶和糖。

根據文檔Cloud messaging docs消息可以以 3 種狀態傳遞:

  1. 通知
  2. 數據
  3. 通知和數據

后台處理:

對於 2. onMessageReceived將在沒有 UI 和額外處理的情況下被調用。 稍后你可以展示一些定制的東西。

當涉及到3時,android會顯示通知並保持數據,直到有用戶交互。 單擊后,它只是恢復您現有的活動。 您的onNewIntent未被觸發,因為您的啟動模式不是FLAG_ACTIVITY_SINGLE_TOP

您還應該檢查您的 logcat 輸出: Google Play services out of date

應用程序在后台時不會調用 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();

檢索一個 Set,其中包含隨通知消息一起發送的任何數據。

有關通知消息的更多信息,請參閱https://firebase.google.com/docs/cloud-messaging/android/receive#sample-receive

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM