Мой виджет иногда не получает намерение ACTION_BATTERY_CHANGED

#java #android #android-widget

#java #Android #android-виджет

Вопрос:

Добрый вечер, я написал руководство о том, как написать виджет для отображения уровня заряда батареи на Android, но я обнаружил, что мой виджет не всегда синхронизируется с тем, что отображается на экране «О телефоне> Статус». Я установил виджет с закрытым исходным кодом, чтобы проверить, всегда ли он синхронизирован с «официальным» значением, и это происходит.

Вы можете получить доступ к полному коду здесьhttps://github.com/hmrocha/Batteroid и руководство здесь http://androidappdev.org/2011/05/29/androidappdev-batteroid /

Для целей моего вопроса я опубликую здесь свой метод onReceive, чтобы вы могли увидеть, есть ли проблема:

 public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
        Integer level = intent.getIntExtra("level", -1);
        this.views.setTextViewText(R.id.battery_level, level.toString());
        ComponentName cn = 
            new ComponentName(context, BatteroidAppWidgetProvider.class);
        AppWidgetManager.getInstance(context).updateAppWidget(cn, this.views);
    }
    super.onReceive(context, intent);
}
  

Я действительно не знаю, почему через некоторое время он перестает получать намерение ACTION_BATTERY_CHANGED. Значение, на котором оно останавливается, является полностью случайным, поэтому отлаживать его — сущий кошмар.

Заранее спасибо за помощь.

Ответ №1:

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

Существуют приложения для виджетов батареи с открытым исходным кодом, включая виджет батареи GeekYouUp и Quick Battery от Сергея Шафаренко.

Я опубликовал исправления и пояснения к виджету батареи GeekYouUp наhttp://programmerbruce.blogspot.com/2011/05/fixing-geekyouups-battery-widget.html .

Комментарии:

1. Итак, вы предлагаете, чтобы у меня было действие конфигурации, связанное с моим AppWidgetProvider, например, чтобы я мог изменять цвет чисел, чтобы у меня всегда был подключенный процесс?

2. Нет. Я не понимаю, как могло бы помочь действие по настройке. Это обеспечивало бы выполнение процесса только до тех пор, пока пользователь выполнял действие. Взгляните на исходный код виджета батареи GeekYouUp для примера. Прочитайте объяснение, которое я опубликовал по этому поводу в своем блоге.

3. Большое спасибо за помощь. Решение состоит в том, чтобы иметь непрерывный сервис.