2014-02-08 4 views
3

Я хочу, чтобы AlarmManager был уволен в 10:30 ежедневно на основе пользовательского времени мобильного устройства. Он стреляет в 10:30, но проблема в том, что после 10:30 утра он повторяется без времени, например, каждые полчаса или после любого необычного интервала времени.

Как предотвратить эту проблему? Я нахожу это на Successfull Вход и регистрация ButtonCick() Событие. Я также хочу остановить это, если пользователь выходит из системы.

Мой код, как показано ниже:AlarmManager не срабатывает вовремя

 Intent myIntent = new Intent(Register.this, AlarmReceiver.class); 

     PendingIntent pendingIntent = PendingIntent.getBroadcast(Register.this, 
       0, myIntent, 0); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

     Calendar firingCal = Calendar.getInstance(); 
     Calendar currentCal = Calendar.getInstance(); 

     firingCal.set(Calendar.HOUR_OF_DAY, 10); 
     firingCal.set(Calendar.MINUTE, 30); 
     firingCal.set(Calendar.SECOND, 0); 

     long intendedTime = firingCal.getTimeInMillis(); 
     long currentTime = currentCal.getTimeInMillis(); 

     if (intendedTime >= currentTime) { 

      WakeLocker.acquire(getApplicationContext()); 

      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, intendedTime, 
        AlarmManager.INTERVAL_DAY, pendingIntent); 

      WakeLocker.release(); 

     } else { 

      WakeLocker.acquire(getApplicationContext()); 

      firingCal.add(Calendar.DAY_OF_MONTH, 1); 
      intendedTime = firingCal.getTimeInMillis(); 

      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, intendedTime, 
        AlarmManager.INTERVAL_DAY, pendingIntent); 

      WakeLocker.release(); 
     } 
+0

Какова ваша цельSdkVersion? – user2450263

+0

targetSdkVersion - это 19 –

ответ

3

код кажется нормально. Если целевая версия 19,

Примечание:

от API 19, все повторяющиеся сигналы являются неточными. Если вашему приложению нужны точные сроки доставки, он должен использовать одноразовые точные аварийные сигналы, каждый раз пересматривая сроки, как описано выше. Устаревшие приложения, чья targetSdkVersion ранее, чем API 19, будут по-прежнему иметь все свои аварийные сигналы, включая повторение сигналов тревоги, которые считаются точными.

Источник: http://developer.android.com/reference/android/app/AlarmManager.html#setRepeating(int,long,long,android.app.PendingIntent)

Примечание:

Начиная с API 19, время запуска передается этому методу рассматривается как неточное: сигнал не будет доставлен до того на этот раз, но может быть отложено и доставлено через некоторое время. ОС будет использовать эту политику, чтобы «пакетные» сигналы тревоги были объединены во всей системе, сводя к минимуму количество раз, когда устройство должно «просыпаться» и минимизировать использование батареи. В общем случае аварийные сигналы, запланированные в ближайшем будущем, не будут отложены до тех пор, пока тревога запланирована далеко в будущем.

С новой политикой дозирования гарантии доставки не так сильны, как раньше. Если приложение устанавливает несколько аварийных сигналов, возможно, что фактический порядок доставки этих аварийных сигналов может не соответствовать порядку их запрошенных сроков доставки. Если ваше приложение имеет сильные требования к заказу, есть другие API, которые вы можете использовать для получения необходимого поведения; см. setWindow (int, long, long, PendingIntent) и setExact (int, long, PendingIntent).

Приложения, чья targetSdkVersion перед API 19 будет продолжать получать предыдущее поведение тревоги: все их запланированные аварийные сигналы будут считаться точными.

Источник: http://developer.android.com/reference/android/app/AlarmManager.html#set(int,long,android.app.PendingIntent)

Пожалуйста, проверьте, работает ли для вашего требования.

+0

Благодарим вас за ответ. Я проверю это и дам вам знать, хорошо ли это работает для меня. –

+0

это сработало для вас :) – user2450263

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