AlarmManager schaltet Alarme zur falschen Zeit aus

Ich habe alles in Ordnung gebracht, um einen Benachrichtigungsdienst zu erstellen, der verwendet wird, um eine Benachrichtigung durch einen Alarm auszulösen. Leider ist die Einstellung des Alarms mit AlarmManager nicht richtig. Es feuert einige Minuten später (nicht genau Stunden, was auf ein Zeitzonenproblem hindeuten würde). Die wiederkehrende Periode beträgt 1 Woche, also habe ich den Konstanten INTERVAL_DAY benutzt und mit 7 vervielfacht. Um sicherzustellen, dass ein PendingIntent das andere nicht ersetzt, übergebe ich den TagOfWeek als zweiten Parameter an PendingIntent.getService (). Ich überprüfe die Korrektheit der Zeit für den Alarm zu feuern, indem Sie es protokollieren:

Log.d(TAG, "next alarm " + df.format(cal.getTime())); 

Gibt es wirklich keine Möglichkeit, alle Alarme aufzurufen – zumindest die von meiner eigenen App? Ich glaube, das ist der einzige Weg, um den Fehler aufzuspüren.

Mein Code:

 cal.setTimeInMillis(System.currentTimeMillis()); cal.add(Calendar.DATE, 1); cal.set(Calendar.HOUR_OF_DAY, hour); cal.set(Calendar.MINUTE, minute); Log.d(TAG, "next alarm " + df.format(cal.getTime())); Intent showNotificationIntent = new Intent(context, NotificationService.class); dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); alarmIntent = PendingIntent.getService(context, dayOfWeek, showNotificationIntent, 0); getAlarmManager(context).setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), INTERVAL_WEEK, alarmIntent); 

Ich möchte anbieten, um jeden Tag einen Alarm zu machen, aber zu verschiedenen Zeiten, die vom Benutzer eingestellt werden können. So verwende ich bis zu 7 Alarme, die wöchentlich abfeuern sollen.

Auch nach dem Lesen der zahlreichen Antworten auf ähnliche Fragen (ich beabsichtige nicht, eine doppelte Frage zu erstellen), habe ich es nicht geschafft, das Problem zu finden.

  • Set Wiederholen Tage der Woche Alarm in Android
  • Wiederholen Sie Alarme an jedem Montag in Android usig AlarmManager / BroadcastReceiver
  • Wie kann man debuggen, welche AlarmManager-Alarme von deiner Anwendung aus laufen?
  • Sind Android AlarmManagers weiterhin nach einer App-Aktualisierung ausgeführt?
  • 2 Solutions collect form web for “AlarmManager schaltet Alarme zur falschen Zeit aus”

    Bei Api-Werten unter 19 solltest du AlarmManager.setRepeating() und deine Alarme werden zu gegebener Zeit genau ausgelöst. Thou auf api Ebenen 19 und darüber wird nicht mehr funktionieren. Es gab eine Änderung in Android, so dass alle Wiederholungsalarme ungenau sind. Also, wenn Sie genaue Wiederholungsalarm erreichen möchten, sollten Sie den Alarm mit AlarmManager.setExact() und dann, wenn der Alarm auslöst, dies für die nächste Woche und so weiter jede Woche.

    Wegen setInexactRepeating. Verwenden Sie setRepeating und es wird zur richtigen Zeit verarbeitet.

    Anstatt von:

     setInexactRepeating 

    benutzen

     setRepeating 

    SetInexactRepeating, ist OS und batteriefreundlich, es batchs zusammen die ganze Arbeit, die auf Alarm empfangen wird und arbeitet durch eins nach dem anderen, während als setRepeating sofort den Alarm auslöst

    Auch eine Anmerkung: Alarme werden abgewischt, sobald das Telefon neu gestartet wird, müsst ihr vielleicht einen Boot-Rundfunkempfänger implementieren, um ihn hartnäckig zu machen. Vergewissern Sie sich, dass Sie diese Laufzeit nicht machen, müssen Sie es im Manifest anders implementieren, wenn Ihre App nicht im Hintergrund ist, erhalten Sie keine Sendungen.

    Ein kleines Beispiel:

    Das ist der Arbeitscode. Es weckt CPU alle 10 Minuten, bis das Telefon ausschaltet.

    Zu Manifest.xml hinzufügen:

     ... <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission> ... <receiver android:process=":remote" android:name="Alarm"></receiver> ... 

    Code:

      package YourPackage; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.PowerManager; import android.widget.Toast; public class Alarm extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, ""); wl.acquire(); // Put here YOUR code. Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example wl.release(); } 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, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute } public void CancelAlarm(Context context) { Intent intent = new Intent(context, Alarm.class); PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(sender); } } 

    Alarm aus Service setzen:

     package YourPackage; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder; public class YourService extends Service { Alarm alarm = new Alarm(); public void onCreate() { super.onCreate(); } public void onStart(Context context,Intent intent, int startId) { alarm.SetAlarm(context); } @Override public IBinder onBind(Intent intent) { return null; } } 

    Wenn du einen Alarm einstellen willst, der beim Start des Telefons wiederholt wird:

    Berechtigung zu Manifest.xml hinzufügen:

     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> ... <receiver android:name=".AutoStart"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver> ... 

    Und schaffen neue Klasse:

     package YourPackage; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class AutoStart extends BroadcastReceiver { Alarm alarm = new Alarm(); @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { alarm.SetAlarm(context); } } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.