17

この質問を書いている間に解決しましたが、誰かに役立つ場合に備えて投稿してください:

の異なる値で、このような複数のアラームを設定していますid:

AlarmManager alarms = (AlarmManager)context.getSystemService(
        Context.ALARM_SERVICE);
Intent i = new Intent(MyReceiver.ACTION_ALARM);  // "com.example.ALARM"
i.putExtra(MyReceiver.EXTRA_ID, id);  // "com.example.ID", 2
PendingIntent p = PendingIntent.getBroadcast(context, 0, i, 0);
alarms.setRepeating(AlarmManager.RTC_WAKEUP, nextMillis, 300000, p);  // 5 mins

...そして、次のように受け取ります。

public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(ACTION_ALARM)) {
        // It's time to sound/show an alarm
        final long id = intent.getLongExtra(EXTRA_ID, -1);

アラームは適切なタイミングで受信機に配信されますが、多くEXTRA_IDの場合、間違った値に設定されています。これは、ある時点で使用した値であり、特定の時間に配信したかった値ではありません。

4

3 に答える 3

25

のドキュメントにPendingIntent.getBroadcast()は次のように書かれています:

戻り値

指定されたパラメーターに一致する既存または新規の PendingIntent を返します。

問題は、エクストラのみが異なる 2 つの Intent が、この目的には一致しているように見えることです。そのため、作成したばかりのインテントの周りに新しいものではなくgetBroadcast()、ランダムな古い PendingIntent (別の ) を返します。EXTRA_ID修正は、次のように、データ Uri を指定して ID と異なるようにすることです。

Intent i = new Intent(MyReceiver.ACTION_ALARM, Uri.parse("timer:"+id));

次に、次を使用して ID 番号を取得できます。

Long.parseLong(intent.getData().getSchemeSpecificPart());

...またはもちろん、余分なものも供給して、それを使用します。

于 2010-05-16T15:23:19.147 に答える
7

フラグを使用することもできますPendingIntent.FLAG_UPDATE_CURRENT

PendingIntent p = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

これもうまくいくはずです

于 2011-01-05T09:26:04.277 に答える
3

The solution for your problem is use Intent.FLAG_ACTIVITY_NEW_TASK

  p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
于 2012-01-13T11:21:40.387 に答える