2016-08-23 7 views
0

Guten Tag, ich habe an dieser Anwendung gearbeitet, die zu einer bestimmten Zeit täglich ausgeführt werden soll, außer an Wochenenden. Ich habe eine AlarmBroadCastReceiver verwendet, um einen bestimmten Codeblock zu einem bestimmten Zeitpunkt abzufeuern. Ich habe diesen Code in meiner AlarmBroadCastReceiver Klasse:Android - Alarm Manager täglicher Alarm zu einer bestimmten Zeit eingestellt?

public void SetAlarm(Context context) { 
    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); 
    intent.putExtra(ONE_TIME, Boolean.FALSE); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.set(Calendar.HOUR_OF_DAY, 2); 
    calendar.set(Calendar.MINUTE, 30); 
    calendar.set(Calendar.SECOND, 0); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 0, pi); 

} 

Grundsätzlich versuche ich, und legen Sie einen wiederkehrenden Alarm auf dieser Zeit.

dann bei einem Knopfdruck, ich habe dies in meinem MainActivity, wo ich es aus telefonieren bin:

wo alarm eine Aufgabe der AlarmBroadCastReceiver Klasse.

Das Problem, das ich damit habe, ist, dass der Code nur einmal ausgelöst wird. Sobald es 2:30 schlägt, wird es ausgelöst. Wenn ich jedoch die Zeit auf 2:29 zurückstelle und auf 2:30 Uhr warte, oder das Datum auf 1 Tag vorstelle und dann die Zeit auf 2:20 stelle und auf 2:30 warte, wird der Code nicht mehr ausgelöst.

Hat jemand dieses Problem schon einmal festgestellt? Ich habe das Gefühl, ich übersehe etwas ziemlich Einfaches in Bezug auf das Einstellen der Weckzeit, aber ich kann es jetzt nicht sehen.

Jede Hilfe wird sehr geschätzt.

Antwort

1

Sie müssen einen BroadcastReceiver einrichten, um Änderungen von Uhrzeit und Datum zu hören, und dann den Alarm zurücksetzen. Da der Empfänger immer ausgelöst werden soll, ist es besser, das Manifest zu aktivieren.

erstellen Klasse in eigener Datei

public class DateTimeChangeReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final String action = intent.getAction(); 

     if (action.equals(Intent.ACTION_TIME_CHANGED) || 
      action.equals(Intent.ACTION_TIMEZONE_CHANGED) || 
      action.equals(Intent.ACTION_DATE_CHANGED)) 
     { 
      resetAlarm(); 
     } 
    } 
} 

Und im Manifest

<receiver android:name=".DateTimeChangeReceiver "> 
    <intent_filter> 
      <action android:name="android.intent.action.TIMEZONE_CHANGED" /> 
      <action android:name="android.intent.action.TIME_SET" /> 
      <action android:name="android.intent.action.DATE_CHANGED" /> 
    </intent_filter> 
</receiver> 
+0

Während dieser Link, um die Frage zu beantworten, ist es besser die wesentlichen Teile der Antwort auf umfassen hier und auf den Link für Referenz. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/13426871) – dbmitch

+0

@dbmitch Ich habe den von Ihnen vorgeschlagenen Code hinzugefügt. Ich hatte angenommen, dass Links innerhalb von StackOverflow immer gültig oder aktualisiert sind. – lionscribe

1

Gefunden eine bessere Antwort von this answer. ihm ein bisschen Gezwickt.

public void Set12nnAlarm(Context context) { 

    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class); 
    intent.putExtra(ONE_TIME, Boolean.FALSE); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 

    // every day at 9 am 
    Calendar calendar = Calendar.getInstance(); 

    calendar.setTimeInMillis(System.currentTimeMillis()); 

    // if it's after or equal 9 am schedule for next day 
    if (Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 9) { 
     Log.e(TAG, "Alarm will schedule for next day!"); 
     calendar.add(Calendar.DAY_OF_YEAR, 1); // add, not set! 
    } 
    else{ 
     Log.e(TAG, "Alarm will schedule for today!"); 
    } 
    calendar.set(Calendar.HOUR_OF_DAY, 9); 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND, 0); 


    am.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
      AlarmManager.INTERVAL_DAY, pi); 
}