1

Я тревога, созданной в OnBootReceiver так:Отменить сигнал тревогу с другим контекстом

public class OnBootReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
      Calendar cal = Calendar.getInstance(); 
      cal.add(Calendar.SECOND, 10); 

      Intent i = new Intent(context, AlarmReceiver.class); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); 

      AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), savedIntervalAutomaticMilisInt, pendingIntent); 
    } 
} 

Но отменить его, я использую этот код в деятельности:

Intent intent = new Intent(this, AlarmReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
alarmManager.cancel(pendingIntent); 
scManager.clearErrors(); 

Так, чтобы установить это я использую контекст из параметра Context BroadcastReceiver, но для его отмены я использую контекст this из Activity. Мой вопрос: будет ли будильник еще отменен, хотя контекст немного отличается?

ответ

6

Будет ли сигнал еще быть отменен, даже если контекст немного отличается?

Контекст в данном случае не имеет значения - это всего лишь способ добраться до AlarmManager.

Ваш выбор PendingIntent.FLAG_CANCEL_CURRENT в вашей логике отмены-тревоги может вызвать проблему. Если вы столкнулись с трудностями (например, adb shell dumpsys alarm указывает на то, что ваша тревога сохранилась с отменой), попробуйте заменить PendingIntent.FLAG_CANCEL_CURRENT на 0.

+0

Хорошо, спасибо, но почему это может вызвать проблему? – Xander

+0

@Merlin: 'FLAG_CANCEL_CURRENT' говорит« nuke предыдущий экземпляр «PendingIntent» с орбиты ». Независимо от того, какая структура данных, используемая Android для хранения сигналов тревоги, может быть задана командой «PendingIntent» и может полагаться на экземпляры «PendingIntent» одинаковыми, основываясь на нормальной конструкции «PendingIntent». IOW, не бросайте флаги волей-неволей - используйте только FLAG_CANCEL_CURRENT, когда вы точно знаете, зачем вам это нужно в конкретной ситуации. – CommonsWare

+0

Я использую флаг, потому что, когда я воссоздаю сигнал тревоги в OnBootReceiver, и по какой-то причине будильник не был отменен, когда телефон загрузился, я не делаю будильник дважды. – Xander

1

Дайте это попробовать для глобального (приложения ширины) объекта контекста: android.content.ContextWrapper.getApplicationContext()

+0

Возможно, это не такая плохая идея, чтобы использовать эту. Благодаря! Однако на самом деле он не отвечает на вопрос – Xander

Смежные вопросы