Как внести изменения в будильник AlarmManager? - PullRequest
1 голос
/ 10 июня 2011

Я использую AlarmManager в своем приложении для установки будильника в подходящее время.В моем приложении несколько сигналов тревоги, поэтому каждый раз, когда пользователь сохраняет сигнал тревоги, я нахожу, какой сигнал тревоги должен быть воспроизведен в следующий раз, и передаю идентификатор этого сигнала тревоги как дополнительное намерение.Вот код, который я использую для этого:

Intent intent = new Intent(this, AlarmBroadcastReceiver.class);
intent.putExtra("alrmId", finalAlr);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 56, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
alarmManager.cancel(pendingIntent);
alarmManager.set(AlarmManager.RTC_WAKEUP, (System.currentTimeMillis() + (finalAlrDay * 24 * 60 * 60 * 1000) + (finalAlrHr * 60 * 60 * 1000) + (finalAlrMin * 60 * 1000) + (finalAlrSec * 1000)), pendingIntent);

Здесь я отменяю, если есть какой-либо старый набор тревог, а затем добавляю новый.Все аварийные сигналы воспроизводятся в нужное время, но проблема в том, что значение alrmId, которое я установил в intent.putExtra, всегда остается таким же, как при первом его настройке.

Например, если яУстановите будильник в первый раз, и в это время значение alrmId будет установлено равным «1», тогда оно всегда останется неизменным независимо от того, какое значение я введу после этого.Я попытался отладить его и убедился, что intent.putExtra("alrmId", finalAlr) задает правильное значение, так что это не проблема.В чем проблема?

Ответы [ 2 ]

4 голосов
/ 10 июня 2011

Используйте FLAG_UPDATE_CURRENT при создании PendingIntent.

0 голосов
/ 11 января 2017

Вы также можете использовать:

final PendingIntent pendingIntent = PendingIntent.getService(
    contextWeakReference.get(),
    0,
    notificationIntent,
    PendingIntent.FLAG_CANCEL_CURRENT
);

Как сказано в документации:

   /**
     * Flag indicating that if the described PendingIntent already exists,
     * the current one should be canceled before generating a new one.
     * For use with {@link #getActivity}, {@link #getBroadcast}, and
     * {@link #getService}. <p>You can use
     * this to retrieve a new PendingIntent when you are only changing the
     * extra data in the Intent; by canceling the previous pending intent,
     * this ensures that only entities given the new data will be able to
     * launch it.  If this assurance is not an issue, consider
     * {@link #FLAG_UPDATE_CURRENT}.
     */
    public static final int FLAG_CANCEL_CURRENT = 1<<28;


    /**
     * Flag indicating that if the described PendingIntent already exists,
     * then keep it but replace its extra data with what is in this new
     * Intent. For use with {@link #getActivity}, {@link #getBroadcast}, and
     * {@link #getService}. <p>This can be used if you are creating intents where only the
     * extras change, and don't care that any entities that received your
     * previous PendingIntent will be able to launch it with your new
     * extras even if they are not explicitly given to it.
     */
    public static final int FLAG_UPDATE_CURRENT = 1<<27;
...