Question

in my app I've a service that register a BroadcastReceiver into 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 it works correctly. But I would unregister this BroadcastReceiver within else and I receive this 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 to start service com.myservice.Service@460ce7d8 with 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):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3063)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at android.app.ActivityThread.access$3600(ActivityThread.java:125)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2096)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at android.os.Looper.loop(Looper.java:123)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at android.app.ActivityThread.main(ActivityThread.java:4627)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at java.lang.reflect.Method.invokeNative(Native Method)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at java.lang.reflect.Method.invoke(Method.java:521)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at 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):     at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:793)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:814)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at com.myservice.Service.onStart(Service.java:291)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at android.app.Service.onStartCommand(Service.java:420)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3053)
01-25 09:30:03.730: ERROR/AndroidRuntime(11748):     ... 10 more

Can you help me?

Was it helpful?

Solution

Modify you code as 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() does not set the screenReceiver to null and when the control reaches that block, it may not always be the case that your receiver is registered. e.g. Consider following in sequence,

  1. if(something...) is true, so the screenReceiver is instantiated and registered.
  2. if(something...) is false this time, so screenReceiver is unregistered.
  3. if(something...) is false again, here, screenReceiver was instantiated in step 1 hence its is not null but it was unregistered in step 2 hence that exception "Receiver not registered: com.myreceiver.ScreenReceiver@46079370".

After setting screenReceiver to null, consider above 3 steps in sequence. It will execute correctly.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top