tutorial - El AlarmManager de Android activa cada "ronda" 10 minutos
tutorial alarmmanager (4)
Agregar intervalo al segundo parámetro, es decir, triggerAtMillis, me ayudó
alarm.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis()+interval, interval, pendingIntent);
Consulte here para más detalles.
Uso el AlarmManager en mi aplicación de la siguiente manera:
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), AlarmManager.INTERVAL_HALF_DAY, intent);
Lo que esperaría disparar la alarma en algún lugar entre 12 y 24 horas desde cada disparo. Sin embargo, el comportamiento específicamente en los dispositivos HTC es bastante extraño:
Cada vez que se activa la alarma, enviamos una solicitud HTTP a nuestros servidores. En todos los dispositivos, vemos que las solicitudes llegan al servidor de manera uniforme a lo largo del tiempo, pero en los dispositivos HTC hay picos en cada "ronda" de 10 minutos (XX: 10, XX: 20, ...):
¿Cuál puede ser la causa de estos picos? ¿Y por qué sería solo en dispositivos HTC?
No podemos ver el resto de su código, pero cancela la intención anterior como se muestra a continuación:
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(context, TimeAlarm.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), AlarmManager.INTERVAL_HALF_DAY, pendingIntent);
De lo contrario, es probable que sea una mala gestión de AlarmManager por HTC, intente estas diferentes investigaciones (esto puede parecer ridículo, pero es mejor desafiar cada elemento):
- Agregue un poco de retraso a
System.currentTimeMillis()
lugar de aSystem.currentTimeMillis()
solo - Use el valor
43200000
(valor constante) en lugar deAlarmManager.INTERVAL_HALF_DAY
- Prueba this con el
Calendar
- Pruebe otros parámetros para
setInexactRepeating
No he encontrado ningún error conocido y listado en este tema. Si tus investigaciones no dan nada, probablemente no puedas hacer nada. En este caso, solo tendrá que configurar una solución alternativa para HTC que no utilice AlarmManager de esta manera.
Veo que ha intentado AlarmManager.RTC_WAKEUP, ¿podría probar AlarmManager.ELAPSED_REALTIME_WAKEUP?
Arranque su alarma ya que el teléfono se enciende con
<receiver android:name=".YourBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<action android:name="your.package.BOOT_FIRSTTIME"/>
</intent-filter>
</receiver>
Use your.package.BOOT_FIRSTTIME cuando el usuario active la alarma.
Luego, configure su AlarmManager de esta manera:
24 horas en milisegundos es 86400000
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 86400000, pendingIntent);
En primer lugar cancelar el ala anterior.
private void cancelAlarm(Context context, Class aClass) {
Intent intent = new Intent(context, aClass);
PendingIntent pintent = PendingIntent.getService(context, REQUEST_CODE, intent, FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarm.cancel(pintent);
}
Entonces crea una nueva alarma como esa
public static void setAlarmManager(Context context, Class aClass, String time) {
Intent intent = new Intent(context, aClass);
PendingIntent pintent = PendingIntent.getService(context, REQUEST_CODE, intent, FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
// alarm.cancel(pintent);
// "auto_sync":"1","sync_time":"04:05"
String timeArr[] = time.split(":");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeArr[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(timeArr[1]));
alarm.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis(), INTERVAL, pintent);
}
On Devices Alarm Manager no está bien gestionado. En ese caso, use SharedPreferences para ahorrar tiempo anterior al crear o actualizar un nuevo administrador de alarmas. ese valor guardado también es útil cuando intentará ejecutar su operación diaria.