Подтвердить что ты не робот

Основное различие между Manifest и Programmatic регистрации BroadcastReceiver

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

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

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

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

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

спасибо

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

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