Подтвердить что ты не робот

Отменить оповещение в AlarmManager в другом ожидающем ожидании

Я хочу отменить AlarmManager, который определяет услугу, в этой службе может быть запущен новый AlarmManger или отменить аварийный сигнал, который был определен ранее. И я знаю, что params pendingintent в alarmManager.cancel(PendingIntent) должен быть одинаковым с параметром filterEquals ( Намерение другое) но он все еще не работает .cancel не удалось. вот мой код

public class GetRoundStroe {
    private Store[] stores;
    private Context mContext;

    public GetRoundStroe(Context mContext) {
        this.mContext = mContext;
    }

    public Store[] getStores() {
        if (ComCommand.haveInternet(mContext)) {
            start_am_normal();
        } else {
            start_am_silence();
        }
        return stores;
    }

    public Store[] start_am_silence() {


        long firstTime = SystemClock.elapsedRealtime();

        AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);

        if (AlarmHolder.mAlarmNormal != null) {
            am.cancel(AlarmHolder.mAlarmNormal);

        }

        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                firstTime, TestSwitch.getInstance().getSilence_time(), AlarmHolder.mAlarmSilence);


        return null;


    }

    public Store[] start_am_normal() {


        long firstTime = SystemClock.elapsedRealtime();

        AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);

        if (AlarmHolder.mAlarmSilence != null) {
            MyLog.e(GetRoundStroe.class,"AlarmHolder.mAlarmSilence"+AlarmHolder.mAlarmSilence+"");
            am.cancel(AlarmHolder.mAlarmSilence);
        }
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                firstTime, TestSwitch.getInstance().getNormal_time(), AlarmHolder.mAlarmNormal);

        return null;
    }

    private static final class AlarmHolder {
        static final PendingIntent mAlarmSilence = PendingIntent.getService(ApplicationContext.getInstance(),
                0,
                new Intent(ApplicationContext.getInstance(), GetRoundSilenceService.class),
                0);

        static final PendingIntent mAlarmNormal = PendingIntent.getService(ApplicationContext.getInstance(),
                0, new
                Intent(ApplicationContext.getInstance(), GetRoundNormalService.class),
                0);

    }
}

GetRoundSilenceService и GerRoundNormalService вызывают start_am_normal() или start_am_silence; Кто-нибудь может мне помочь? спасибо

4b9b3361

Ответ 1

   myIntent = new Intent(SetActivity.this, AlarmActivity.class);
   pendingIntent = PendingIntent.getActivity(CellManageAddShowActivity.this,
       id, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
   pendingIntent.cancel();
   alarmManager.cancel(pendingIntent);

Эти строки кода, безусловно, могут помочь вам удалить/отменить ожидающие намерения и сигнал тревоги.

Главное, что вам нужно:

  • Создайте ожидающее намерение с тем же идентификатором и соответствующим FLAG-планированием.
  • Отмените это ожидающее намерение.
  • Отмените будильник с помощью диспетчера аварийных сигналов.

Ответ 2

@MKJParekh ответ правильный, однако я хотел бы добавить дополнительную информацию, чтобы мы все знали, что будет работать, а что - нет.

Давайте скажем, что на activityA вы создаете и устанавливаете AlarmManager для открытия ActivityC через 30 секунд, а затем для некоторых других действий, которые могут быть любыми, мы хотим отменить этот AlarmManager. Таким образом, мы будем делать следующее:

в activityA мы создаем и устанавливаем AlarmManager;

//activityA
Intent myIntentA = new Intent(actvityA.this, activityB.class)
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent myPendingIntent = PendingIntent.getActivity(activityA.this, 0, myIntentA, PendingIntent.FLAG_ONE_SHOT);

//Calendar with the time we want to fire the Alarm
Calendar calendar = Calendar.getInstance();   // Get Current Time
calendar.add(Calendar.SECOND,30);      //Fire Alarm in 30 seconds from Now.                  

((AlarmManager)getSystemService(ALARM_SERVICE)).setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), myPendingIntent);

в другой операции через некоторое время мы хотим отменить такой AlarmManager, созданный в activityA, к которому у нас нет доступа. Позволяет называть эту текущую активность активности Z;

//activityZ
Intent myIntentZ = new Intent(activityZ.this, activityB.class);
PendingIntent pendingIntentZ = PendingIntent.getActivity(activityZ.this, 0, myIntentZ, PendingIntent.FLAG_ONE_SHOT);

((AlarmManager)getSystemService(ALARM_SERVICE)).cancel(pendingIntentZ);

Некоторые важные моменты,

Контекст, который мы предоставляем в activityA в new Intent(context) и getActivity(context), одинаковый, однако им не нужно сопоставлять действие, из которого мы отменяем AlarmManager, в этом случае activityZ имеет другой контекст.

Класс, который мы хотим открыть с помощью AlarmManager, должен быть одинаковым в обоих действиях new Intent (context, activityB.class), requestCode, который является int, должен быть одинаковым, я использовал 0 для этого примера. Наконец, флаг должен быть одним и тем же в обоих действиях PendingIntent.FLAG_ONE_SHOT.

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); был использован, потому что PendingIntent.getActivity требует его, если мы начинаем действие за пределами контекста существующего действия.