如何在android中中止BroadcastReceiver

时间:2012-12-26 19:00:39

标签: android broadcastreceiver android-pendingintent smsmanager

我正在制作一个短信计划应用程序,它只需要用户的时间,短信和号码,并在给定时间发送短信。我正在使用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();
        }
    }

}

我的问题是:当用户编辑时间表时,如何取消该广播并发送新广播?由于可以有多个时间表,如何找到更改/中止的特殊情况?

4 个答案:

答案 0 :(得分:10)

  

当用户编辑时间表时,如何取消该广播并发送新广播?

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);

{{1}}
  

由于可以有多个时间表,如何找到更改/中止的特定时间?

您的实施中只有一个警报。

答案 1 :(得分:6)

如果你有对待处理意图的引用,那么你可以cancel意图。如果要中止当前广播,可以使用abortBroadcast

另见:

1)How to get and cancel a PendingIntent?

2)Stop pending intent

3)Aborting/Cancelling Broadcasts

答案 2 :(得分:0)

  • public final void abortBroadcast()

在API级别1中添加 设置指示此接收器应中止当前广播的标志;仅适用于通过Context.sendOrderedBroadcast发送的广播。这将阻止任何其他广播接收器接收广播。它仍将调用Context.sendOrderedBroadcast的调用者传入的BroadcastReceiver的onReceive(Context,Intent)。

此方法不适用于非有序广播,例如使用Context.sendBroadcast发送的广播

答案 3 :(得分:0)

如果您只是更改Timemilli,则可以再次致电sendMessage()功能。

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

只要pendingIntent相同,AlarmManager.set()函数就会自动取消上一个警报;它不必是同一个实例,但需要根据Intent.filterEquals()进行“匹配”:

  

由于这种行为,为了检索PendingIntent,重要的是要知道两个Intent何时被认为是相同的。人们常犯的一个错误是使用Intents创建多个PendingIntent对象,这些对象只在其“额外”内容中有所不同,期望每次都获得不同的PendingIntent。这不会发生。用于匹配的Intent部分与Intent.filterEquals定义的部分相同。如果你使用两个与Intent.filterEquals相同的Intent对象,那么你将获得两个相同的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)