アプリにFirebaseを実装し、追加のデータを含むプッシュを送信しています。アプリがフォアグラウンドにある場合、データを適切に処理して独自の通知を表示していますが、アプリが「ホーム」(強制終了されていない)のときにFirebaseが「自動的に」通知を表示すると、データの取得に問題があります。 [〜#〜] docs [〜#〜]Activity
は新しいIntent
を取得し、エクストラは私の値で満たされるはずです。代わりに、アプリは前に戻って古いものになります。状態が復元されます。
シナリオ:
Notification
を呼び出さずにonMessageReceived
を作成します(ドキュメントの表によると、そうすべきですか?)Intent
が、上部のActivity
を開くために使用される「元の」エクストラで満たされる場合onCreate
、onNewIntent
、onResume
(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を定義する必要があります。したがって、ランチャーアクティビティで意図を追加します。
編集:-
documentation から:-バックグラウンドの場合、アプリは通知トレイで通知ペイロードを受信し、ユーザーが通知をタップしたときにのみデータペイロードを処理します。
したがって、通知をクリックすると、ランチャーアクティビティのoncreate()メソッドとgetIntent()エクストラを確認してください。
ドキュメントによると クラウドメッセージングドキュメント メッセージは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();
通知メッセージとともに送信されるデータを含むセットを取得します。
通知メッセージの詳細については、 https://firebase.google.com/docs/cloud-messaging/Android/receive#sample-receive を参照してください。
だから私はこの答えを探していて、同じものを読んだ。それはどこかにある必要があります。私はこれが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")
}
}
}
}
}
その結果、次のようになりました。
データキーは、牛乳と砂糖のシリアルでした。