Основная разница между манифестом и программной регистрацией BroadcastReceiver - PullRequest
19 голосов
/ 06 сентября 2010

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

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

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

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

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

спасибо

Ответы [ 3 ]

20 голосов
/ 06 сентября 2010

У вас это в основном правильно.

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

4 голосов
/ 12 декабря 2013

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

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

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

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

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

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

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

0 голосов
/ 27 ноября 2013

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

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

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

...