Как прервать BroadcastReceiver в Android

Я делаю приложение для расписания SMS, которое просто берет время, смс и номер от пользователя и отправляет это смс в заданное время. Я использую PendingIntent. Вот мой пример кода.

Когда пользователь создает расписание, он просто вызывает этот метод.

private void SendMessages()
    {
        Intent intent = new Intent(this, SMSBroadcastReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                this.getApplicationContext(), 234324243, intent, 0);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, Timemilli, pendingIntent);
    }

А вот файл «SMSBroadcastReceiver.java»

public class SMSBroadcastReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Toast.makeText(context, "SMS Sent !!!!.", Toast.LENGTH_LONG)
                .show();
        // //Sms Sending

        try
        {
            SmsManager smsManager = SmsManager.getDefault();
            for (int i = 0; i < SMSScheduleContactsActivity.SelectedContacts.length; i++)
            {
                smsManager.sendTextMessage(
                        SMSScheduleContactsActivity.SelectedContacts[i], null,
                        AddNewSmsSchedule.Message, null, null);
            }

            Log.d("testllllllllllllllll", "Message Sent");
        }
        catch (Exception e)
        {   
            e.printStackTrace();
        }
    }

}

Мой вопрос: когда пользователь редактирует расписание, как я могу отменить эту трансляцию и отправить новую??? Поскольку может быть более одного расписания, как найти конкретное для изменения/отмены??


person Ahmad Abbasi    schedule 26.12.2012    source источник


Ответы (4)


когда пользователь редактирует расписание, как я могу отменить эту трансляцию и отправить новую?

Позвоните cancel() на AlarmManager с эквивалентом PendingIntent того, который вы использовали для настройки расписания:

Intent intent = new Intent(this, SMSBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 234324243, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

alarmManager.cancel(pendingIntent);

Поскольку может быть более одного расписания, как найти конкретное для изменения/отмены?

В вашей реализации есть только один сигнал тревоги.

person CommonsWare    schedule 07.01.2013
comment
но что, если я хочу добавить несколько будильников?? - person Dawood Ahmed; 08.01.2013
comment
@DawoodAbbasi: используйте разные идентификаторы для каждого (вашего 234324243). - person CommonsWare; 08.01.2013
comment
Его легко структурировать так, чтобы в каждый момент времени был активен только один будильник. Попробуйте отсортировать все ожидающие будильники на основе желаемого времени доставки, а затем просто запланируйте ближайший будильник. Когда сработает этот сигнал тревоги, просмотрите свой список (хранить в базе данных?) и снова выберите ближайший. - person Dan Devine; 13.01.2013

Если у вас есть ссылка на ожидающее намерение, вы можете отменить намерение. Если вы хотите прервать текущую трансляцию, вы можете использовать abortBroadcast .

Смотрите также:

1) Как получить и отменить PendingIntent?

2) Остановить ожидание намерения

3) Прерывание/отмена трансляций

person Ben Holland    schedule 26.12.2012
comment
я должен прервать любое ожидающее намерение, а не только текущее, как я уже упоминал в вопросе - person Ahmad Abbasi; 27.12.2012
comment
Возможно, вам следует сохранить ссылку на каждое новое ожидающее намерение, которое вы делаете, а затем, если вы обнаружите, что вам нужно отменить его позже, вы можете перебрать свои ожидающие намерения и использовать метод отмены, упомянутый выше. - person Ben Holland; 27.12.2012

  • public final void abortBroadcast ()

Добавлено в уровень API 1. Устанавливает флаг, указывающий, что этот приемник должен прервать текущую трансляцию; работает только с широковещательными рассылками, отправленными через Context.sendOrderedBroadcast. Это предотвратит прием вещания любыми другими приемниками вещания. Он по-прежнему будет вызывать onReceive(Context, Intent) BroadcastReceiver, который передал вызывающий объект Context.sendOrderedBroadcast.

Этот метод не работает с неупорядоченными широковещательными рассылками, такими как отправленные с помощью Context.sendBroadcast.

person Ramesh Sangili    schedule 09.01.2013

Если вы просто меняете Timemilli, вы можете снова вызвать свою функцию sendMessage().

alarmManager.set(AlarmManager.RTC_WAKEUP, Timemilli, pendingIntent);

Функция AlarmManager.set() автоматически отменит предыдущую тревогу, если значение pendingIntent остается тем же; это не обязательно должен быть один и тот же экземпляр, но он должен «соответствовать» в соответствии с Intent.filterEquals():

Из-за такого поведения важно знать, когда два Intent считаются одинаковыми для получения PendingIntent. Распространенной ошибкой людей является создание нескольких объектов PendingIntent с намерениями, которые различаются только своим «дополнительным» содержимым, ожидая каждый раз получать разные PendingIntent. Этого не происходит. Части намерения, которые используются для сопоставления, — это те же части, которые определены в Intent.filterEquals. Если вы используете два объекта Intent, которые эквивалентны Intent.filterEquals, вы получите один и тот же PendingIntent для обоих из них.

http://developer.android.com/reference/android/app/AlarmManager.html#set(int, long, android.app.PendingIntent)

http://developer.android.com/reference/android/app/PendingIntent.html http://developer.android.com/reference/android/content/Intent.html#filterEquals(android.content.Intent)

person CodeShane    schedule 10.01.2013