【问题标题】:How to abort BroadcastReceiver in android如何在android中中止BroadcastReceiver
【发布时间】:2012-12-26 19:00:39
【问题描述】:

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

}

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

【问题讨论】:

    标签: android broadcastreceiver android-pendingintent smsmanager


    【解决方案1】:

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

    AlarmManager 上致电cancel(),并使用与您用于设置计划的人等效的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);
    

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

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

    【讨论】:

    • 但是如果我想添加多个警报呢??
    • @DawoodAbbasi:为每个人使用不同的 ID(您的 234324243)。
    • 它的结构很容易,因此任何时候只有一个警报处于活动状态。尝试根据所需的交付时间对所有待处理的警报进行排序,然后只安排最近的一个。当警报响起时,查看您的列表(保留在数据库中?)并再次选择最近的一个。
    【解决方案2】:

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

    另见:

    1) How to get and cancel a PendingIntent?

    2)Stop pending intent

    3)Aborting/Cancelling Broadcasts

    【讨论】:

    • 我必须中止任何未决意图,而不仅仅是我在问题中提到的当前意图
    • 也许你应该保留对你所做的每一个新的待处理意图的引用,然后如果你发现你以后需要取消它,你可以遍历你的待处理意图并使用上面提到的取消方法。跨度>
    【解决方案3】:
    • public final void abortBroadcast ()

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

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

    【讨论】:

      【解决方案4】:

      如果您只是更改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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-01
        相关资源
        最近更新 更多