Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Giekelberri
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 9
#1

Alarm broadcastIntent убивается через какое-то время - Программирование Android

16.01.2015, 09:47. Просмотров 913. Ответов 18
Метки нет (Все метки)

Привет! Я разрабатываю приложение похожее на будильник. Я использую Android 4.2.2.

Проблема заключается в том, что после некоторого времени (около 1 - 2 часов) alarm pendingIntent убивается кем-то и будильник не срабатывает.

Последовательность шагов следующая
1. Вызов SetAlarm() и установка на срабатывание через 2 часа.
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intentToFire, 0); alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, time, alarmIntent);
2. Я вижу, что Alarm установлен через "adb shell dumpsys alarm". +1h59m осталось
3. После 10 минут... я вижу, что Alarm установлен через "adb shell dumpsys alarm".+1h49m осталось
4. После 20 минут... я вижу, что Alarm установлен через "adb shell dumpsys alarm".+1h39m осталось
5. И так далее...
6. Но после гле-то 1-2 часов (время варьируется) Oooops. Я больше не вижу alarm pendingIntent в списке "adb shell dumpsys alarm".

Android родной будильник работает нормально.

Код:
Broadcast Receiver, зарегистрированный в AndroidManifest.xml

XML
1
2
3
4
5
6
7
8
9
10
    <receiver android:name=".BrdRcvr" android:exported="true">
        <intent-filter>        
            <action android:name="action.alarm.RI" />
            <action android:name="action.alarm.ERT0" />
            <action android:name="action.alarm.ERT1" />
            <action android:name="action.alarm.ERT2" />
            <action android:name="action.alarm.ERT3" />
            <action android:name="action.alarm.ERT4" />
        </intent-filter>
    </receiver>
Функция установки Alarm'а:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static void setAlarmRI(Context context) {
    //Read time from preferences
    SharedPreferences appPref = 
            context.getSharedPreferences(SettingsActivity.APP_PREF, Context.MODE_PRIVATE);
 
    int timeToAlarmMs = Integer.valueOf(appPref.getInt(SettingsActivity.APP_PREF_RI, 0)) * 1000; //[ms]
 
    //!getSystemService must be called after onCreate() 
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    long time = SystemClock.elapsedRealtime() + timeToAlarmMs * 60; //[min]
 
    //Intent
    Intent intentToFire = new Intent(context, BrdRcvr.class);
    intentToFire.setAction("action.alarm.RI");
 
    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 
            0, intentToFire, 0/*flags*/);
 
    if (timeToAlarmMs > 0) {
        //for API >= 19 AlarmManager.set() triggers not at exact time (for battery saving)
        //and we should use AlarmManager.setExact() instead
        if (Build.VERSION.SDK_INT >= 19)
            alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, time, alarmIntent);
        else
            alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time, alarmIntent);
 
        Log.d(ALARMRI, "API:" + Integer.valueOf(Build.VERSION.SDK_INT).toString());
        Log.d(ALARMRI, "set:" + Long.valueOf(time).toString());
        Log.d(ALARMRI, "cur:" + Long.valueOf(SystemClock.elapsedRealtime()).toString());
        Log.d(ALARMRI, "delta:" + (Long.valueOf(time) -
                Long.valueOf(SystemClock.elapsedRealtime())));
    } else {
        alarmManager.cancel(alarmIntent);
        Log.d(ALARMRI, "unset");
    }
}
У кого-нибудь есть идеи в чем может быть проблема?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2015, 09:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Alarm broadcastIntent убивается через какое-то время (Программирование Android):

Уведомления в заданное время без Alarm - Программирование Android
Пытаюсь вывести уведомление в заданное время не используя AlarmManager. Т.к. через AlarmManager, после перезагрузки, выводятся все...

Процесс не убивается ни через cmd, ни через Process Explorer - Windows 7
Как его убить? И cmd и PE запускались от Администратора

Через какое время частицы встретятся? - Механика
Три частицы начинают одновременно двигаться с постоянными по модулю скоростями v из вершин равностороннего треугольника со стороной A ....

Через какое время вода испарится - Термодинамика и МКТ
Форумчане, прошу помощи с такой задачей. В долго стоявшую в комнате кастрюлю налили m = 2 кг горячей воды с температурой t = 97 °C и...

Через какое время тело упадёт? - Механика
Построить траекторию тела брошено вертикально вверх с некоторой высоты, V=20мс/с h=10м t=-шаг 0.2 определить, через какое...

Через какое время поезд остановится? - Механика
Поезд идущий со скоростью 72 км/ч проходящие до остановки за 200 метров.Через сколько времени поезд остановится?

18
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
16.01.2015, 10:05 #2
Ну...вы сами через set сказали ему отработать и убиться ...

triggerAtMillis time in milliseconds that the alarm should go off, using the appropriate clock (depending on the alarm type).
operation Action to perform when the alarm goes off; typically comes from IntentSender.getBroadcast().
Хотите его лицезреть - используйте setRepeating
0
Giekelberri
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 9
16.01.2015, 12:25  [ТС] #3
Этот alarm я переустанавливаю, когда он сработает. Проблема в том, что он даже однократно не срабатывает при периоде в 2 часа.

Если установить период в 5 - ~30 минут он срабатывает. Если установить период в 2 часа, то где-то через ~1 час он исчезает из списка "adb shell dumpsys alarm". Такое чувство, что его кто-то убивает (система или какая-то программа оптимизации или еще что-то).
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
16.01.2015, 13:04 #4
Тогда непонятно.
Возможно его и вправду система убивает "on low memory".

Я бы ради интереса врубил еще один AlarmManager на каждую минуту, например, который бы смотрел "висит" ли или нет твой PendingIntent alarmIntent и писал бы в лог состояние.
Так увидишь когда он пропадет.

А может они и оба пропадут до того
0
Giekelberri
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 9
16.01.2015, 14:36  [ТС] #5
Боюсь это не даст мне никакой полезной информации о причине пропадания alarm'а.

Я уже испытывал так: запускал 5 алармов на точное время срабатывания (скажем на 9:00, 12:00 и т. д.) и один аларм с периодом повторения 30 минут. Каждый из этих алармов переустанавливает сам себя после приема Broadcast Intent.

Результат такой, что все работало хорошо. Аларм с периодом в 30 минут срабатывал, алармы на точно время срабатывания (9:00, 12:00 и т. д.) тоже срабатывали. Однако, где-то через 5 часов (каждый раз по-разному) все алармы неожиданно и беспричинно пропали.
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
16.01.2015, 15:00 #6
Запустите на другом девайсе
0
Giekelberri
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 9
16.01.2015, 15:24  [ТС] #7
Я тестировал на Huawei Y330 (Android 4.2.2) и Huawei Ascend P1 (Android 4.0)

Но родной андроидовский будильник com.android.deskclock работает исправно! Я его вижу в списке "adb shell dumpsys alarm". Он регистрирует себя как RTC_WAKEUP.

Я регистрирую свой аларм как ELAPSED_WAKEUP.
0
androbro
326 / 287 / 61
Регистрация: 17.10.2014
Сообщений: 855
16.01.2015, 16:08 #8
Giekelberri, попробуйте на эмуляторе) или на устройстве без всяких там программ "оптимизаций"
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
18.01.2015, 21:27 #9
Сам замечал подобное при работе с алармами.
До сих пор надежности не добился!

Кому-нибудь удавалось надежности добиться?
Что лучше для будильника? один аларм на программу каждые 5 минут с проверкой или десяток на каждый день месяца?
Стоит ли делать несколько алармов перезапускающих друг-дружку?
Заметил что гугл наплодил больше 20 алармов.
Спасибо за команду "adb shell dumpsys alarm" - не знал чем подобное мониторить. Правда не удобный список получается - слишком много пустых строк(всего 729 строк получилось), нет фильтра по классам (например только свои ищу) - может можно упростить поиск? Пока пишу в текстовый файл и ищу поиском нужное.
Еще, может кому поможет, взаимный перезапуск двух частых алармов приводил к резкому увеличению сьедаемой памяти. И при очень частом срабатывании (3-5 раз в секунду с вызовом бродкаста) вызывал перезапуск мобилки через 1.5-2.5 часа. Алармы при этом часто умирали.
0
Giekelberri
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 9
19.01.2015, 12:47  [ТС] #10
2 androbro: эту неделю попробую на эмуляторе и других устройствах.

2 Tester64:
1) Чтобы параметризовать вывод adb можно, например, ввести в командной строке:
adb shell dumpsys alarm | fgrep my_alarm_name

2) Я рассматривал вариант запустить аларм с интервалом 5 минут, который бы проверял запущен ли другой аларм. Но, согласитесь, это неправильно. Так не должно быть. Если я установил аларм на срабатывание через 2 часа, то он должен сработать. Тем более, что родной аларм com.android.deskclock работает исправно.
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
19.01.2015, 13:09 #11
Цитата Сообщение от Giekelberri Посмотреть сообщение
2) Я рассматривал вариант запустить аларм с интервалом 5 минут, который бы проверял запущен ли другой аларм.
К сожалению, я думаю, что такой возможности нет.
Я вверху погорячился с этим.
Поверить есть или нет можно только соответствующий PendingIntent, но это не дает ровным счётом ничего.
Вот давеча, установил прверку по PendingIntent для 5-ти минутного аларма.
Аларм издох, а PendingIntent под него еще прекрасно себя чувствовал часа 3, пока до него не добрался мусорщик, я так думаю.

Вообще, какой-то этот AlarmManager недоделанный, в смысле "пришибленный".

Почему у AlarmManager нет события аналогичного onDestroy у Service?

Даже наследуемый от Object и ограниченный в своём применении finalize вы не сможете переопределить (если сможете - скажите как )

Я тут думал скрестить как-то AlarmManager и Service, породив монстра, который бы при убиении возвопил "Я умираю" и испустил onDestroy()...но не смог...
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
19.01.2015, 13:13 #12
smail00, пашоль вон
0
Giekelberri
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 9
19.01.2015, 13:20  [ТС] #13
2 Armagedo:
1) Да, да, да. Возможности проверить установлен ли Alarm нет. Я имел ввиду, что каждые 5 минут переустанавливать долгосрочный Alarm заново. Ведь если установить Alarm, который был установлен до этого, он просто перезаписывается.

Сейчас тестирую на эмуляторе... о результатах отпишу завтра.
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
19.01.2015, 13:29 #14
Giekelberri, а сервис+таймер не тестировали для своих целей?

Просто я по вашим вводным прицепил себе аlarm на 5 часов и он нормально отработал, не убишись до этого.
Это не показатель в свете происходящего, но сервис хоть коректно убивается во всех случаях, кроме каких-то архи критических, и это дело можно отследить

Добавлено через 2 минуты
Кстати, все везде аппелируют к встроенным будильникам и прочим гуглам.
F они точно знают, что при реализации сих зверей использовался AlarmManager?
0
Giekelberri
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 9
19.01.2015, 13:41  [ТС] #15
2 Armagedo:
1) "сервис + таймер" насколько я понимаю по-прожорливей в плане ресурсов будет. Поэтому не хочу.
2) Пытался найти исходный код родного андроидовского будильника - пока не нашел. Но вот что странно: есть такое разрешение com.android.alarm.permission.SET_ALARM, которое логично было бы надо указать в AndroidManifest.xml. Но оно никак не влияет на работу alarm. И в документации на alarmManager про это разрешение ничего не сказано.
0
19.01.2015, 13:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2015, 13:41
Привет! Вот еще темы с ответами:

Открывается реклама через какое-то время - Удаление вирусов
Вчера случайно с файлообменника через ихний загрузчик установил пару не очень хороших программ таких как Амиго и Zaxar. Вроде-бы удалил их...

Лагают игры через какое-то время - Windows 7
Добрый день! У меня возникла проблема с игрой ( CS:GO ), то что она через какое то время начинает лагать(фризить),проседать fps до...

HTML5 - через какое время он станет актуальным? - HTML, CSS
Приветствую всех веб-дизайнеров. сегодня такой вопрос на повестке дня. Ни для кого не секрет что вышел HTML5. Уважаемые умные люди,...

Какое время будут показывать часы через... - C++
Текущее показание электронных часов: h часов (0 ≤ h ≤ 23) m минут (0 ≤ m ≤ 59) s секунд (0≤ k ≤ 59). Какое время будут показывать часы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru