Страница 1 из 1
Намерение от action ".BATTERY_LOW" приходит с задержкой
Добавлено: 26 июн 2014, 16:08
niixon
Задача:
Когда андройд отображает диалог "Осталось 15% нэргии", мне нужно перехватить это событие, чтобы провести нужные мне манимуляции в программе.
Я создал класс и унаследовал его от BroadcastReceiver. Зарегистрировал ресивер в манифесте и подписал его на android.intent.action.BATTERY_LOW.
Проблема:
В момент отображения диалога "Осталось 15% нэргии" в метод моего класса onReceive() ничего не приходит. Но все же приходит... где-то через 5 - 20 секунд, а то и больше.
Тоесть мой ресивер не принимает сообщение в момент отображения диалога, а принимает на какой-то промежуток времени больше.
Подскажите пожалуйста, как это можно побороть? Спасибо.
Re: Намерение от action ".BATTERY_LOW" приходит с задержкой
Добавлено: 26 июн 2014, 16:48
KamiSempai
Re: Намерение от action ".BATTERY_LOW" приходит с задержкой
Добавлено: 26 июн 2014, 16:54
niixon
Спасибо
Re: Намерение от action ".BATTERY_LOW" приходит с задержкой
Добавлено: 27 июн 2014, 07:31
niixon
В статье, которую вы привели, к сожалению не решается моя проблема.
Мое приложение слушает ACTION_BATTERY_LOW, но приходит сообщение в мой ресивер с задержкой в 5 - 20 секунд. Мне же нужно словить сообщение немедленно. Сразу при показе сообщение о нехватке энергии установить паузу в приложении.
Мне подсказали вот такой способ. Подписаться на ACTION_BATTERY_CHANGED и каждое изменение процента сверять с системным конфигом.
Код: Выделить всё
mLowBatteryWarningLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_lowBatteryWarningLevel);
mLowBatteryCloseWarningLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_lowBatteryCloseWarningLevel);
Код: Выделить всё
<!-- Display low battery warning when battery level dips to this value -->
<integer name="config_lowBatteryWarningLevel">15</integer>
<!-- Close low battery warning when battery level reaches this value -->
<integer name="config_lowBatteryCloseWarningLevel">20</integer>
Но если я в программе захардкодаю такие пути к файлам(конфигам) будут ли они работать на всех устройстах. Это очень важно.
Re: Намерение от action ".BATTERY_LOW" приходит с задержкой
Добавлено: 27 июн 2014, 07:43
niixon
И я не могу пройти по этому пути: com.android.internal.R.integer.config_lowBatteryWarningLevel, Eclips ругается. Говорит: создайте класс internal.
Re: Намерение от action ".BATTERY_LOW" приходит с задержкой
Добавлено: 27 июн 2014, 11:04
niixon
К сожалению, такой вариант не подходит.... моя программа - это игра, в которой все быстро летает и движется. На паузу игру надо ставить именно в тот момент, когда вылазит системный диалог "Аккумулятор разряжен", в других ситуациях мне пауза не нужна.
Re: Намерение от action ".BATTERY_LOW" приходит с задержкой
Добавлено: 27 июн 2014, 11:51
KamiSempai
Вы не той дорогой пошли. Разве при показе сторонних диалогов не вызывается onPause?
Re: Намерение от action ".BATTERY_LOW" приходит с задержкой
Добавлено: 27 июн 2014, 13:59
niixon
Когда работаешь с нативными активити, то как оказалось нет. Я запускаю проект через jni. Пишется на си++
Re: Намерение от action ".BATTERY_LOW" приходит с задержкой
Добавлено: 27 июн 2014, 14:00
niixon
Вот что мне подсказали на другом форуме:
даже если у вас нативная активити можно и нужно получать потерю фокуса APP_CMD_LOST_FOCUS
void android_main(struct android_app* state)
{
state->onAppCmd = engine_handle_cmd;
}
Re: Намерение от action ".BATTERY_LOW" приходит с задержкой
Добавлено: 27 июн 2014, 19:34
niixon
И так, после продолжительных тестов и мучений(пытались воспроизводить диалог о нехватке энергии в реальных условиях) получили следующие данные:
1. Приложение было подписано на action "
.BATTERY_LOW", тоесть action посылается системой каждый раз, когда происходит мониторинг заряда аккумулятор и заряд меньше чем
http://stackoverflow.com/questions/1197 ... attery-low - com.android.internal.R.integer.config_lowBatteryWarningLevel. (При этом событии должен вызываться диалог "Аккумулятор разряжен")
2. Тест на устройставах версии
2.3 и
3.1 - успешно пройден. Наш ресивер ловил намерение пришедшее по зарегистрированному action-у и приходило это намерение вместе с отображением на дисплее далога "Аккумулятор разряжен". То что нам и нужно было. Словить намерение в момент выбрасывания системой диалога.
3. Тест на устройствах 4. + - провален. Ресивер ловил намерение, но ловил он его то позже отображения диалога, то намного раньше. Получилось так, что пришедшее намерение не было никак связано с отображением диалога на дисплей. От этого способа пришлось отказаться.
Решение: т.к в нашей ситуации нужно было поставить игру на пауз в тот момент, когда диалог перекрывает приложение, решили пойти на небольшую хитрость, и переопределили метод
Activity::onWindowFocusChanged(boolean hasFocus). Это метод срабатывает каждый раз, когда наша активити получает фокус и теряет его. В момент потери фокуса мы ставим игру на паузу. Оказалось очень просто и удобно.
Всем спасибо
Re: Намерение от action ".BATTERY_LOW" приходит с задержкой
Добавлено: 29 июн 2014, 09:15
KamiSempai
Та к и нужно было сразу делать. Игру может перекрыть любой диалог, не только BATTERY_LOW.