是否可以取消注册'动态' BroadcastReceiver来自接收者自己的onReceive()方法?

时间:2015-06-11 14:11:27

标签: android android-intent android-broadcast

也就是说,我有这个我动态创建的BroadcastReceiver来监听一个广播,之后我希望它取消注册。

我还没有发现任何样本代码以这种方式执行,但我也没有在Android在线文档中找到任何禁止此操作的规则。但是我不能让它像活动一样长期存在,而且无论如何它都在匿名类中,因此包含类甚至不知道变量名。

也就是说,代码看起来像这样:

myInfoReceiver = new BroadcastReceiver() {
onReceive(Context ctx, Intent intt) {
    // do some Notification when I get here
    nm.notify("I got here") // obvious pseudo code
    ctx.unregisterReceiver(myInfoReceiver);
} // end onReceive
ctx.registerReceiver),uInfoReceiver, new IntentFilter(...));
}; // end BroadcastReceiver

但是当我运行这个时,Android会在调用取消注册时抱怨,坚持说接收器不在那里取消注册(我忘记了确切的措辞,但它抛出了IllegalArgumentException)。

我还尝试修改代码,以检查“' intt”中的操作。与预期相同 - 但它仍然执行onReceive但无法取消注册。

3 个答案:

答案 0 :(得分:6)

你的问题的答案是“是”。然而...

...您需要在您呼叫unregisterReceiver()的同一Context上致电registerReceiver()。在您发布的代码中,您在unregisterReceiver()上调用Context作为onReceive()的参数传入。这与Context不一样,这就是你获得例外的原因。

答案 1 :(得分:1)

我只想说“是”,完全没问题。

我将它用于一次性位置修复,例如,也可以在其他逻辑中使用,而我没有看到任何问题。

另外,我已经多次见过它了。

答案 2 :(得分:0)

我尝试了各种解决方案,最后我这样做:

注册:

MyApplication.getInstance().getApplicationContext().registerReceiver(sentReceiver, new IntentFilter(SENT));

SentReceiver:

public class SentReceiver extends BroadcastReceiver  {
    public void onReceive(Context context, Intent arg1) {
        switch (getResultCode()) {
            case Activity.RESULT_OK:
                Toast.makeText(context,
                        context.getString(R.string.sms_envoye), Toast.LENGTH_SHORT)
                        .show();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Toast.makeText(context,
                        context.getString(R.string.sms_defaillance_generique),
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Toast.makeText(context,
                        context.getString(R.string.sms_pas_de_service),
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                Toast.makeText(context,
                        context.getString(R.string.sms_pas_de_pdu),
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                Toast.makeText(context,
                        context.getString(R.string.sms_radio_desactivee),
                        Toast.LENGTH_SHORT).show();
                break;
        }
        MyApplication.getInstance().getApplicationContext().unregisterReceiver(this);
    }

使用MyApplication:

public class MyApplication extends Application {
    private static MyApplication mInstance;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public static synchronized MyApplication getInstance() {
        return mInstance;
    }        
}