android - 繰り返し - pendingintent 使い方




AlarmManager.setRepeatingを複数回呼び出すと、同じIntent/PendingIntentの余分な値が返されますが、別の値を指定しました (2)

この質問を書いている間に解決されましたが、

私は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が誤った値に設定されていることがよくあります。これは、ある時点で使用した値です。特定の時刻に配信したい値ではありません。


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

返品

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

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

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

ID番号を取得するには、次のようにします。

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

...またはもちろん余分に供給し、それを使用してください。


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

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

これも仕事でなければならない







alarms