2010-09-06 2 views
18

Я пытаюсь понять основные различия между регистрацией BroadcastReceiver в Manifest и регистрации его программно ...Основное различие между манифеста и Программной УЧЕТ BroadcastReceiver

Я понимаю, в основном следующим образом (был бы признателен кто-то исправляя мой если я чего-то не хватает).

  • Зарегистрированный в манифесте:

    1. ОС будет волшебно найти и создать экземпляр класса, если это необходимо, вызвав метод OnReceive(), независимо от того, что состояние движения вашего приложения был
    2. Ваш получить будет вызываться только один раз для трансляции (т. е. вы можете считать, что регистрация в манифесте похожа на регистрацию вашего «класса» для приема широковещательной передачи), и трансляция создает экземпляр вашего класса по мере необходимости) (??)
  • Registered Программный:

    1. регистрация в коде означает, что вы регистрируетесь экземпляры вашего класса для приема широковещательных сообщений (т.е. если ваш код немного неаккуратно, и вам удастся зарегистрироваться несколько раз, вы получите несколько экземпляров BroadcastReceiver, все из которых имеют свой onReceive(), вызываемый для широковещательной передачи
    2. , чтобы отменить регистрацию, вам необходимо отменить регистрацию конкретного экземпляра BroadcastReceiver, который вы ранее зарегистрированных
    3. , если ваше приложение получает уничтожены ОС, ваш метод OnReceive() не будет вызываться для трансляции

благодарит

ответ

18

у вас есть это в принципе правильно.

Обратите внимание, что зарегистрированный зарегистрированный объект-приемник используется только один раз. Новый экземпляр вашего BroadcastReceiver создан для каждой трансляции. Основное использование регистраторов, зарегистрированных в манифесте, предназначено для трансляций, которые могут продолжаться, пока ваш код не находится в памяти (например, BOOT_COMPLETED, ваши запланированные тревоги через AlarmManager).

+0

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

+0

@Boy: Да, это должно быть. – CommonsWare

+0

, пожалуйста, можете посмотреть, если это связано с моей проблемой: http://stackoverflow.com/questions/29728000/wifi-changed-status-affecting-my-app –

0

Ваше понимание правильное в соответствии с моим.

Другая важная (и неясная) разница в том, что некоторые специфические системные намерения вызовут только ваш приемник, если он программно зарегистрирован. Приемники, определенные только в объявлении , не будут вызываться. Примерами являются: ACTION_SCREEN_ON, ACTION_SCREEN_OFF, ACTION_BATTERY_CHANGED, ACTION_HEADSET_PLUG

Я рекомендовал бы этот text, который упоминает различные подробности о намерениях и приемников.

+0

Ну, мне удалось зарегистрировать приемник ACTION_SCREEN_ON через манифест, и он работает – jonney

4

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

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

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

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

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

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

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