AlarmManager Alarmwiederholung fehlt zufällig, wenn das Telefon nicht benutzt wird

Ich rufe einen Hintergrund anService im Abstand von 30 Minuten, um den Breiten- / Längengrad des aktuellen Standorts zu lesen und ihn per POST-API an den Server zu senden.

Ich benutzesetRepeating() Methode vonAlarmManager class, um alle 30 Minuten einen Alarm festzulegen. Manchmal wird der Alarm jedoch übersehen und der Kundendienst wird nicht angerufen. Um zu überwachen, ob alle 30 Minuten ein Alarm ausgelöst wird oder nicht, habe ich eine Log.txt-Datei auf der SD-Karte erstellt. Für jeden angerufenen Zeitalarm wird der Eintrag für die aktuelle Zeit in die Datei Log.txt geschrieben. Aber nach dem Vergleich von 4 bis 5 Geräten Log.txt-Dateien habe ich festgestellt, dass bei einigen Geräten der Alarm nicht aufruftonCreate() Methode vonUserTrackingReceiver.java (Hintergrunddienst). Vollständige Codeabschnitte, die unten erwähnt werden.

Wenn die App startetregisterUserTrackingReceiver() Methode wurde aufgerufen, die unten ist:

public static void registerUserTrackingReceiver(Context context) {
        try {
            Intent intent = new Intent(context, UserTrackingReceiver.class);

            boolean alarmUp = (PendingIntent.getService(context, 1001, intent, PendingIntent.FLAG_NO_CREATE) == null);

            if (alarmUp) {
                Calendar calendar = Calendar.getInstance();

                if (calendar.get(Calendar.MINUTE) > 0 && calendar.get(Calendar.MINUTE) <= 30) {
                    calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY));
                    calendar.set(Calendar.MINUTE, 30);
                    calendar.set(Calendar.SECOND, 0);
                } else if (calendar.get(Calendar.MINUTE) > 30) {
                    if (calendar.get(Calendar.HOUR_OF_DAY) == 23) {
                        calendar.set(Calendar.HOUR_OF_DAY, 0);
                    } else {
                        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) + 1);
                    }
                    calendar.set(Calendar.MINUTE, 0);
                    calendar.set(Calendar.SECOND, 0);
                } else {
                    calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY));
                    calendar.set(Calendar.MINUTE, 0);
                    calendar.set(Calendar.SECOND, 0);
                }

                PendingIntent sender = PendingIntent.getService(context, 1001, intent, 0);
                AlarmManager alarmManager = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                        AlarmManager.INTERVAL_HALF_HOUR, sender);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
}

UserTrackingReceiver.java ist unterhalb

public class UserTrackingReceiver extends Service
        implements LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {

    @Override
    public void onCreate() {
        super.onCreate();

        Calendar calendar = Calendar.getInstance();
        Util.appendLog("Tracking Alarm Called on: " + calendar.get(Calendar.HOUR_OF_DAY) + " : " + calendar.get(Calendar.MINUTE) + " : " + calendar.get(Calendar.SECOND));
        stopSelf();
    }
}

Im Util.java es gibtappendLog() Methode, die unten ist:

public static void appendLog(String text) {

        String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();

        File logFile = new File(baseDir + "/" + Constant.AppNameSuper + "/log.txt");
        if (!logFile.exists()) {
            try {
                logFile.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        try {
            //BufferedWriter for performance, true to set append to file flag
            BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true));
            buf.append(text);
            buf.newLine();
            buf.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

Wenn der Alarm gemäß obigem Code alle 30 Minuten aufgerufen wird, sollte er in die Datei Log.txt in SDCARD geschrieben werden. Das Problem ist jedoch, dass nicht alle 30 Minuten eine Protokolldatei geschrieben werden kann, was bedeutet, dass der Alarm fehlt. Ich habe zwei Tage lang gelesen und festgestellt, dass der Wecker tagsüber nicht fehlt, da der Benutzer sein Telefon ständig benutzt, aber er wird nachts verpasst, wenn das Telefon nicht benutzt wird.

Ausgegebene Protokolldateien mit verschiedenen Geräten sind unten aufgeführt:

Device A Log.txt

Tracking Alarm Angerufen am: 0: 0: 31 (Beginn ab 12:00 Uhr Nacht)Tracking Alarm Angerufen am: 1: 10: 27Tracking Alarm Angerufen am: 3: 5: 25Tracking Alarm Angerufen am: 6: 55: 31Tracking Alarm Angerufen am: 7: 0: 6Tracking Alarm Angerufen am: 7: 30: 0Tracking Alarm Angerufen am: 8: 0: 6Tracking Alarm Angerufen am: 8: 30: 0Tracking Alarm Angerufen am: 9: 0: 6Tracking Alarm Angerufen am: 9: 30: 0Tracking Alarm Angerufen am: 10: 0: 0

Device B Log.txt

Tracking Alarm Angerufen am: 0: 0: 27 (Beginn ab 12:00 Uhr Nacht)Tracking Alarm Angerufen am: 0: 30: 1Tracking Alarm Aufgerufen am: 1: 0: 1Tracking Alarm Angerufen am: 1: 30: 2Tracking Alarm Angerufen am: 2: 0: 1Tracking Alarm Angerufen am: 2: 30: 1Tracking Alarm Aufgerufen am: 3: 0: 1Tracking Alarm Angerufen am: 3: 30: 1Tracking Alarm Angerufen am: 4: 0: 1Tracking Alarm Angerufen am: 4: 30: 29Tracking Alarm Angerufen am: 5: 0: 1Tracking Alarm Angerufen am: 5: 30: 2Tracking Alarm Angerufen am: 6: 0: 30Tracking Alarm Angerufen am: 6: 30: 1Tracking Alarm Angerufen am: 7: 0: 1Tracking Alarm Angerufen am: 7: 30: 1Tracking Alarm Angerufen am: 8: 0: 1Tracking Alarm Angerufen am: 8: 30: 1Tracking Alarm Angerufen am: 9: 0: 32Tracking Alarm Angerufen am: 9: 30: 1

Device C Log.txt

Tracking Alarm Angerufen am: 0: 0: 7 (ab 12:00 Uhr Nacht)Tracking Alarm Angerufen am: 0: 30: 3Tracking Alarm Angerufen am: 1: 0: 6Tracking Alarm Angerufen am: 1: 30: 1Tracking Alarm Angerufen am: 2: 0: 32Tracking Alarm Angerufen am: 2: 30: 3Tracking Alarm Angerufen am: 3: 1: 50Tracking Alarm Angerufen am: 3: 30: 5Tracking Alarm Angerufen am: 4: 1: 58Tracking Alarm Angerufen am: 4: 31: 14Tracking Alarm Angerufen am: 5: 0: 1Tracking Alarm Angerufen am: 5: 30: 1Tracking Alarm Angerufen am: 6: 2: 1Tracking Alarm Angerufen am: 6: 30: 1Tracking Alarm Angerufen am: 7: 0: 1Tracking Alarm Angerufen am: 7: 30: 1Tracking Alarm Angerufen am: 8: 0: 1Tracking Alarm Angerufen am: 8: 30: 4Tracking Alarm Angerufen am: 9: 1: 44Tracking Alarm Angerufen am: 9: 30: 1

Device D Log.txt

Tracking Alarm Angerufen am: 0: 1: 25 (ab 12:00 Uhr Nacht)Tracking Alarm Angerufen am: 0: 30: 0Tracking Alarm Angerufen am: 1: 31: 41Tracking Alarm Angerufen am: 2: 39: 52Tracking Alarm Angerufen am: 3: 0: 25Tracking Alarm Angerufen am: 3: 30: 58Tracking Alarm Angerufen am: 4: 0: 25Tracking Alarm Angerufen am: 4: 30: 56Tracking Alarm Angerufen am: 5: 30: 51Tracking Alarm Angerufen am: 7: 18: 55Tracking Alarm Angerufen am: 7: 30: 0Tracking Alarm Angerufen am: 8: 0: 25Tracking Alarm Angerufen am: 8: 30: 43Tracking Alarm Angerufen am: 9: 0: 3Tracking Alarm Angerufen am: 9: 30: 25Tracking Alarm Angerufen am: 10: 0: 25Tracking Alarm Angerufen am: 10: 30: 4Tracking Alarm Angerufen am: 11: 1: 52Tracking Alarm Angerufen am: 11: 30: 27Tracking Alarm Angerufen am: 12: 1: 6

Antworten auf die Frage(6)

Ihre Antwort auf die Frage