Android 在收到sms时取消注册广播接收器

Android 在收到sms时取消注册广播接收器,android,Android,即使我使用abortBroadcast(),广播接收器截获的短信仍将发送到我的收件箱。只有在使用unRegisterReceiver()时,才会出现此问题。如果我不注销,abortBroadcast可以正常工作。有没有关于如何中止然后成功注销的想法?代码如下: 在我的主要活动中,我声明了一个广播接收器对象: SmsReceiver BR_smsreceiver = null; 然后,我注册广播接收器并从主活动中的一个函数内发送SMS: public Boolean sendVerificati

即使我使用abortBroadcast(),广播接收器截获的短信仍将发送到我的收件箱。只有在使用unRegisterReceiver()时,才会出现此问题。如果我不注销,abortBroadcast可以正常工作。有没有关于如何中止然后成功注销的想法?代码如下:

在我的主要活动中,我声明了一个广播接收器对象:

SmsReceiver BR_smsreceiver = null;
然后,我注册广播接收器并从主活动中的一个函数内发送SMS:

public Boolean sendVerificationSms(String number) {
BR_smsreceiver = null;
BR_smsreceiver = new SmsReceiver();
BR_smsreceiver.setMainActivityHandler(this);
IntentFilter fltr_smsreceived = new IntentFilter(
        "android.provider.Telephony.SMS_RECEIVED");
registerReceiver(BR_smsreceiver, fltr_smsreceived);

SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(number, null, "hi", null, null);
}
public class SmsReceiver extends BroadcastReceiver {

    MainActivity main = null;

    void setMainActivityHandler(MainActivity main){
        this.main=main;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle pdusBundle = intent.getExtras();
        Object[] pdus=(Object[])pdusBundle.get("pdus");
        SmsMessage messages=SmsMessage.createFromPdu((byte[]) pdus[0]);
        if(messages.getMessageBody().contains("hi")){
            abortBroadcast();
            main.verifyPhoneNumber("hi");

        }

    }
}
广播接收器截获SMS并调用主活动中的函数:

public Boolean sendVerificationSms(String number) {
BR_smsreceiver = null;
BR_smsreceiver = new SmsReceiver();
BR_smsreceiver.setMainActivityHandler(this);
IntentFilter fltr_smsreceived = new IntentFilter(
        "android.provider.Telephony.SMS_RECEIVED");
registerReceiver(BR_smsreceiver, fltr_smsreceived);

SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(number, null, "hi", null, null);
}
public class SmsReceiver extends BroadcastReceiver {

    MainActivity main = null;

    void setMainActivityHandler(MainActivity main){
        this.main=main;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle pdusBundle = intent.getExtras();
        Object[] pdus=(Object[])pdusBundle.get("pdus");
        SmsMessage messages=SmsMessage.createFromPdu((byte[]) pdus[0]);
        if(messages.getMessageBody().contains("hi")){
            abortBroadcast();
            main.verifyPhoneNumber("hi");

        }

    }
}
该函数注销广播接收器并执行一些处理:

public void verifyPhoneNumber(String number) {
        unregisterReceiver(BR_smsreceiver);
        ...
}

一个有效的解决方案是使用延迟(即使0毫秒也有效!)取消注册:

new Handler().postDelayed(new Runnable(){
            public void run(){
                unregisterReceiver(BR_smsreceiver);
            }
        },0);

这不符合我的目的,因为我需要在触发广播接收器后注销它,而不是在应用程序暂停后。