2013-11-21 3 views
0

Я создал широковещательный приемник и зарегистрирован в в манифесте, используя следующий подход он работает отличнозагрузки завершен Broadcast приемник не работает для динамической регистрации

статический способ регистрации широковещательный приемник (работает нормально)

<receiver 
     android:name="DeviceRestartListener" 
     android:enabled="true" 
     android:exported="false" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </category> --> 
     </intent-filter> 
    </receiver> 

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

Но когда я попытался зарегистрировать широковещательный приемник программным (вместо статического), используя следующий способ, он не работает Загрузка программного обеспечения (не работает)

DeviceRestartListener dataBroadcastReceiver = new DeviceRestartListener(); 
      IntentFilter filter = new IntentFilter(); 
      filter.addAction(
        "android.intent.action.BOOT_COMPLETED") 
//registerReceiver(dataBroadcastReceiver, filter); //DOESNT WORK 
registerReceiver(dataBroadcastReceiver, filter, "android.permission.RECEIVE_BOOT_COMPLETED", null); //DOESNT WORK 

Ошибка компиляции и ошибки времени выполнения. Но приемник не транслируются после устройства перезагружается

Благодаря

+2

«Но приемник не получает широковещательную передачу после перезагрузки устройства» - почему? В конце концов, ваш экземпляр BroadcastReceiver больше не существует после завершения процесса, не говоря уже о перезагрузке. – CommonsWare

ответ

1

Регистрация приемника в коде

Когда мы регистрируем приемник в коде мы должны отменить регистрацию, когда приложение будет уничтожено (фактически, когда Activity или Service, которые его регистрируют, уничтожаются).

Регистрация приемника в очевидном

Когда мы объявим его в манифесте, вы делаете его доступным даже если приложение не работает.

Когда использовать какой метод для регистрации

Какой метод использовать для регистрации вашего BroadcastReceiver зависит от того, что ваше приложение делает с системным событием.Я думаю, что есть в основном две причины, почему ваше приложение хочет знать о общесистемных событий:

  1. Ваше приложение предлагает некоторый вид услуг вокруг этих событий

  2. Ваше приложение хочет реагировать милостиво изменения состояния

Примеры первой категории приложений, которые должны работать, как только устройство загружается или что должны начать какую-то работу, когда устанавливается приложение. Battery Widget Pro или App2SD - хорошие примеры для таких приложений. Для этого типа вы должны зарегистрировать BroadcastReceiver в файле манифеста.

Примерами для второй категории являются события, которые сигнализируют об изменении обстоятельств, на которые может положиться ваше приложение. Скажите, что ваше приложение зависит от установленного соединения Bluetooth. Вы должны реагировать на изменение состояния - но только тогда, когда ваше приложение активно. В этом случае нет необходимости в статически зарегистрированном широковещательном приемнике. Динамически зарегистрированный будет более разумным.

Существует также несколько событий, для которых вам даже не разрешено статически регистрироваться. Примером этого является событие Intent.ACTION_TIME_TICK, которое транслируется каждую минуту. Это мудрое решение, потому что статический приемник излишне разряжал батарею.

1

Все широковещательные приемники не будут работать, даже если они статически объявлены в манифесте или зарегистрированные динамически с помощью контекста приложения. например Намерение действия, такие как

 Intent.ACTION_SCREEN_OFF 

и

 Intent.ACTION_SCREEN_ON 

должны быть зарегистрированы динамически. Эти действия не будут запущены, когда они будут объявлены в манифесте. некоторые Намерение действия, такие как

Intent.ACTION_TIME_CHANGED; 
    Intent.ACTION_TIME_TICK; 
    Intent.ACTION_TIMEZONE_CHANGED; 

уволят, когда регистрируются динамически через контекст окна которого маркер не является нулевым. (как активность или диалога).

похож на это, некоторые из Намерение действий, как

 Intent.ACTION_BOOT_COMPLETED 

будет работать только тогда, когда они регистрируются статически с помощью манифеста

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