1

私のアプリでは、BroadcastReceiver を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 の登録を解除すると、次のelseエラーが表示されます。

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

手伝って頂けますか?

4

1 に答える 1

4

以下のようにコードを変更します

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に設定されるわけではなく、コントロールがそのブロックに到達したときに、レシーバーが登録されているとは限りません。たとえば、順番にフォローすることを検討してください。

  1. if(something...)trueであるため、screenReceiverがインスタンス化されて登録されます。
  2. if(something...)今回はfalseであるため、screenReceiverは登録解除されます。
  3. if(something...)ここでもfalseです。ここで、screenReceiverはステップ1でインスタンス化されたため、nullではありませんが、ステップ2で登録解除されたため、例外「Receiver notregistered:com.myreceiver.ScreenReceiver@46079370」です。

nullに設定screenReceiverした後、上記の3つの手順を順番に検討してください。正しく実行されます。

于 2011-01-25T09:11:46.797 に答える