2015-08-16 3 views
1

TL; DR - AlarmManager .setRepeating немедленно начинает вместо желаемого будущего времени .. (например, 5 минут теперь)Android Manager повторив Alarm оттеняет немедленно

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

-это метод get имеет время, оставшееся до тревоги, это используется как triggerInMillis для alarmManager.

/** calculate the time left until the alarm with calendar */ 
private static long getTimeFromCalendar(final int hourOfDay, final int minute) { 

    Date dat = new Date();//initializes to now 
    Calendar cal_alarm = Calendar.getInstance(); 
    Calendar cal_now = Calendar.getInstance(); 
    cal_now.setTime(dat); 
    cal_alarm.setTime(dat); 
    cal_alarm.set(Calendar.HOUR_OF_DAY,hourOfDay); 
    cal_alarm.set(Calendar.MINUTE, minute); 
    cal_alarm.set(Calendar.SECOND,0); 

    if(cal_alarm.before(cal_now)){ 
     cal_alarm.add(Calendar.DATE,1); 
    } 

    long calAlarm = cal_alarm.getTimeInMillis(); 
    long calNow = cal_now.getTimeInMillis(); 

    long timeLeft = (calAlarm - calNow); 

    return timeLeft; 
} 

тогда я называю -startAlarm- метод:

private static void startAlarm(final Enums typeToStart) { 

    final PendingIntent pendingIntent = GBAlarms.createPendingIntent(OnAlarmReceiver.class, Constants.typeEnum, typeToStart); 
    final long timeToAlarm = Utils.getTimeToAlarm(typeToStart); 
    long repeatTime = Constants._24hours; 

    GBAlarms.createRepeatingAlarm(timeToAlarm, repeatTime, pendingIntent); 
} 

и, наконец, мой -GBAlarms.class-, где я создаю свои тревоги и ожидающие намерения.

public class GBAlarms { 

    /** Define our AlarmManager */ 
    private static AlarmManager mgr = (AlarmManager) BaseApplication.getAppContext().getSystemService(Context.ALARM_SERVICE); 

    /** Create a new PendingIntent */ 
    public static PendingIntent createPendingIntent(final Class destination, @Nullable final String extra, Enums.TeaType type) { 
     Intent i = new Intent(BaseApplication.getAppContext(), destination); 
     if (extra != null && type != null) { i.putExtra(extra, type); } 
     PendingIntent pi = PendingIntent.getBroadcast(BaseApplication.getAppContext(), type.getValue() , i, 0); 
     return pi; 
    } 

    /** Create a new repeating Alarm */ 
    public static void createRepeatingAlarm(final long time, final long repeatTime, final PendingIntent pi) { 
     mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, time, repeatTime, pi); 
    } 

} 

Я не понимаю, почему тревога выскакивает правильно, когда я поставил его в -createRepeatingAlarm- методы, и я отлажена конечно, параметр времени выглядит законен .. если я установить его на 3 минут, 10 минут, он помещает это время в триггер.

может ли кто-нибудь определить мою ошибку? может, я что-то упустил?

благодарит за любую помощь.

+0

будет что-то вроде: mgr.setRepeating (AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + repeatTime, repeatTime, pi) работает лучше? –

ответ

0

почему вы используете ELAPSED_TIME?

пожалуйста, попробуйте использовать RTC_WAKEUP и переключатель

long timeLeft = (calAlarm - calNow); 

только с calAlarm

Вам не нужно станы налево, вам нужны заводы, которые вы хотите, чтобы это поп-музыки.

0

Вы создаете «ожидающий» сигнал, сигнал тревоги, который повторяется через определенный интервал.

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

Посмотрите на код ниже: Вы должны вызвать метод getBroadcast с флагом PendingIntent.CANCEL_CURRENT

AlarmManager alarmMgr; 
PendingIntent pendingIntent; 

public void startAlarmManager() 
    { 
     Intent dialogIntent = new Intent(getBaseContext(), AlarmBroadcastReceiver.class); 
       alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
       pendingIntent = PendingIntent.getBroadcast(this, 0, dialogIntent,PendingIntent.FLAG_CANCEL_CURRENT); 

       alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(), 10000, pendingIntent); 

      } 
    } 
+0

Я вроде как не согласен с вашим ответом. На данный момент у меня нет текущей тревоги. во-первых, я всегда отменяю сигналы тревоги, прежде чем вызывать новый, второй, это также происходит, когда я только что установил, так что 100% – JozeRi

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