android - Unregister BroadcastReceiver -
in app i've service register broadcastreceiver onstart()
method:
public void onstart() { if(something....) { intentfilter filter = new intentfilter(intent.action_screen_on); filter.addaction(intent.action_screen_off); screenreceiver = new screenreceiver(); registerreceiver(screenreceiver, filter); } else { if(screenreceiver != null) { unregisterreceiver(screenreceiver); } } }
and works correctly. unregister broadcastreceiver within else
, receive error:
01-25 09:30:03.730: error/androidruntime(11748): fatal exception: main 01-25 09:30:03.730: error/androidruntime(11748): java.lang.runtimeexception: unable start service com.myservice.service@460ce7d8 intent { cmp=com.myservice/.service (has extras) }: java.lang.illegalargumentexception: receiver not registered: com.myreceiver.screenreceiver@46079370 01-25 09:30:03.730: error/androidruntime(11748): @ android.app.activitythread.handleserviceargs(activitythread.java:3063) 01-25 09:30:03.730: error/androidruntime(11748): @ android.app.activitythread.access$3600(activitythread.java:125) 01-25 09:30:03.730: error/androidruntime(11748): @ android.app.activitythread$h.handlemessage(activitythread.java:2096) 01-25 09:30:03.730: error/androidruntime(11748): @ android.os.handler.dispatchmessage(handler.java:99) 01-25 09:30:03.730: error/androidruntime(11748): @ android.os.looper.loop(looper.java:123) 01-25 09:30:03.730: error/androidruntime(11748): @ android.app.activitythread.main(activitythread.java:4627) 01-25 09:30:03.730: error/androidruntime(11748): @ java.lang.reflect.method.invokenative(native method) 01-25 09:30:03.730: error/androidruntime(11748): @ java.lang.reflect.method.invoke(method.java:521) 01-25 09:30:03.730: error/androidruntime(11748): @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:868) 01-25 09:30:03.730: error/androidruntime(11748): @ com.android.internal.os.zygoteinit.main(zygoteinit.java:626) 01-25 09:30:03.730: error/androidruntime(11748): @ dalvik.system.nativestart.main(native method) 01-25 09:30:03.730: error/androidruntime(11748): caused by: java.lang.illegalargumentexception: receiver not registered: com.myreceiver.screenreceiver@46079370 01-25 09:30:03.730: error/androidruntime(11748): @ android.app.activitythread$packageinfo.forgetreceiverdispatcher(activitythread.java:793) 01-25 09:30:03.730: error/androidruntime(11748): @ android.app.contextimpl.unregisterreceiver(contextimpl.java:814) 01-25 09:30:03.730: error/androidruntime(11748): @ android.content.contextwrapper.unregisterreceiver(contextwrapper.java:331) 01-25 09:30:03.730: error/androidruntime(11748): @ com.myservice.service.onstart(service.java:291) 01-25 09:30:03.730: error/androidruntime(11748): @ android.app.service.onstartcommand(service.java:420) 01-25 09:30:03.730: error/androidruntime(11748): @ android.app.activitythread.handleserviceargs(activitythread.java:3053) 01-25 09:30:03.730: error/androidruntime(11748): ... 10 more
can me?
modify code below
public void onstart() { if(something....) { intentfilter filter = new intentfilter(intent.action_screen_on); filter.addaction(intent.action_screen_off); screenreceiver = new screenreceiver(); registerreceiver(screenreceiver, filter); } else { if(screenreceiver != null) { unregisterreceiver(screenreceiver); screenreceiver = null; } } }
calling unregisterreceiver() not set screenreceiver null , when control reaches block, may not case receiver registered. e.g. consider following in sequence,
if(something...)
true, screenreceiver instantiated , registered.if(something...)
false time, screenreceiver unregistered.if(something...)
false again, here, screenreceiver instantiated in step 1 hence not null unregistered in step 2 hence exception "receiver not registered: com.myreceiver.screenreceiver@46079370".
after setting screenreceiver
null, consider above 3 steps in sequence. execute correctly.
Comments
Post a Comment