2010-06-07 24 views
6

Ich habe diesen CodeWie stelle ich einen Alarm so ein, dass er zu einer festgelegten Zeit richtig ausgelöst wird?

Calendar c = new GregorianCalendar(); 
     c.add(Calendar.DAY_OF_YEAR, 1); 
     c.set(Calendar.HOUR_OF_DAY, 23); 
     c.set(Calendar.MINUTE, 22); 
     c.set(Calendar.SECOND, 0); 
     c.set(Calendar.MILLISECOND, 0); 

     // We want the alarm to go off 30 seconds from now. 
     long firstTime = SystemClock.elapsedRealtime(); 
     firstTime += 30*1000; 
     long a=c.getTimeInMillis(); 

     // Schedule the alarm! 
     AlarmManager am = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE); 
     am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
       c.getTimeInMillis(), 1*60*60*1000, sender); 

Es ist nicht an 23 ausgeführt wird: 22h

Was mache ich falsch? Ich bemerkte firstTime und c.getTimeInMillis() unterscheidet sich sehr in Größe und Länge. Wenn ich firstTime verwende, wird der Alarm gut ausgeführt, wenn er auf 30 Sekunden eingestellt ist.

+0

Ich habe das in diesem Beispiel gesehen: http://www.google .com/codesearch/p? hl = de # kZ0MkhnKNzw/trunk/Photostream/src/com/google/android/photostream/CheckUpdateService.java & q = setRepeating% 20package: http: //apps-for-android%5C.googlecode%5C .com & sa = N & cd = 1 & ct = rc – Pentium10

Antwort

10

Sie verwenden das Flag AlarmManager.ELAPSED_REALTIME_WAKEUP, aber Sie verwenden ein Kalenderobjekt. Diese beiden Dinge gehören nicht zusammen.

Sie müssen AlarmManager.RTC oder AlarmManager.RTC_WAKEUP verwenden, wenn Sie die Alarmzeit mit einem Kalender- oder Datumsobjekt angeben (Millisekunden seit 1970).

Sie verwenden AlarmManager.ELAPSED_REALTIME oder AlarmManager.ELAPSED_REALTIME_WAKEUP, wenn Sie die Alarmzeit über SystemClock.elapsedRealtime() angeben (Millisekunden seit dem Start des Telefons).

3

Um den Alarm erhalten Sie 30 Sekunden von jetzt zu gehen, verwenden

Calendar cal = Calendar.getInstance(); 

die aktuelle Zeit zu bekommen, und dann

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+30000, sender); 

Edit:

ich glaube, das Problem ist, die ELAPSED_REALTIME_WAKEUP. Dies teilt dem AlarmManager mit, dass die Zeit, die Sie ihm geben, auf der Zeit seit dem Systemstart basiert. Das ist in Ordnung für 30 Sekunden ab jetzt, aber wenn Sie möchten, dass es auf Echtzeit basiert, sollten Sie RTC oder RTC_WAKEUP verwenden. Eine vollständige Erläuterung dieser Typen finden Sie unter javadoc.

+0

Ich muss um 23:22 Uhr abgehen. Ich habe bereits eine funktionierende Lösung, um in 30 Sekunden loszulegen, das funktioniert gut. – Pentium10

+0

Ah, Entschuldigung, ich habe die Frage falsch gelesen. Siehe Bearbeiten. –

8

Ich hatte Erfolg mit dem folgenden Code, wenn Sie den Alarm für die nächste Auftreten von hh einstellen wollen: mm

Calendar cal = new GregorianCalendar(); 
    cal.setTimeInMillis(System.currentTimeMillis()); 
    cal.set(Calendar.HOUR_OF_DAY, 22); 
    cal.set(Calendar.MINUTE, 19); 
    cal.set(Calendar.SECOND, 0); 
    cal.set(Calendar.MILLISECOND, 0); 
    //check if we want to wake up tomorrow 
    if (System.currentTimeMillis() > cal.getTimeInMillis()){ 
     cal.setTimeInMillis(cal.getTimeInMillis()+ 24*60*60*1000);// Okay, then tomorrow ... 
    } 
+0

Dies ist die genaue Antwort welche Feuermelder am nächsten Tag, wenn die Zeit vergangen ist –

Verwandte Themen