Firebaseを使用してアプリに通知を送信しています。各デバイスで受信した通知をローカルデータベースに保存したい。問題は、アプリがバックグラウンドにあり、通知が受信されたときに、onMessageReceived()
メソッドが呼び出されず、ドキュメントに従ってシステムトレイに通知が追加されることです。ドキュメントには、アプリがバックグラウンドであるときに通知を受信するための次のことも記載されています。
これらの場合、通知はデバイスのシステムトレイに配信され、データペイロードはランチャーアクティビティのインテントのエクストラで配信されます。
そのため、インテントのエクストラにアクセスしようとすると、通知のキーが見つかりません。 MainActivity.Java
の私のコード:
if (getIntent().getExtras() != null) {
for (String key : getIntent().getExtras().keySet()) {
Object value = getIntent().getExtras().get(key);
Toast.makeText(this, "Key: " + key + " Value: " + value, Toast.LENGTH_LONG).show();
}
}
サーバーから送信する通知:
{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
"icon" : "myicon"
}
}
誰かが通知内の値を取得する方法を知っていますか?
これは意図された動作です( documentation で確認したとおり)。 notification
-onlyメッセージペイロード(現在)を使用している場合、onMessageReceived()
は、アプリがforeground、そうでない場合は、システムトレイが受信します。
(強調=)で参照されているdata
:
これらの場合、通知はデバイスのシステムトレイに配信され、dataペイロードはランチャーアクティビティのインテントのエクストラで配信されます。
はdata
メッセージペイロードです( メッセージタイプ を参照)。
notification
とdata
の両方を含むペイロードを送信する必要があります。そのようです:
{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
"icon" : "myicon"
},
"data": {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
"icon" : "myicon"
}
}
私の答えはこちら も参照してください。
あなたがしなければならないすべてはあなたの通知プッシュフォーマットを更新することです。
から:
{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
"icon" : "myicon"
}
}
に
{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
"icon" : "myicon"
}
}
説明:
すべてのアプリで機能し、「通知」タグが含まれている場合はすべてのプッシュ通知を処理する、firebaseサービスがシステムによって実行されています。 "data"タグが含まれている場合は、タスクをアプリによって作成されたサービスに引き渡すだけで、何でも実行できます。この場合、show user通知し、それをローカルデータベースに保存します。詳細については、こちら Documentation:Handle Messages を参照してください。
これは単純な解決策ではありませんが、 NotificationListenerService を使用して、通知ごとにコールバックを受け取ることができます。さらなる制限は、API 18以上のみをサポートすることです。
これをマニフェストファイルに追加
<intent-filter>
<action Android:name=".MainActivity" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>