Отключить/включить BroadcastReceiver, когда батарея разряжена/в порядке

Я работаю над приложением, которое периодически использует будильник. Будильник устанавливается, когда телефон завершил загрузку. BroadcastReceiver, получающий сигнал тревоги и запускающий службу, отключается, когда батарея разряжается, и включается, когда батарея снова в порядке:

@Override
public void onReceive(final Context context, final Intent intent) {
    if (intent != null && intent.getAction() != null) {
        String action = intent.getAction();
        if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
            // Set alarm
        } else if (action.equals(Intent.ACTION_BATTERY_LOW)) {
            setLocationAlarmReceiverEnabled(context, false);
        } else if (action.equals(Intent.ACTION_BATTERY_OKAY)) {
            setLocationAlarmReceiverEnabled(context, true);
        }
    }
}

private void setLocationAlarmReceiverEnabled(final Context context,
        final boolean enabled) {
    PackageManager packageManager = context.getPackageManager();
    ComponentName locationAlarmReceiver = new ComponentName(context,
            LocationAlarmReceiver.class);
    packageManager.setComponentEnabledSetting(locationAlarmReceiver,
        enabled ? PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
                : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP);
}

В практическом тесте я мог подтвердить, что BroadcastReceiver"LocationAlarmReceiver" отключается, когда уровень заряда батареи падает до 15%, и после того, как телефон был подключен к сети переменного тока/USB, он снова включается, когда уровень заряда батареи достигает 30%.

Но теперь у меня был следующий сценарий:

  1. Уровень заряда батареи падает до 15%, «LocationAlarmReceiver» отключается.
  2. Телефон в конце концов выключается, потому что батарея разряжена
  3. Телефон подключен к сети переменного тока/USB
  4. Телефон включается и загружается, продолжает заряжаться, уровень заряда батареи достигает 100%
  5. «LocationAlarmReceiver» по-прежнему отключен

Я могу только догадываться, что намерение Intent.ACTION_BATTERY_OKAY так и не было реализовано.

Верно ли это наблюдение? Как я могу убедиться, что «LocationAlarmReceiver» снова активируется?


person Torsten Römer    schedule 05.09.2011    source источник


Ответы (1)


Если вы не получаете вызов на Intent.ACTION_BATTERY_OKAY, вам следует включить приемник, когда вы получите вызов в ACTION_BOOT_COMPLETED, проверьте, отключен ли ваш приемник, и тогда вам следует включить его.

person Vineet Shukla    schedule 05.09.2011
comment
Я думал об этом, так что спасибо за подтверждение, но я предполагаю, что это может означать, что BroadcastReceiver включается, когда батарея (все еще) разряжена? - person Torsten Römer; 05.09.2011
comment
тогда вы должны проверить уровень заряда батареи перед включением приемника, и если уровень заряда батареи выше 15%, вы можете включить его.... - person Vineet Shukla; 05.09.2011
comment
Да, и вот информация о том, как это сделать: ссылка - person Torsten Römer; 05.09.2011
comment
На самом деле это не решило бы проблему: в приведенном выше сценарии, если бы я проверил уровень заряда батареи на ACTION_BOOT_COMPLETED, он все равно был бы низким, и приемник остался бы отключенным. - person Torsten Römer; 05.09.2011
comment
для этого вы можете реализовать таймер, который будет проверять уровень заряда батареи через некоторое время, и если он не в порядке, вы можете снова установить таймер. - person Vineet Shukla; 05.09.2011
comment
... и это становится слишком сложным для чего-то очень простого, и таймер, который каждые x минут проверяет, в порядке ли уровень заряда батареи, вероятно, потребляет больше батареи, чем я когда-либо мог сэкономить, отключив приемник. Я ценю вашу помощь, но я не чувствую, что на мой вопрос дан ответ. - person Torsten Römer; 05.09.2011
comment
если ваша батарея в порядке, вы должны отключить таймер, и когда произойдет загрузка, вы можете снова запустить таймер. - person Vineet Shukla; 05.09.2011
comment
проверьте это: stackoverflow .com/questions/4461147/, stackoverflow.com/questions/4461147/ - person Vineet Shukla; 05.09.2011