简体   繁体   English

动态注册BroadcastReceiver-未注册接收器

[英]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.

相关问题 Android BroadcastReceiver生命周期:动态注册接收器的文档错误? - Android BroadcastReceiver Lifecycle: documentation wrong for dynamically registered receiver? Android-如何引用在BroadcastReceiver中注册接收者的活动? - Android - How to reference activity that registered receiver in BroadcastReceiver? 动态注册的 BroadcastReceiver 实例没有触发? - Dynamically registered BroadcastReceiver instance not firing? 当仅使用BroadcastReceiver时,FLAG_RECEIVER_REGISTERED_ONLY是否有解决方法? - Is there a workaround for FLAG_RECEIVER_REGISTERED_ONLY, when using only a BroadcastReceiver? BroadcastReceiver onReceive()在动态注册时不调用 - BroadcastReceiver onReceive() not Called when registered dynamically 将警报广播发送到动态注册的接收器 - Sending alarm broadcast to a dynamically registered receiver 动态注册ACTION_BOOT_COMPLETED的BroadcastReceiver无效? - Dynamically Registering a BroadcastReceiver for ACTION_BOOT_COMPLETED not working? 系统何时将开始考虑动态注册的BroadcastReceiver? - When will dynamically registered BroadcastReceiver start being considered by system? 在动态注册广播接收器的onReceive方法时,它总是被调用吗? - Is a BroadcastReceiver's onReceive method always called the moment it gets registered dynamically? 收件人未注册 - Receiver not registered
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM