也就是说,我有这个我动态创建的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但无法取消注册。
答案 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;
}
}