Android 注销广播接收机

Android 注销广播接收机,android,broadcastreceiver,android-service,onstart,Android,Broadcastreceiver,Android Service,Onstart,在我的应用程序中,我提供了一项服务,将广播接收器注册到onStart()方法: public void onStart() { if(something....) { IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); screenReceiver = new ScreenRe

在我的应用程序中,我提供了一项服务,将广播接收器注册到
onStart()
方法:

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);
        }
    }
}
它工作正常。 但我将在
中注销此BroadcastReceiver,否则
将收到此错误:

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

你能帮我吗?

修改你的代码如下

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;
        }
    }
}
调用unregisterReceiver()不会将screenReceiver设置为null,并且当控件到达该块时,可能并不总是您的接收器已注册。 例如按顺序考虑,

  • 如果(某物…
    为真,则screenReceiver被实例化并注册
  • 如果(某物…
    这次为假,则screenReceiver被取消注册
  • 如果(某物…
    再次为false,此处,screenReceiver在步骤1中被实例化,因此其不为null,但在步骤2中被注销,因此出现异常“Receiver not registered:com.myreceiver”。ScreenReceiver@46079370“

  • 设置<代码>屏幕接收器<代码>为空,依次考虑以上3个步骤。它将正确执行。

    按如下方式修改代码

    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;
            }
        }
    }
    
    调用unregisterReceiver()不会将screenReceiver设置为null,并且当控件到达该块时,可能并不总是您的接收器已注册。 例如按顺序考虑,

  • 如果(某物…
    为真,则screenReceiver被实例化并注册
  • 如果(某物…
    这次为假,则screenReceiver被取消注册
  • 如果(某物…
    再次为false,此处,screenReceiver在步骤1中被实例化,因此其不为null,但在步骤2中被注销,因此出现异常“Receiver not registered:com.myreceiver”。ScreenReceiver@46079370“
  • 设置<代码>屏幕接收器<代码>为空,依次考虑以上3个步骤。它将正确执行