8

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

4 回答 4

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

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

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

于 2013-01-07T15:43:58.257 回答
6

如果您有对待处理 Intent 的引用,那么您可以取消该 Intent。如果要中止当前广播,可以使用abortBroadcast

也可以看看:

1)如何获取和取消 PendingIntent?

2)停止未决意图

3)中止/取消广播

于 2012-12-26T19:12:00.080 回答
0
  • public final void abortBroadcast()

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

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

于 2013-01-09T21:44:42.130 回答
0

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

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

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

由于这种行为,重要的是要知道两个 Intent 何时被认为是相同的,以便检索 PendingIntent。人们犯的一个常见错误是创建多个 PendingIntent 对象,其 Intent 仅在其“额外”内容上有所不同,期望每次都获得不同的 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)

于 2013-01-10T02:37:26.877 回答