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: 0Device 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: 1Device 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: 1Device 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