Для некоторых действий вы можете объявить BroadcastReceiver только в коде Java. Насколько мне известно, это происходит с действием BATTERY_CHANGED
и SCREEN_ON
, SCREEN_OFF
.
Когда вы объявляете BroadcastReceiver в файле Manifest.xml, независимо от того, запущено ваше приложение или нет, BroadcastReceiver будет активирован и, следовательно, будет вызван метод onReceive
.
Почему? Я думаю, это потому, что действие BATTERY_CHANGED
очень распространено, и если вы можете объявить его в Манифесте, система часто отправляет много трансляций и, таким образом, сильно расходует батарею, однако, когда вы Если в коде указано это, то широковещательный приемник будет эффективен только во время работы, что позволит избежать чрезмерного расхода батареи. Для экономии заряда аккумулятора Android не позволяет регистрировать такие действия в файле.
Это только мое предположение. Я не видел никаких официальных объяснений по этому поводу. Как разработчик, я просто запоминаю такие действия, а не их причины.