Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中中止BroadcastReceiver_Android_Broadcastreceiver_Android Pendingintent_Smsmanager - Fatal编程技术网

如何在android中中止BroadcastReceiver

如何在android中中止BroadcastReceiver,android,broadcastreceiver,android-pendingintent,smsmanager,Android,Broadcastreceiver,Android Pendingintent,Smsmanager,我正在做一个短信时间表应用程序,它将只需要从用户的时间,短信和号码,并在给定的时间发送这条短信。我正在使用pendingent。这是我的示例代码 当用户创建计划时,它只调用此方法 private void SendMessages() { Intent intent = new Intent(this, SMSBroadcastReceiver.class); PendingIntent pendingIntent = PendingIntent.getB

我正在做一个短信时间表应用程序,它将只需要从用户的时间,短信和号码,并在给定的时间发送这条短信。我正在使用
pendingent
。这是我的示例代码

当用户创建计划时,它只调用此方法

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

}
公共类SMSBroadcastReceiver扩展广播接收器
{
@凌驾
公共void onReceive(上下文、意图)
{
Toast.makeText(上下文,“SMS已发送!!”,Toast.LENGTH\u LONG)
.show();
////短信发送
尝试
{
SmsManager SmsManager=smsmsmanager.getDefault();
对于(int i=0;i

我的问题是:当用户编辑日程安排时,我如何取消该广播并发送新的广播???由于可能有多个计划,如何找到要更改/中止的特定计划???

如果您有一个对挂起的意图的引用,那么您可以更改该意图。如果要中止当前广播,可以使用

另见:

(一)

(二)

(三)

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

AlarmManager
上调用
cancel()
,使用与您用于设置计划的
pendingEvent
等效的

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

alarmManager.cancel(pendingIntent);
由于可能有多个计划,如何找到要更改/中止的特定计划

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

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


此方法不适用于非有序广播,例如使用Context.sendBroadcast发送的广播。如果您只是更改
Timemilli
,则可以再次调用
sendMessage()
函数

alarmManager.set(AlarmManager.RTC_WAKEUP, Timemilli, pendingIntent);
只要PendingEvent相同,AlarmManager.set()函数将自动取消上一个报警;它不必是相同的实例,但需要根据意图进行“匹配”。filterEquals():

由于这种行为,为了检索PendingEvent,了解两个意图何时被认为是相同的非常重要。人们常犯的一个错误是创建多个PendingEvent对象,其意图仅在“额外”内容上有所不同,期望每次都获得不同的PendingEvent。这种情况不会发生。用于匹配的Intent部分与Intent.filterEquals定义的部分相同。如果根据Intent.filterEquals使用两个等效的Intent对象,则两个对象将获得相同的PendingIntent

,long,android.app.pendingent)


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

我必须中止任何挂起的意图,而不仅仅是我在问题中提到的当前意图。也许你应该保留对你所做的每个新挂起意图的引用,然后如果你发现以后需要取消它,您可以迭代您的挂起意图并使用上述取消方法。但是,如果我要添加多个报警,该怎么办???@Dawoodabasi:为每个报警使用不同的ID(您的
2343243
)。很容易对其进行组织,以便在任何时候只有一个报警处于活动状态。请尝试根据所需的传递时间对所有挂起报警进行排序,那就安排最近的一个吧。当警报响起时,查看您的列表(是否保留在数据库中?)并再次选择最近的一个。