Почему какой-либо вещательный приемник может быть зарегистрирован только через Code или AndroidManifest
Некоторые широковещательные приемники работают только в том случае, если они зарегистрированы через код, а не в AndroidManifest.
Например:
SCREEN_ON, SCREEN_OFF
Эти действия будут работать только с получателями, зарегистрированными в коде. Ошибок не происходит, если они зарегистрированы в манифесте, но они так и не вызываются.
Каковы причины этого недокументированного поведения? Безопасность?
Ответы
Ответ 1
Кажется, что это ответ подходит для меня, но все же это не говорит о причине, по которой некоторые могут быть зарегистрированы только в AndroidManifest, а некоторые только через код
Основное использование регистраторов, зарегистрированных в манифесте, предназначено для трансляций, которые могут продолжаться, пока ваш код не находится в памяти (например, BOOT_COMPLETED, ваши запланированные тревоги через AlarmManager).
Ответ 2
Я не думаю, что есть проблема с безопасностью.
Манифест, определяемый широковещательными приемниками, регистрируется и может принимать намерения, даже если приложение не находится в памяти. Противоположности не происходит.
Это может быть проблема с производительностью, поскольку регистрация приемника для этого типа событий может привести к утечке аккумулятора пользователя.
Основное различие между манифестом и программной регистрацией BroadcastReceiver
Ответ 3
Я думаю, что это дизайнерское решение. Мы можем регистрировать наши широковещательные приемники статически или динамически. Оба типа приемников немного отличались от системы Android.
В основном,
Динамический широковещательный приемник работает с приложением. Мы можем использовать его несколько раз. Самое главное в этом, он работает в потоке пользовательского интерфейса.
Статический вещательный приемник работает с ОС. Менеджер пакетов управляет своим жизненным циклом. Временный характер статически зарегистрированного BroadcastReceiver означает, что его метод onReceive() не может использовать любую функциональность, которая является асинхронной, например, привязка к Сервису.
И некоторые трансляции, такие как SCREEN_ON, SCREEN_OFF..., могут вызываться непрерывно. Если мы можем зарегистрировать этот вид трансляции. Многое число приложений хотят использовать его. И каждый раз, когда мы открываем экран устройства, все это приложение будет запускаться ОС. Это нехорошее поведение для любой ОС.
С другой стороны, есть некоторая трансляция, которая бессмысленна, когда мы используем код. Например, "BOOT_COMPLETED". Он должен быть зарегистрирован в системе, а не в потоке пользовательского интерфейса.
Я думаю, что такие решения зависят от сценария безопасности, производительности и использования.
P.S.: Давным-давно я искал, но не нашел никакой документации по конкретной причине.
Ответ 4
Такое поведение не имеет никакого отношения к безопасности, о чем упоминал Diogo Bento.
Если вам нужен ресурс, который необходим, и для его использования требуется предварительная проверка, тогда вы должны запросить разрешения, независимо от того, какая погода вы объявляете своего широковещательного приемника в манифесте или зарегистрируете его в коде. Без необходимых разрешений оба будут терпеть неудачу.
Я думаю, что причиной действия только кода является то, что Googe не хочет, чтобы ваше приложение запускалось с помощью этого действия. SCREEN_ON и SCREEN_OFF - хороший пример. Было бы легко сделать раздражающее приложение, которое будет делать что-то при включении экрана. С этим ограничением это намного сложнее. Если вам действительно нужно, чтобы ваше приложение запускалось при включении экрана, вам нужно сделать больше работы для достижения того же эффекта. Например, вы должны поддерживать Службу, которая прослушивает эти события.
Кроме того, большинство приложений заботятся об этих событиях экрана только в том случае, если они находятся на переднем плане, поэтому нет необходимости просыпать все приложения, которые даже не работают. Допустим, у вас есть 10 приложений, которые заинтересованы в действии SCREEN_ON. Когда вы включаете свой экран, 10 Android-приложений нужно будет просто запустить, чтобы игнорировать эти события, потому что никто из них не работает. И процесс является одним из самых дорогих ресурсов с точки зрения ОС...