如何在安卓系统中终止广播接收器?

9

我正在制作一款短信定时应用程序,它将简单地从用户那里获取时间、短信内容和号码,并在指定时间发送该短信。我正在使用 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个回答

10
当用户编辑日程安排时,我该如何取消已安排的广播并发送新的广播?
使用与设置日程时相同的PendingIntent调用AlarmManagercancel()方法。
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
但是如果我想添加多个闹钟怎么办? - Dawood Ahmed
4
为每个(你的“234324243”)使用不同的ID。 - CommonsWare
1
很容易对其进行结构化,以便任何时候只有一个闹钟处于活动状态。尝试根据期望的交付时间对所有未决闹钟进行排序,然后只需安排最近的闹钟。当该闹钟响起时,查看您的列表(保留在数据库中?)并再次选择最近的一个。 - Dan Devine

6

我必须中止任何挂起的意图,不仅仅是当前问题中提到的。 - Ahmad Abbasi
也许你应该保留每个新挂起意图的引用,这样如果你发现以后需要取消它,就可以遍历你的挂起意图并使用上面提到的取消方法。 - Ben Holland

0

如果你只是改变了Timemilli,你可以再次调用你的sendMessage()函数。

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

AlarmManager.set()函数会自动取消先前的闹钟,只要pendingIntent相同即可;它不必是同一个实例,但需要根据Intent.filterEquals()进行匹配:

由于这种行为,了解两个意图在检索PendingIntent时被视为相同非常重要。人们经常犯的一个错误是使用仅在其“额外”内容上有所不同的意图创建多个PendingIntent对象,期望每次都获得不同的PendingIntent。这是不会发生的。用于匹配的Intent部分是由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)


0
  • public final void abortBroadcast ()

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接