web-dev-qa-db-ja.com

保留中のインテントに一意のエクストラを正しく渡すにはどうすればよいですか?

alarmManagerに問題があり、それに伴うエクストラの保留中のインテントがあります。

複数のアラームを設定すると、アラームは鳴りますが、余分なものは同じままです。

私はすでにこれらの質問を読みました:

そして私は試しました:

  • 保留中の各インテントに一意のIDを割り当て、
  • すべての保留中のインテントフラグを使用して、

すべて無駄に。なぜうまくいかないのか分かりません。

コードスニペットは次のとおりです。

Intent intent = new Intent(con,
                    AppointmentNotificationReciever.class);
            intent.putExtra("foo", bar.toString());


            int id = randomNum;

            PendingIntent sender = PendingIntent.getBroadcast(con, id,
                    intent, PendingIntent.FLAG_UPDATE_CURRENT);


            AlarmManager am = (AlarmManager) con.getSystemService(Context.ALARM_SERVICE);
            am.set(AlarmManager.RTC_WAKEUP, scheduleExecution, sender);
24
ninjasense

ここでおそらく2つの異なる問題:

1)以前にPendingIntentを作成したことがあり、それが既存のPendingIntentと「一致」する場合は、PendingIntent.FLAG_UPDATE_CURRENTフラグを指定する必要があります。そうしないと、エクストラが渡されません。 「一致」は、Intent.filterEquals()が使用する基準に基づいているため、必ずそこにあるドキュメントを読み、データ、アクション、タイプなどを理解していることを確認してください。

2)インテントにアクションを設定しないと、エクストラが伝播されないことを読みました。おそらくintent.setAction( "com.blah.Action")を試してください。

68
DustinB

私は同様の問題に遭遇しました。 PendingIntent.FLAG_ONE_SHOTを使用すると、PendingActivityが再利用されないため、問題が解決する場合があります。

12
Robbie Matthews

これは、Activity :: getIntentが、特定のインテントフラグ/フィルターを指定してアクティビティの元のインテントを返すことが原因である可能性があります。

その場合は、 Activity :: onNewIntent を確認する必要があります。そのメソッドをオーバーライドすると、その関数に渡されるインテントは、適切なエクストラなどを含む新しいインテントである必要があります。

クレジットはこれに行きますSO私の問題を解決するのに役立った質問: 検索可能なアクティビティのIntent.getAction()がnullなのはなぜですか?

2
brack