2015-07-28 7 views
0

Я запрограммировал приложение с несколькими сигналами тревоги с помощью AlarmManager. У меня также есть метод, который отменяет все текущие/ожидающие тревоги. Он работает хорошо, однако, если пользователь закрывает приложение из ретентатов (тревоги все еще активны, как и предполагалось), мой метод отмены-тревоги больше не работает (приложение вылетает). Есть ли какие-либо решения? Как я могу отменить свои тревоги после того, как пользователь закрыл приложение?Как отменить будильник после закрытия приложения

Это то, что мои тревоги выглядит следующим образом:

ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>(); 
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
... 
Intent intent = new Intent(this, AlertReceiver.class); 
Long cal = new GregorianCalendar().getTimeInMillis() + sms_in_x_minutes * 60 * 1000; 
PendingIntent i1 = PendingIntent.getBroadcast(this, intent_id++, intent, 0); 
am.set(AlarmManager.RTC_WAKEUP, cal, i1); 
intentArray.add(i1); 

Это то, что мой отмены, метод выглядит следующим образом:

private void cancelAlarms(){ 
    if(intentArray.size()>0){ 
     for(int i=0; i<intentArray.size(); i++){ 
      am.cancel(intentArray.get(i)); 
     } 
     intentArray.clear(); 
    } 
} 

Я думаю, что intentArray и am пустуют после того как я закрыть приложение , а PendingIntents не сохраняются. Но я не знаю, как обойти это.

+0

Вы пробовали Android [Life Cycle] (http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle), вы должны иметь возможность отменить будильник 'onDestroy', однако я ' m не уверен, как это будет работать в ситуации с низкой памятью. – hoss

+0

Yea as Pier предложил мне использовать onDestroy, и это нормально. Это предотвратит все мои аварии. В идеале я хотел был бы отменить все активные тревоги после того, как я закрою и запустим приложение. Может быть, это просто невозможно. Спасибо большое! – haby123

+0

Приложение никогда не нуждается в настройках нескольких тревог. Требуется только самое раннее. Когда это срабатывает, ваше приложение может затем настроить следующее самое раннее, как первую задачу, которую он выполняет. Это упрощает отслеживание ваших сигналов тревоги. Это также упрощает настройку их после перезагрузки, так как аварийные сигналы не выдерживают перезагрузки. – Kuffs

ответ

3

Не оставляйте массив ожидающих намерений. Когда вы правильно поставили диагноз, ваш массив пуст после закрытия приложения, что приводит к сбою при повторном доступе к ним.

Настройте ТОЛЬКО самую раннюю тревогу. Сохраните идентификатор будильника для временного хранения (например, SharedPreferences). (Если это проще, вы также можете использовать постоянное значение для ID, так как теперь у вас есть только один сигнал, о котором нужно подумать)

Когда срабатывает тревога, вы можете настроить следующий самый ранний сигнал тревоги в качестве первой задачи, которая выполнено.

Если вы хотите отменить свою тревогу и иметь идентификационное значение, сохраненное в SharedPreferences, используйте это, чтобы воссоздать AlarmManager и отменить будильник. Если идентификатор отсутствует, то никаких аварийных сигналов не задано, и отмена не требуется.

+1

Большое спасибо! Создание другого сигнала тревоги с тем же идентификатором и отмена его - это идея, которую я искал. Я также буду следовать вашим советам, только один активный сигнал тревоги одновременно. Это сделает мой код намного проще! – haby123

+0

Это обычный сценарий (для установки нескольких аварийных сигналов), но логически, второй самый ранний может НИКОГДА не стрелять до самого раннего и, следовательно, не нужен, пока не будет запущен самый ранний из них. – Kuffs

+0

Где идентификатор тревоги? – Talha

-1

Я думаю, вы должны добавить метод закрытия сигнала к методу ondestroy вашего приложения, потому что если пользователь закрывает ваше приложение, не останавливая их, ваш метод никогда не будет вызван, вызвав крах приложения.

надеюсь, что это работает :)

EDIT: попытаться взглянуть на service и подобные. несколько месяцев назад я использовал их в приложении для Android, и я помню, что даже если я закрываю приложение из откликов, эта служба все еще работает, и для ее закрытия мне пришлось добавить метод в приложение или остановить процесс. Если я понял, это должен быть тот метод, который вы искали, извините, если я не точен, но прошли месяцы, и я забыл название службы, которую я использовал, я просто уверен, что это был сервис :)

+0

Mh хорошая идея, я сделаю это. Это определенно предотвращает все сбои. Это не совсем тот ответ, который я искал, так как я хотел бы отменить все свои тревоги после того, как снова запустил приложение. Но спасибо! – haby123