AlarmManager repetindo alarme ausente aleatoriamente quando o telefone não está em uso

Estou chamando um plano de fundoService no intervalo de 30 minutos para ler a latitude / longitude da localização atual e enviá-la ao servidor pela API do POST.

estou usandosetRepeating() método deAlarmManager classe para agendar alarme a cada 30 minutos. Mas algumas vezes o alarme está sendo perdido e o serviço não é chamado. Para monitorar se o alarme é chamado ou não a cada 30 minutos, gerei o arquivo Log.txt no sdcard. Para cada alarme chamado a entrada para o horário atual será gravada no arquivo Log.txt. Mas depois de comparar de 4 a 5 dispositivos arquivos Log.txt, notei que em alguns dispositivos o alarme não está chamandoonCreate() método deUserTrackingReceiver.java (Serviço em segundo plano). Pedaços de código completo mencionados abaixo.

Quando o aplicativo é iniciadoregisterUserTrackingReceiver() O método foi chamado abaixo:

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 está abaixo:

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

NoUtil.java Há simappendLog() método abaixo:

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

Se o alarme for chamado a cada 30 minutos, conforme o código acima, ele deverá ser gravado no arquivo Log.txt no SDCARD. Mas o problema é que não é possível gravar o arquivo de log a cada 30 minutos, o que significa que o alarme está ausente. De acordo com a leitura realizada por dois dias, notei que o alarme não está ausente no horário diurno, pois o usuário usa o telefone continuamente, mas é perdido na noite quando o telefone não está em uso.

Os arquivos de log colocados com diferentes dispositivos estão abaixo:

Device A Log.txt

Alarme de rastreamento chamado: 0: 0: 31 (a partir das 12:00 da noite)Alarme de rastreamento chamado: 1: 10: 27Alarme de rastreamento chamado: 3: 5: 25Alarme de rastreamento chamado: 6: 55: 31Alarme de rastreamento chamado: 7: 0: 6Alarme de rastreamento chamado: 7: 30: 0Alarme de rastreamento chamado: 8: 0: 6Alarme de rastreamento chamado: 8: 30: 0Alarme de rastreamento chamado: 9: 0: 6Alarme de rastreamento chamado: 9: 30: 0Alarme de rastreamento chamado: 10: 0: 0

Device B Log.txt

Alarme de rastreamento chamado: 0: 0: 27 (a partir das 12:00 da noite)Alarme de rastreamento chamado: 0: 30: 1Alarme de rastreamento chamado: 1: 0: 1Alarme de rastreamento chamado: 1: 30: 2Alarme de rastreamento chamado: 2: 0: 1Alarme de rastreamento chamado: 2: 30: 1Alarme de rastreamento chamado: 3: 0: 1Alarme de rastreamento chamado: 3: 30: 1Alarme de rastreamento chamado: 4: 0: 1Alarme de rastreamento chamado: 4: 30: 29Alarme de rastreamento chamado: 5: 0: 1Alarme de rastreamento chamado: 5: 30: 2Alarme de rastreamento chamado: 6: 0: 30Alarme de rastreamento chamado: 6: 30: 1Alarme de rastreamento chamado: 7: 0: 1Alarme de rastreamento chamado: 7: 30: 1Alarme de rastreamento chamado: 8: 0: 1Alarme de rastreamento chamado: 8: 30: 1Alarme de rastreamento chamado: 9: 0: 32Alarme de rastreamento chamado: 9: 30: 1

Device C Log.txt

Alarme de rastreamento chamado: 0: 0: 7 (a partir das 12:00 da noite)Alarme de rastreamento chamado: 0: 30: 3Alarme de rastreamento chamado: 1: 0: 6Alarme de rastreamento chamado: 1: 30: 1Alarme de rastreamento chamado: 2: 0: 32Alarme de rastreamento chamado: 2: 30: 3Alarme de rastreamento chamado: 3: 1: 50Alarme de rastreamento chamado: 3: 30: 5Alarme de rastreamento chamado: 4: 1: 58Alarme de rastreamento chamado: 4: 31: 14Alarme de rastreamento chamado: 5: 0: 1Alarme de rastreamento chamado: 5: 30: 1Alarme de rastreamento chamado: 6: 2: 1Alarme de rastreamento chamado: 6: 30: 1Alarme de rastreamento chamado: 7: 0: 1Alarme de rastreamento chamado: 7: 30: 1Alarme de rastreamento chamado: 8: 0: 1Alarme de rastreamento chamado: 8: 30: 4Alarme de rastreamento chamado: 9: 1: 44Alarme de rastreamento chamado: 9: 30: 1

Device D Log.txt

Alarme de rastreamento chamado: 0: 1: 25 (a partir das 12:00 da noite)Alarme de rastreamento chamado: 0: 30: 0Alarme de rastreamento chamado: 1: 31: 41Alarme de rastreamento chamado: 2: 39: 52Alarme de rastreamento chamado: 3: 0: 25Alarme de rastreamento chamado: 3: 30: 58Alarme de rastreamento chamado: 4: 0: 25Alarme de rastreamento chamado: 4: 30: 56Alarme de rastreamento chamado: 5: 30: 51Alarme de rastreamento chamado: 7: 18: 55Alarme de rastreamento chamado: 7: 30: 0Alarme de rastreamento chamado: 8: 0: 25Alarme de rastreamento chamado: 8: 30: 43Alarme de rastreamento chamado: 9: 0: 3Alarme de rastreamento chamado: 9: 30: 25Alarme de rastreamento chamado: 10: 0: 25Alarme de rastreamento chamado: 10: 30: 4Alarme de rastreamento chamado: 11: 1: 52Alarme de rastreamento chamado: 11: 30: 27Alarme de rastreamento chamado: 12: 1: 6

questionAnswers(3)

yourAnswerToTheQuestion