2013-09-20 2 views
0

Я использую этот код, и мой AlarmManager запускается немедленно, так как время, прошедшее в огонь, еще есть время, чтобы стрелять. Я печатаю его на LOG, чтобы вы могли видеть.AlarmManager Fires Immediately

public void SetAlarm(Context context, Date date, List<String> temp) { 

    Log.d("Alarm Set", "Entered"); 
    Log.d("Alarm Set", date.getHours() + " " + date.getMinutes()); 

    AlarmManager am = (AlarmManager) context 
      .getSystemService(Context.ALARM_SERVICE); 

    Intent i = new Intent(context, Alarm.class); 
    i.putStringArrayListExtra("list", (ArrayList<String>) temp); 

    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 
      PendingIntent.FLAG_ONE_SHOT); 
    date.setMinutes(date.getMinutes() - 5); 

    Calendar rightNow = Calendar.getInstance(); 
    long offset = rightNow.get(Calendar.ZONE_OFFSET) 
      + rightNow.get(Calendar.DST_OFFSET); 
    long sinceMidnight = (rightNow.getTimeInMillis() + offset) 
      % (24 * 60 * 60 * 1000); 

    long time_in_milis = (1000 * 60 * ((date.getHours() * 60) + date 
      .getMinutes())) - sinceMidnight; 
    Log.d("Alarm Time in Mili Seconds", "" + time_in_milis); 

    am.set(AlarmManager.RTC_WAKEUP, time_in_milis * 10000, pi); 
} 
+0

Я действительно не вижу вашей проблемы –

+0

он сразу же срабатывает – user2617434

+1

И ваш журнал говорит ...? –

ответ

1

Если я правильно читать ваш код, вы вычисление time_in_milis [так] как разница во время, необходимое время по отношению к «прямо сейчас». Однако set() ожидает абсолютную метку времени.

Другими словами, вы поставляете довольно маленькую временную метку, эффективно планируя свою тревогу в прошлом.

Для простого тестового сценария попробуйте пройти System.currentTimeMillis() + 60000 - ваша тревога должна срабатывать примерно через минуту (помните, что set() устанавливает неточные сигналы).