2011-01-25 20 views
1

в моем приложении Я услуга, зарегистрировать BroadcastReceiver в onStart() метод:Разрегистрировать BroadcastReceiver

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 [email protected] with Intent { cmp=com.myservice/.Service (has extras) }: java.lang.IllegalArgumentException: Receiver not registered: [email protected] 
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: [email protected] 
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

Изменить вам код, как показано ниже

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() не устанавливает screenReceiver нулю, и, когда управление достигает этого блока, он не всегда может быть случай, который зарегистрирован ваш приемник. , например. Рассмотрим следующее в последовательности:

  1. if(something...) Верно, поэтому ScreenReceiver был создан и зарегистрирован.
  2. if(something...) на этот раз неверно, поэтому screenReceiver не зарегистрирован.
  3. if(something...) is false again, здесь screenReceiver был создан на этапе 1, следовательно, он не является нулевым, но он не был зарегистрирован на шаге 2, поэтому исключение «Получатель не зарегистрирован: [email protected]».

После установки screenReceiver null, рассмотрите выше 3 шага в последовательности. Он будет выполняться правильно.

+0

У вас есть право. Благодаря!! – CeccoCQ

Смежные вопросы