Намерение от action ".BATTERY_LOW" приходит с задержкой

Ответить
niixon
Сообщения: 24
Зарегистрирован: 13 окт 2013, 10:11

Намерение от action ".BATTERY_LOW" приходит с задержкой

Сообщение niixon » 26 июн 2014, 16:08

Задача:
Когда андройд отображает диалог "Осталось 15% нэргии", мне нужно перехватить это событие, чтобы провести нужные мне манимуляции в программе.

Я создал класс и унаследовал его от BroadcastReceiver. Зарегистрировал ресивер в манифесте и подписал его на android.intent.action.BATTERY_LOW.

Проблема:
В момент отображения диалога "Осталось 15% нэргии" в метод моего класса onReceive() ничего не приходит. Но все же приходит... где-то через 5 - 20 секунд, а то и больше.

Тоесть мой ресивер не принимает сообщение в момент отображения диалога, а принимает на какой-то промежуток времени больше.


Подскажите пожалуйста, как это можно побороть? Спасибо.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Намерение от action ".BATTERY_LOW" приходит с задержкой

Сообщение KamiSempai » 26 июн 2014, 16:48

R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

niixon
Сообщения: 24
Зарегистрирован: 13 окт 2013, 10:11

Re: Намерение от action ".BATTERY_LOW" приходит с задержкой

Сообщение niixon » 26 июн 2014, 16:54

Спасибо

niixon
Сообщения: 24
Зарегистрирован: 13 окт 2013, 10:11

Re: Намерение от action ".BATTERY_LOW" приходит с задержкой

Сообщение niixon » 27 июн 2014, 07:31

В статье, которую вы привели, к сожалению не решается моя проблема.

Мое приложение слушает 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>
Но если я в программе захардкодаю такие пути к файлам(конфигам) будут ли они работать на всех устройстах. Это очень важно.

niixon
Сообщения: 24
Зарегистрирован: 13 окт 2013, 10:11

Re: Намерение от action ".BATTERY_LOW" приходит с задержкой

Сообщение niixon » 27 июн 2014, 07:43

И я не могу пройти по этому пути: com.android.internal.R.integer.config_lowBatteryWarningLevel, Eclips ругается. Говорит: создайте класс internal.

niixon
Сообщения: 24
Зарегистрирован: 13 окт 2013, 10:11

Re: Намерение от action ".BATTERY_LOW" приходит с задержкой

Сообщение niixon » 27 июн 2014, 11:04

К сожалению, такой вариант не подходит.... моя программа - это игра, в которой все быстро летает и движется. На паузу игру надо ставить именно в тот момент, когда вылазит системный диалог "Аккумулятор разряжен", в других ситуациях мне пауза не нужна.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Намерение от action ".BATTERY_LOW" приходит с задержкой

Сообщение KamiSempai » 27 июн 2014, 11:51

Вы не той дорогой пошли. Разве при показе сторонних диалогов не вызывается onPause?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

niixon
Сообщения: 24
Зарегистрирован: 13 окт 2013, 10:11

Re: Намерение от action ".BATTERY_LOW" приходит с задержкой

Сообщение niixon » 27 июн 2014, 13:59

Когда работаешь с нативными активити, то как оказалось нет. Я запускаю проект через jni. Пишется на си++

niixon
Сообщения: 24
Зарегистрирован: 13 окт 2013, 10:11

Re: Намерение от action ".BATTERY_LOW" приходит с задержкой

Сообщение niixon » 27 июн 2014, 14:00

Вот что мне подсказали на другом форуме:
даже если у вас нативная активити можно и нужно получать потерю фокуса APP_CMD_LOST_FOCUS
void android_main(struct android_app* state)
{
state->onAppCmd = engine_handle_cmd;
}

niixon
Сообщения: 24
Зарегистрирован: 13 окт 2013, 10:11

Re: Намерение от action ".BATTERY_LOW" приходит с задержкой

Сообщение niixon » 27 июн 2014, 19:34

И так, после продолжительных тестов и мучений(пытались воспроизводить диалог о нехватке энергии в реальных условиях) получили следующие данные:

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). Это метод срабатывает каждый раз, когда наша активити получает фокус и теряет его. В момент потери фокуса мы ставим игру на паузу. Оказалось очень просто и удобно.

Всем спасибо :)

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Намерение от action ".BATTERY_LOW" приходит с задержкой

Сообщение KamiSempai » 29 июн 2014, 09:15

Та к и нужно было сразу делать. Игру может перекрыть любой диалог, не только BATTERY_LOW.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ответить