Ответ 1
Мой код выглядит следующим образом:
Вы не можете зарегистрировать BroadcastReceiver
из другого BroadcastReceiver
и получить надежные результаты. Android завершит ваш процесс, потому что он не считает, что что-то работает. Единственным способом прослушивания ACTION_BATTERY_CHANGED
будет регистрация этого получателя из активности или службы.
Разве это не должно быть передано только для каждого процента?
Где вы видите, что документировано? AFAIK, ACTION_BATTERY_CHANGED
будет транслироваться всякий раз, когда аппарат чувствует себя так. Кроме того, имейте в виду, что другие данные изменяются в пределах Intent
, например, температуры.
Если вы хотите реализовать этот виджет приложения, не регистрируйтесь на ACTION_BATTERY_CHANGED
так, как вы. Вместо этого:
- Разрешить пользователю выбирать период опроса через
SharedPreference
(например, один раз в минуту, один раз каждые 15 минут). - Используйте
AlarmManager
, чтобы дать вам контроль над этим периодом опроса с помощьюgetBroadcast()
PendingIntent
- В этом
BroadcastReceiver
вызовитеregisterReceiver()
дляACTION_BATTERY_CHANGED
, но сnull
BroadcastReceiver, так как это вернет вам последнийIntent
, который был передан для этого действия ( Примечание: для этого вам все равно нужно использоватьgetApplicationContext()
- Используйте
AppWidgetManager
, чтобы обновить экземпляры виджета приложения с уровнем заряда аккумулятора, вытащенным изIntent
, который вы извлекли на предыдущем шаге (обратите внимание: если вы настроите их все одинаковыми, вам не нужно итерации над идентификаторами - используйтеupdateAppWidget()
, который принимаетComponentName
как параметр)
Это имеет ряд преимуществ:
- Вам все равно, как часто
ACTION_BATTERY_CHANGED
транслируется - Пользователь получает контроль над количеством потребляемой вами батареи, выполняя эти проверки (должно быть пренебрежимо мало, если вы сохраняете период опроса на минуту или более).
- Ваш процесс можно безопасно прекратить между опросами, тем самым делая его менее вероятным, чтобы пользователи нападали на вас с убийцами задач и наполовину испортили ваше приложение.