web-dev-qa-db-ja.com

アプリがバックグラウンドにある場合、データが配信されるFCMインテントはどこにありますか?

アプリにFirebaseを実装し、追加のデータを含むプッシュを送信しています。アプリがフォアグラウンドにある場合、データを適切に処理して独自の通知を表示していますが、アプリが「ホーム」(強制終了されていない)のときにFirebaseが「自動的に」通知を表示すると、データの取得に問題があります。 [〜#〜] docs [〜#〜]Activityは新しいIntentを取得し、エクストラは私の値で満たされるはずです。代わりに、アプリは前に戻って古いものになります。状態が復元されます。

シナリオ:

  1. アプリを開き、ホームを押す
  2. firebaseコンソールを介してプッシュを送信すると、FirebaseはNotificationを呼び出さずにonMessageReceivedを作成します(ドキュメントの表によると、そうすべきですか?)
  3. ユーザーピック通知アプリが「ホーム」と同じ状態で前面に表示され、Intentが、上部のActivityを開くために使用される「元の」エクストラで満たされる場合

onCreateonNewIntentonResumeActivity)およびonMessageReceivedService)にのみログがあります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);
        }
    }
5
snachmsm

バックグラウンドとフォアグラウンドの両方で、通知とデータペイロードの両方を含むメッセージ。この場合、データペイロードは、ランチャーアクティビティの目的のエクストラに配信されます。他のアクティビティで取得する場合は、データペイロードでclick_actionを定義する必要があります。したがって、ランチャーアクティビティで意図を追加します。

編集:-

documentation から:-バックグラウンドの場合、アプリは通知トレイで通知ペイロードを受信し、ユーザーが通知をタップしたときにのみデータペイロードを処理します。

したがって、通知をクリックすると、ランチャーアクティビティのoncreate()メソッドとgetIntent()エクストラを確認してください。

3
Nainal

ドキュメントによると クラウドメッセージングドキュメント メッセージは3つの状態で配信できます:

  1. お知らせ
  2. データ
  3. 通知とデータ

バックグラウンド処理:

2の場合、onMessageReceivedはUIと追加の処理なしで呼び出されます。後で何かカスタムを表示できます。

3になると、Androidは通知を表示し、ユーザーの操作が行われるまでデータを保持します。クリックすると、既存のアクティビティが再開されます。起動のため、onNewIntentはトリガーされません。モードはFLAG_ACTIVITY_SINGLE_TOPではありません。

Logcatの出力でGoogle Play services out of dateも確認する必要があります。

1
3mpty

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 を参照してください。

0
Arsalan Khan

だから私はこの答えを探していて、同じものを読んだ。それはどこかにある必要があります。私はこれが1歳であることを知っていますが、彼らはまだそれを実際に明らかにしていません。通知に関連付けられたpendingActivity(私の場合はMainActivityでした)に、以下を追加しました。私はGoogleCodelabs 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 = high
  • I/System.out:google.sent_time = 1585284914411
  • I/System.out:google.ttl = 2419200
  • I/System.out:google.original_priority = high
  • I/System.out:シリアル=シュレッディ
  • I/System.out:from =/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

データキーは、牛乳と砂糖のシリアルでした。

0
Gary Robottom