2016-01-25 3 views
-1

Основная функциональность моего приложения заключается в том, что он имеет постоянное уведомление с таймером обратного отсчета, который обновляется каждую минуту - даже если приложение закрывается ОС Android.Обновление текущего уведомления каждые 60 секунд

Сначала я использовал услугу для запуска таймера и обновления уведомления, но это был заряд батареи/батареи. Поэтому я перешел на использование AlarmManager закончить таймер и повторяющийся сигнал тревоги, чтобы просыпаться каждые 60 секунд или около того, чтобы обновить уведомление:

Intent repeatingIntent = new Intent(this, AlarmReceiver.class); 
repeatingIntent.putExtra(PERFORM_ACTION, ALARM_ACTION_UPDATE_NOTIFICATION); 
PendingIntent repeatingAlarmIntent = PendingIntent.getBroadcast(this, 
     REQUEST_CODE_UPDATE_NOTIFICATION, repeatingIntent, 0); 
AlarmManager am = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);  
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
    SystemClock.elapsedRealtime()+1000, 
    REPEATING_ALARM_INTERVAL*1000, repeatingAlarmIntent); 

Это работает на большинстве устройств, которые я пробовал его (и это гораздо добрее на RAM/батарея/CPU), но, например, на Galaxy S6, повторяющийся сигнал тревоги запускается только каждые 5 минут или даже реже. Иногда это срабатывает вовремя, когда устройство подключено, но оно очень непоследовательно. Я попытался установить интервал повторения на 30 секунд или меньше, но он не действует, будильник не запускается (я вижу каждый раз, когда он запускается в LogCat). Другие, не повторяющиеся сигналы тревоги срабатывают по времени.

Что было бы хорошим способом обеспечить обновление текущего уведомления, по крайней мере, каждые 60 секунд, приходят ад или высокая вода? Помимо возврата к использованию службы (например, ough! Plus OS иногда просто убивает службу на устройствах с небольшой оперативной памятью), единственное, что приходит на ум, - это установить как 5 различных повторяющихся сигналов тревоги (с разными кодами запросов), так и каждый из них запускается каждые 5 минут в шахматном порядке.

ответ

-1

, даже если приложение получает закрыта Android OS

не повезло. Когда приложение будет убито ОС, оно будет мертвым и не сможет многое сделать, в том числе. уведомление о публикации.

, которые инициированы только каждые 5 минут или даже меньше frequentl

https://developer.android.com/reference/android/app/AlarmManager.html говорит:

"Примечание: Начиная с API 19 (KITKAT) поставки сигнализации неточна: ОС сместится аварийные сигналы, чтобы свести к минимуму пробуждения и использование батареи. «

Подробнее об этом также: https://developer.android.com/training/scheduling/alarms.html

+0

Не услуги, а сигналы тревоги. Когда я убью приложение, будильники остаются и пробуждают приложение примерно на 1/100 секунды, чтобы обновить уведомление или закончить таймер и создать новое уведомление или что-то еще. Я пробовал это, используя несколько приложений, которые убивают приложения/процессы. Все работает нормально, за исключением некоторых устройств, которые повторяют сигналы тревоги, не запускаются с установленными интервалами, а позже. Я предпочел бы элегантное решение, но я хочу, чтобы мои пользователи получали то, что они хотят от приложения, независимо от того, что говорит Google. – TimSim

+0

@TimSim правильный. Я удалил эту часть своего ответа. –

+0

Тем не менее, аварийные сигналы никогда не удаляются независимо от того, что я делаю с приложением (если я убью его с помощью какого-либо приложения или на устройствах с низкой ОЗУ, используйте другие приложения, чтобы заставить ОС закрыть мое приложение). Тревога срабатывает, пробуждает мое приложение (в частности, класс AlarmReceiver), затем мое приложение обновляет уведомление и снова переходит в режим сна. Единственный способ, которым я знаю, чтобы удалить эти аварийные сигналы (кроме моего приложения), - это перезагрузка устройства. – TimSim

0

Вместо использования setRepeating() используйте setExact() или setWindow() и установите новый сигнал при каждом запуске. Это намного выше API19.

+0

Это должно сработать, но это создало бы цепочку, и если бы один сигнал тревоги не удался, цепь была бы сломана. Это будет проблемой? Я не уверен, насколько надежны сигналы тревоги, поскольку я не знаю, проигнорированы ли они или отсрочены ОС при их пропуске. – TimSim

+0

Они не должны пропускать пропуски ... вы можете установить будильник на 60 и 120 секунд, так что если прожечь, это не очень важно? Однако, на самом деле, я не видел на самом деле «пропусков» setExact() 'alarms на практике. – 323go

Смежные вопросы