[英]Dynamically registering BroadcastReceiver - Receiver not registered
I've a problem with dynamically registering BroacasrReceiver CallReceiver
. 我在动态注册BroacasrReceiver CallReceiver
遇到问题。 When onReceive
method of CallReceiver
is trigerred the fatal exception is thrown. CallReceiver
CallReceiver的onReceive
方法时,将引发致命异常。
...
private boolean isCRRegistered = false;
public int onStartCommand (Intent intent, int flags, int startId) {
if(!isCRRegistered) {
IntentFilter filter2 = new IntentFilter("android.intent.action.PHONE_STATE");
CallReceiver mCallReceiver = new CallReceiver();
registerReceiver(mCallReceiver, filter2);
//registering some listener
mCallReceiver.registerListener(this);
}
}
unregistering: 取消注册:
if(isCRRegistered) {
unregisterReceiver (mCallReceiver);
}
logcat: 日志猫:
02-04 14:41:50.286: E/AndroidRuntime(28328): FATAL EXCEPTION: main
02-04 14:41:50.286: E/AndroidRuntime(28328): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.PHONE_STATE flg=0x20000000 (has extras) } in com.kris.intellignetringer.CallReceiver@448162b8
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:934)
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.os.Handler.handleCallback(Handler.java:587)
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.os.Handler.dispatchMessage(Handler.java:92)
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.os.Looper.loop(Looper.java:143)
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.app.ActivityThread.main(ActivityThread.java:4914)
02-04 14:41:50.286: E/AndroidRuntime(28328): at java.lang.reflect.Method.invokeNative(Native Method)
02-04 14:41:50.286: E/AndroidRuntime(28328): at java.lang.reflect.Method.invoke(Method.java:521)
02-04 14:41:50.286: E/AndroidRuntime(28328): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
02-04 14:41:50.286: E/AndroidRuntime(28328): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
02-04 14:41:50.286: E/AndroidRuntime(28328): at dalvik.system.NativeStart.main(Native Method)
02-04 14:41:50.286: E/AndroidRuntime(28328): Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.kris.intellignetringer.ScreenReceiver@44816d60
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:812)
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:822)
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
02-04 14:41:50.286: E/AndroidRuntime(28328): at com.kris.intellignetringer.StateChecker.serviceDestroy(StateChecker.java:126)
02-04 14:41:50.286: E/AndroidRuntime(28328): at com.kris.intellignetringer.StateChecker.onPhoneStateChange(StateChecker.java:36)
02-04 14:41:50.286: E/AndroidRuntime(28328): at com.kris.intellignetringer.CallReceiver.onReceive(CallReceiver.java:50)
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:917)
02-04 14:41:50.286: E/AndroidRuntime(28328): ... 9 more
The error is not here! 错误不在这里! The error is when you are unregistering the receiver. 错误是当您注销接收器时。 It seems you are conditionally registering the receiver. 看来您正在有条件地注册接收器。
Therefore, before unregistering the receiver, make sure that you have really registered it. 因此,在注销接收器之前,请确保您已经真正注册了接收器。
You can make use of a boolean that is set once you register the receiver. 注册接收器后,可以使用设置的布尔值。 Then when you want to unregister the receiver, you make sure that the boolean is set otherwise(if it is not(false)) you do not unregister. 然后,当您要注销接收器时,请确保设置了布尔值,否则(如果不是(false))则不要注销。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.