AlarmManager случайно повторяет сигнал тревоги, когда телефон не используется

Я называю фонService с интервалом 30 минут для считывания широты / долготы текущего местоположения и отправки его на сервер через POST API.

я используюsetRepeating() методAlarmManager Класс для планирования будильника каждые 30 минут. Но иногда сигнал тревоги пропускается, и сервис не вызывается. Чтобы отслеживать, вызывается или нет сигнал тревоги каждые 30 минут, я создал файл Log.txt в SDCard. При каждом вызове будильника запись о текущем времени будет записана в файл Log.txt. Но после сравнения от 4 до 5 устройств в файлах Log.txt я заметил, что для некоторых устройств тревога не вызываетonCreate() методUserTrackingReceiver.java (Фоновая служба). Полные фрагменты кода, упомянутые ниже.

Когда приложение запускаетсяregisterUserTrackingReceiver() Метод был вызван ниже:

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 ниже:

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();
    }
}

ВUtil.java естьappendLog() метод, который ниже:

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();
        }
}

Если сигнал тревоги вызывается каждые 30 минут в соответствии с приведенным выше кодом, он должен быть записан в файле Log.txt на SDCARD. Но проблема в том, что он не может записывать файл журнала каждые 30 минут, что означает отсутствие тревоги. Что касается чтения в течение двух дней, я заметил, что будильник не пропадает в дневное время, поскольку пользователь постоянно использует свой телефон, но он пропускается ночью, когда телефон не используется.

Из приведенных лог-файлов с разных устройств ниже:

Устройство A Log.txt

Отслеживание тревоги: 0: 0: 31 (начало с 12:00 ночи)Отслеживание тревоги: 1: 10: 27Отслеживание тревоги: 3: 5: 25Отслеживание тревоги вызвано: 6: 55: 31Отслеживание тревоги вызвано: 7: 0: 6Отслеживание тревоги вызвано: 7: 30: 0Отслеживание тревоги вызвано: 8: 0: 6Отслеживание тревоги вызвано: 8: 30: 0Отслеживание тревоги вызвано: 9: 0: 6Отслеживание тревоги вызвано: 9: 30: 0Отслеживание тревоги вызвано: 10: 0: 0

Устройство B Log.txt

Отслеживание тревоги: 0: 0: 27 (начало с 12:00 ночи)Отслеживание тревоги вызвано: 0: 30: 1Отслеживание тревоги вызвано: 1: 0: 1Отслеживание тревоги вызвано: 1: 30: 2Отслеживание тревоги вызвано: 2: 0: 1Отслеживание тревоги вызвано: 2: 30: 1Отслеживание тревоги вызвано: 3: 0: 1Отслеживание тревоги вызвано: 3: 30: 1Отслеживание тревоги вызвано: 4: 0: 1Отслеживание тревоги вызвано: 4: 30: 29Отслеживание тревоги вызвано: 5: 0: 1Отслеживание тревоги вызвано: 5: 30: 2Отслеживание тревоги вызвано: 6: 0: 30Отслеживание тревоги вызвано: 6: 30: 1Отслеживание тревоги вызвано: 7: 0: 1Отслеживание тревоги вызвано: 7: 30: 1Отслеживание тревоги вызвано: 8: 0: 1Отслеживание тревоги вызвано: 8: 30: 1Отслеживание тревоги вызвано: 9: 0: 32Отслеживание тревоги вызвано: 9: 30: 1

Устройство C Log.txt

Отслеживание тревоги: 0: 0: 7 (начало с 12:00 ночи)Отслеживание тревоги вызвано: 0: 30: 3Отслеживание тревоги вызвано: 1: 0: 6Отслеживание тревоги вызвано: 1: 30: 1Отслеживание тревоги вызвано: 2: 0: 32Отслеживание тревоги вызвано: 2: 30: 3Отслеживание тревоги: 3: 1: 50Отслеживание тревоги вызвано: 3: 30: 5Отслеживание тревоги: 4: 1: 58Отслеживание тревоги: 4: 31: 14Отслеживание тревоги вызвано: 5: 0: 1Отслеживание тревоги вызвано: 5: 30: 1Отслеживание тревоги вызвано: 6: 2: 1Отслеживание тревоги вызвано: 6: 30: 1Отслеживание тревоги вызвано: 7: 0: 1Отслеживание тревоги вызвано: 7: 30: 1Отслеживание тревоги вызвано: 8: 0: 1Отслеживание тревоги вызвано: 8: 30: 4Отслеживание тревоги вызвано: 9: 1: 44Отслеживание тревоги вызвано: 9: 30: 1

Устройство D Log.txt

Отслеживание тревоги: 0: 1: 25 (начало с 12:00 ночи)Отслеживание тревоги вызвано: 0: 30: 0Отслеживание тревоги: 1: 31: 41Отслеживаемая тревога. Вызов: 2: 39: 52.Отслеживание тревоги вызвано: 3: 0: 25Отслеживание тревоги: 3: 30: 58Отслеживание тревоги вызвано: 4: 0: 25Отслеживание тревоги: 4: 30: 56Отслеживание тревоги вызвано: 5: 30: 51Отслеживание тревоги вызвано: 7: 18: 55Отслеживание тревоги вызвано: 7: 30: 0Отслеживание тревоги вызвано: 8: 0: 25Отслеживание тревоги вызвано: 8: 30: 43Отслеживание тревоги вызвано: 9: 0: 3Отслеживание тревоги вызвано: 9: 30: 25Отслеживание тревоги вызвано: 10: 0: 25Отслеживание тревоги вызвано: 10: 30: 4Отслеживание тревоги: 11: 1: 52Отслеживание тревоги: 11: 30: 27Отслеживание тревоги вызвано: 12: 1: 6⁠⁠⁠⁠

Ответы на вопрос(3)

Ваш ответ на вопрос