2013-07-15 12 views
5

Temel olarak bu koda sahibim, zaman 24 saat döner ve alarmı her gün tekrarlar. Alarmın 9 am ayarladığınızda zaman 09:10 ikenAlarmManager, aynı gün ayarlandığı zamandan beri alarmı tetikliyor, setRepeating

public setAlarm(String time, Context context){ 
    String[] strTime; 

    strTime = time.split(":"); 

    int hour, min, sec; 
    //set when to alarm 
    hour = Integer.valueOf(strTime[0]); 
    min = Integer.valueOf(strTime[1]); 
    sec = 0; 

    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.HOUR_OF_DAY, hour); 
    cal.set(Calendar.MINUTE, min); 
    cal.set(Calendar.SECOND, sec); 
    //Create a new PendingIntent and add it to the AlarmManager 
    Intent intent = new Intent(context, AlarmReceiverActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 
} 

Neyse, sorun Alarmı çıkmak vardır. Niye ya? Sistem zamanını geçtiyse alarm vermemesini istiyorum. Ör. sistem zamanı 09:10

cevap

19

Ben şimdi çalışma var iken 9 am alarm ayarlamak. Alarm saatinin ve geçerli zamanın kontrolünü ekledim.

public setAlarm(String time, Context context){ 
     String[] strTime; 

     strTime = time.split(":"); 

     int hour, min, sec; 
     //set when to alarm 
     hour = Integer.valueOf(strTime[0]); 
     min = Integer.valueOf(strTime[1]); 
     sec = 0; 

     long _alarm = 0; 
     Calendar now = Calendar.getInstance(); 
     Calendar alarm = Calendar.getInstance(); 
     alarm.set(Calendar.HOUR_OF_DAY, hour); 
     alarm.set(Calendar.MINUTE, min); 
     alarm.set(Calendar.SECOND, sec); 

     if(alarm.getTimeInMillis() <= now.getTimeInMillis()) 
      _alarm = alarm.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1); 
     else 
      _alarm = alarm.getTimeInMillis();    

     //Create a new PendingIntent and add it to the AlarmManager 
     Intent intent = new Intent(context, AlarmReceiverActivity.class); 
     PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE); 
     am.setRepeating(AlarmManager.RTC_WAKEUP, _alarm, AlarmManager.INTERVAL_DAY, pendingIntent); 
    } 
+1

AlarmManager.INTERVAL_DAY + 1 - Neden +1 ekliyorsun? –

+0

Çünkü "Bir alarm ertelenirse (örneğin, sistem uyku ile _WAKEUP alarm türleri için), atlanan bir tekrar mümkün olan en kısa sürede teslim edilir. Bundan sonra, gelecekteki alarmlar orijinal programa göre teslim edilir. zamanla sürüklenmez.Örneğin, her saat başı en üstte bir alarm ayarladıysanız ancak telefon 7:45 ile 8:45 arasında uykudaysa, telefon uyanır uyanmaz alarm verilir, ardından bir sonraki alarm gönderilir. 09:00. "Aynı gün ayarladığınızda alarm çalar. – FeanDoe

0

Kullanım setInexactRepeating yerine setRepeating

Calendar cal= Calendar.getInstance(); 
    cal.set(Calendar.HOUR_OF_DAY, 9); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    PendingIntent pi = PendingIntent.getService(context, 0, 
     new Intent(context, MyClass.class),PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 
          AlarmManager.INTERVAL_DAY, pi); 
+0

? .. – useletters

+0

u tam alarm yangın istediğinizde [geliştirici Android] (http://developer.android.com/reference/android/app/AlarmManager.html) –

+0

Yine aynı sorunla karşılaşıyor .. 'Niyet amacı = new Intent (context, AlarmReceiverActivity.class); \t \t PendingIntent pendingIntent = PendingIntent.getActivity (context, 19248, amaç, PendingIntent.FLAG_CANCEL_CURRENT); \t \t AlarmManager am = (AlarmManager) context.getSystemService (Activity.ALARM_SERVICE); \t \t am.setInexactRepeating (AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); ' – useletters

1

Kabul ettiğim yanıt kabul edildi ve yanlış anlaşıldı.

Burada görebileceğiniz gibi, çünkü yanlıştır: Calendar now = Calendar.getInstance(); Calendar alarm = Calendar.getInstance(); alarm.set(Calendar.HOUR_OF_DAY, hour); alarm.set(Calendar.MINUTE, min); alarm.set(Calendar.SECOND, sec);

"Takvim şimdi" ve "Takvim alarmı" her zaman olursa olsun yaptıklarını çünkü neyi aynı olacaktır Code.getInstance() her zaman aynı olacağından neredeyse aynı yerde koddaki aynı şey.

çözeltisi bu

long _alarm; Calendar now = Calendar.getInstance(); uzun oldtimer = now.getTimeInMillis olan(); setInexactRepeating için setRepeating ana Ne fark

cal.set(Calendar.HOUR_OF_DAY, Hours2int); 
    cal.set(Calendar.MINUTE, minutes2int); 
    cal.set(Calendar.SECOND, cur_cal.get(Calendar.SECOND)); 
    cal.set(Calendar.MILLISECOND, cur_cal.get(Calendar.MILLISECOND)); 
    cal.set(Calendar.DATE, cur_cal.get(Calendar.DATE)); 
    cal.set(Calendar.MONTH, cur_cal.get(Calendar.MONTH)); 

    //Calendar alarm = Calendar.getInstance(); 

    long newtimer = cal.getTimeInMillis(); 


    if(newtimer < oldtimer) {