Лучше практиковать код для регистрации получателя в манифесте или в коде? - PullRequest
7 голосов
/ 24 октября 2011

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

Есть ли в этом случае причина для выбора одного метода над другим? Является ли регистрация получателя в манифесте более эффективной (выполняется быстрее)? Или они оба в основном одинаковые?

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

Приветствия

Ответы [ 4 ]

8 голосов
/ 24 октября 2011

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

Просто спросите себя: какой из двух подходов лучше всего соответствует вашим потребностям?

2 голосов
/ 24 октября 2011

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

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

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

0 голосов
/ 20 июня 2017

Проще говоря

Динамическая регистрация - Ваше приложение ожидает, что что-то произойдет немедленно, когда приложение работает

Статическая регистрация - Ваше приложение ожидает, что что-то произойдет в течение длительного времени.И поскольку вы не можете гарантировать, что ваше приложение будет работать, когда это произойдет, вы можете вежливо попросить систему Android уведомить вас, когда оно выполнит

Они оба будут иметь одинаковое выполнение после этой точки

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

Зависит от сценария.

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

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

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

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

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

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

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

...