背景:
AlarmManagerを介してアラームにPendingIntentを使用しています。
問題:
最初は、以前のものをキャンセルするために、アラームを開始する前に使用した正確なrequestCodeを提供する必要があると考えました。
しかし、 cancellation API が言うように、私は間違っていることがわかりました:
一致するインテントを持つアラームを削除します。 (filterEquals(Intent)で定義されているように)Intentがこのアラームに一致するあらゆるタイプのアラームはキャンセルされます。
「 filterEquals 」を見ると、ドキュメントには次のように記載されています。
インテント解決(フィルタリング)の目的で2つのインテントが同じかどうかを判断します。つまり、アクション、データ、タイプ、クラス、およびカテゴリが同じ場合。これは、インテントに含まれる余分なデータを比較しません。
だから私は「requestCode」が何のためにあるのか分からない...
質問:
「requestCode」は何に使用されますか?
同じ「requestCode」で複数のアラームを作成した場合はどうなりますか?それらは互いにオーバーライドしますか?
requestCode
は、後で(キャンセルなどのために)同じ保留中のインテントインスタンスを取得するために使用されます。@Minhaj Arfinの回答に追加したいだけです
1-requestCodeは、後で同じ保留中のインテントを取得するために使用されます(キャンセルなどのため)
2-はい、PendingIntentで指定したIntentに同じReceiverを指定している限り、オーバーライドされます
例:
Intent startIntent1 = new Intent(context, AlarmReceiverFirst.class);
PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 0, startIntent1, 0);
Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);
上記の例から、それらはしません互いにオーバーライドします受信機が異なるため(AlarmReceiverFirstとAlarmReceiverSecond)
Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);
Intent startIntent3 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent3 = PendingIntent.getBroadcast(context, 0, startIntent3, 0);
上記の例から、それらはwill互いにオーバーライドし、レシーバが同じであるため(AlarmReceiverSecond)
私の場合、2つの異なるインテントで同じアクティビティを開きたいので、トレイに2つ以上のFCMSがある場合、そのうちの1つは他のFCMSのみを開き、そうしないと、保留中のインテントのリクエストコードを変更し、それが機能しました。
PendingIntent pendingIntent =
PendingIntent.getActivity(this, **Some unique id for all GCMS** /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
requestCode
について重要なことの1つは、ウィジェットを使用するとき、アプリに深刻な問題を引き起こすことです。ウィジェットは、requestCode
が同じ場合、電話の再起動後に機能しません。つまり、ウィジェットのpendingIndent
に設定するremoteViews
には、一意のrequestCode(通常は数字に付随するwidgetId)を設定する必要があります。