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,

  1. if(something...) true, screenreceiver instantiated , registered.
  2. if(something...) false time, screenreceiver unregistered.
  3. 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

Popular posts from this blog

java - SNMP4J General Variable Binding Error -

windows - Python Service Installation - "Could not find PythonClass entry" -

Determine if a XmlNode is empty or null in C#? -