2016-06-13 10 views
7

Dies ist vielleicht eine wiederholte Frage hier, aber ich bin immer noch mit Problemen konfrontiert, hoffe, dass es eine Lösung gibt. Danke im Voraus.Wie eine Android-Funktion alle 15 Minuten und speziell auf der 15-Minuten-Marke jeden Tag ausführen?

Wie stelle ich den Alarmmanager so ein, dass er ausgeführt wird, um die Funktion speziell alle 15 Minuten auszuführen, zum Beispiel 8:00, 8:15, 8:30, 8:45, 9:00 täglich unabhängig davon, wann die Anwendung gestartet wurde.

Nehmen wir ein Beispiel, wenn ich sagen würde, dass ich meine Anwendungshauptaktivität um 7:47 gestartet habe, und ich möchte, dass der Alarm um 8:00 beginnt, gefolgt von 8:15, 8:30 und etc ... .wie soll ich es machen? Ich würde wirklich schätzen, wenn irgendwelche Vorschläge gegeben werden ..

+0

Ich denke, Sie müssen zwei Alarm-Manager statt einer einrichten. – pooyan

+0

Dies ist auf Android 6.0 und höher unpraktisch. Der Doze-Modus verhindert eine solch präzise Steuerung des Timings, es sei denn, der Benutzer fügt Ihre App der Akku-Optimierungs-Whitelist hinzu. Ich rate Ihnen dringend, Ihre App so zu gestalten, dass keine Hintergrundarbeit erforderlich ist, ganz zu schweigen von dieser Präzision. – CommonsWare

+0

@CommonsWare, danke für den Kommentar, verstanden, dass dies für höhere Versionen der Android-Plattform unpraktisch ist, jedoch arbeite ich derzeit an einem proprietären Gerät unter Android 2.3, wo das Gerät auf Power-Modus verlassen wird, daher wird die App ausgeführt werden top 24 × 7 muss daher so langwierige Arbeit haben, haben Sie irgendwelche Vorschläge für solche Situationen? – XXX

Antwort

1

Sie sollten Setup zwei Alarm :) funktioniert verwalten Legen Sie für die erste Zeit die Auslösezeit fest, indem Sie die verbleibende Zeit zu Ihrer geeigneten Zeit berechnen (zum Beispiel 8:00 Uhr morgens). Danach sollten Sie innerhalb des ersten Alarmmanagers einen weiteren Alarmmanager erstellen, der alle 15 Minuten ausgelöst wird.

für berechnen Zeit eingestellt ersten Alarmmanager unten den Code verwenden:

Calendar c = Calendar.getInstance(); 
int m = calendar.get(Calendar.MINUTE); 
long start = System.currentTimeMillis(); 
int remain=0; 
if (m<15) 
{ 
remain = 15-m; 
} 
else if (m<30) 
{ 
remain = 30-m; 
} 
else if (m<45) 
{ 
remain = 45-m; 
} 
else 
{ 
remain = 60-m; 
} 
remain=start + remain*60*1000// convert it to milisecond and plus it to current time; 

bearbeiten

und danach können Sie Code unten einrichten ersten Alarmmanager verwenden:

AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context, FirstReceiver.class); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 
    am.set(AlarmManager.RTC_WAKEUP,remain, pi); 

so jetzt in Ihrer FirstReceiver-Klasse tun Sie etwas wie unten:

+0

Danke für den Vorschlag, das klingt nach einer möglichen Lösung, hast du ein Beispiel dafür? – XXX

+0

Ich habe es nicht implementiert, aber wenn Sie wollen, dass es klarer ist, kann ich etwas Pseudo-Code bringen. – pooyan

+0

@XXX Ich bearbeite meine Antwort, um zu zeigen, wie die erste Alarmzeit berechnet wird. – pooyan

1

Besser einen Wecker für jedes Mal festlegen, die Sie mit einem Tag Abstand

public void setAlarm(Context context) { 
    AlarmManager am =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Intent i = new Intent(context, Alarm.class); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, yourTimeInMilisecond, 24 * 60 * 60 * 1000, pi); // Millisec * Second * Minute 
} 

Hier wollen yourTimeInMillisecond ist die Zeit, die Sie wollen, Alarm setzen, wie wenn Sie Alarm für morgen 9.00 Uhr setzen, dann wird es sein:

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 9); 
calendar.set(Calendar.MINUTE, 0);  
calendar.add(Calendar.DAY_OF_YEAR, 1); 
long yourTimeInMilisecond = calendar.getTimeInMillis(); 

Hoffe, dass es für Sie

+0

Danke für die Vorschläge, aber es gibt keine spezielle Zeit, um den Alarm einzustellen, ich möchte die Funktion am Anfang meiner Aktivität ausführen ... wenn also meine Aktivität um 7:47 beginnt, ist es immer noch nicht die 15-Minuten-Marke noch, und ich wollte nur die Funktion um 8:00 sharp ausgeführt werden – XXX

+0

@Neo Es wäre sauberer zu verwenden "DateUtils.DAY_IN_MILLIS" anstatt Zeit in Millisekunden selbst zu berechnen. –

-1
PendingIntent pendingIntent = PendingIntent.getBroadcast(
    this.getApplicationContext(), 234324243, intent, 0); 

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() 
    + (time limits), pendingIntent); 
+0

Eine Erklärung wäre toll. –

+0

Ohne irgendwelche Erklärungen, was der Code tut, oder irgendeine Begründung für den Vorschlag dieses Ansatzes, ist diese Antwort nicht hilfreich. Als nächstes wird die Person den Code kopieren und einfügen und Probleme bekommen, weil Sie keine Erklärung geliefert haben. Aber das war deine erste Antwort, also schau bitte auf [einige Tipps, wie du deine Antwort großartig machen kannst] (http://stackoverflow.com/help/how-to-answer). – ishmaelMakitla

Verwandte Themen