Я искал в Интернете и не мог найти ответ на свой вопрос. Моя проблема заключается в том, чтобы получить информацию об уровне заряда батареи только один раз, например. вызов функции getBatteryLevel()
. Есть только решения, которые реализованы с использованием BroadcastReceiver
, но, насколько я знаю, он будет вызываться каждый раз при событии изменения уровня заряда батареи. Подскажите пожалуйста, как я могу получить эту информацию только один раз?
Получите уровень заряда батареи только один раз, используя Android SDK
Ответы (1)
Широковещательная рассылка Intent.ACTION_BATTERY_CHANGED
– это так называемая "закрепленная рассылка". Поскольку это липкое, вы можете зарегистрироваться для трансляции с нулевым приемником, который получит уровень заряда батареи только один раз при вызове registerReceiver
.
Функция для получения уровня заряда батареи без получения обновлений будет выглядеть примерно так:
public float getBatteryLevel() {
Intent batteryIntent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
// Error checking that probably isn't needed but I added just in case.
if(level == -1 || scale == -1) {
return 50.0f;
}
return ((float)level / (float)scale) * 100.0f;
}
Из этой липкой трансляции можно извлечь больше данных. Используя возвращенный batteryIntent
, вы можете получить доступ к другим дополнительным функциям, как указано в классе BatteryManager
. .
person
Michael Celey
schedule
01.04.2013
Этот метод теперь нельзя вызывать из приемника (например, виджета). Знаете ли вы какой-либо другой способ получить уровень заряда батареи, который можно сделать из метода onUpdate() виджета?
- person Andrew Mackenzie; 30.07.2013
Если вы делаете это из виджета, вам нужно вызвать
registerReceiver
следующим образом: getApplicationContext().registerReciever(...)
чтобы он заработал.
- person Michael Celey; 30.07.2013
У меня есть контекст, и я могу его вызвать, но вызов не разрешен из приемника, передав this или null в качестве первого параметра приемника. Сообщение журнала очень явное, что вы не можете вызывать из приемника.
- person Andrew Mackenzie; 01.08.2013
Вы не можете использовать любой контекст, вам нужно использовать контекст, возвращенный из
getApplicationContext()
, чтобы вызвать registerReceiver()
из другого получателя. Я пробовал это, и это работает. Это также ответ, данный в этом вопросе, который очень похож на тот, который вы задаете: stackoverflow.com/questions/3691579/
- person Michael Celey; 01.08.2013
С ApplicationContext это сработало отлично! Спасибо!
- person Andrew Mackenzie; 07.08.2013
Для этого требуется специальное разрешение?
- person Sid; 08.07.2016
Согласно документации Android, разрешения не требуются.
- person Michael Celey; 08.07.2016
Это единственный способ одноразового запроса состояния питания при запуске. Использование произвольного нового намерения в этом случае не сработает. Но последующее горячее подключение/отключение питания может быть обнаружено широковещательным событием.
- person kakyo; 26.12.2019
BroadcastReceiver
, а затем, как только вы получите значение, просто отмените регистрацию получателя. - person TronicZomB   schedule 01.04.2013