Источник: Nuances of Programming Поговорим о том, почему атрибут exported=“true” может обернуться катастрофой, если правильно не установить его в соответствующий Activity-компонент. Углубимся в этот вопрос. android:exported="true" Атрибут exported="true" используется для указания того, что компонент (Activity, Service, Broadcast Receiver и т. д.) может быть запущен компонентами других приложений. Такая функция полезна, когда мы имеем дело с компонентами, предназначенными для работы с другими приложениями...
А точно каждый компонент должен быть зарегистрирован в манифесте? Нет, не точно. Broadcast Receiver можно зарегистрировать двумя способами: статически в манифесте или динамически в коде. Стоит заметить, что начиная с Android 8 большинство неявных бродкастов нельзя регистрировать в манифесте. Неявный бродкаст, это когда сообщение отправляется вообще всем приложениям, которые подходят, а не только нашему. Почему нельзя? В Android 8 были большие доработки по оптимизации. Представьте, что куча приложений подписаны на какое-то системное событие. Каждый бродкаст в этом случае потребляет ресурсы каждый раз при получении сообщения. В следствии этого активно тратится батарея, пользователь грустит и удаляет приложение. Но все еще можем регистрировать в коде. Список всех интентов, для которых неявный бродкаст можно в манифесте регистрировать — вот. Из тех, которые я помню: ACTION_BOOT_COMPLETED — отправляется один раз при загрузке. Необходим для многих приложений, чтобы они все проинициализировались, запланировали что им надо и прочее. ACTION_TIMEZONE_CHANGED и похожие — чтобы приложении могли свои настройки поправить (например, будильники). ACTION_CONNECTION_STATE_CHANGED — чтобы приложения знали про соединение. Еще есть всякие флаги, связанные со звонками, сообщениями, сетью и сменой/удаления пользователя. Google рекомендует использовать JobSheduler вместо неявных бродкастов. Какие вопросы можно задать из этого ответа? — А какие еще ограничения есть? — Что за JobSheduler и почему его?