tutorial - ¿Cómo usar Android AlarmManager con pequeños intervalos como 1 minuto?
service android (3)
Quiero hacer un monitor de servicio externo y recibir notificaciones sobre problemas lo más rápido posible.
Intenté configurar AlarmManager
con un intervalo de 1 a 2 minutos, pero parece que se dispara al azar cada varios minutos.
Por supuesto, quiero estar a salvo de matar mi tarea de fondo por Android, lo que dejaría de monitorear si solo uso el Service
.
¿Es posible utilizar AlarmManager
en intervalos pequeños y precisos?
¿Qué enfoques se utilizan en aplicaciones como Facebook o Gmail para notificar acerca de mensajes nuevos?
¿Sería mejor hacer el Service
con startForeground
y WakeLock
parcial?
Intenté configurar AlarmManager con un intervalo de 1 a 2 minutos, pero parece que se dispara al azar cada varios minutos.
Como decidió no mostrar cómo "configuró AlarmManager con un intervalo de 1 a 2 minutos", será difícil que alguien lo ayude. Lea la documentación de AlarmManager
y tenga en cuenta el comportamiento predeterminado inexacto nuevo en Android 4.4.
Quiero estar a salvo de matar mi tarea de fondo por Android, lo que dejaría de monitorear si solo uso el Servicio.
AlarmManager
no resuelve todos los problemas en este sentido. Por ejemplo, si el usuario elige forzar la detención de su aplicación (por ejemplo, a través de Configuración), sus alarmas se eliminan.
¿Es posible utilizar AlarmManager en intervalos pequeños y precisos?
Use setRepeating()
en Android 1.0-4.3 y setExact()
en Android 4.4+. Con setExact()
, como parte del procesamiento de un evento de alarma, deberá programar el próximo evento de alarma.
¿Sería mejor hacer el servicio con StartForeground y WakeLock parcial?
Solo si su dispositivo está siempre enchufado a la corriente (por ejemplo, monitor de proceso industrial).
Publicar un fragmento de código que hemos utilizado. Modifique según su requisito. Lo usamos por cada 15 segundos y funciona.
public class AlarmManagerBroadcastReceiver extends BroadcastReceiver
{
private static final int _REFRESH_INTERVAL = 60 * 1; // 1 minutes
// Alarm id
private static final int ALARM_ID = 102; // This can be any random integer.
PendingIntent pi = null;
AlarmManager am= null;
@Override
public void onReceive(Context context, Intent intent)
{
/* All actions to be handled here.. */
}
// This is to initialize the alarmmanager and the pending intent. It is done in separate method because, the same alarmmanager and
// pending intent instance should be used for setting and cancelling the alarm.
public void SetContext(Context context)
{
this.context = context;
am=(AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
pi = PendingIntent.getBroadcast(context, ALARM_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
// Setting the alarm to call onRecieve every _REFRESH_INTERVAL seconds
public void SetAlarm()
{
// am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * _REFRESH_INTERVAL , pi);
try
{
am.cancel(pi);
}catch (Exception ignored){}
am.setRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime(), 1000 * _REFRESH_INTERVAL , pi);
}
// Cancel the alarm.
public void CancelAlarm()
{
am.cancel(pi);
}
}
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 30);
Intent intent = new Intent(MainActivity.this, YourClass.class);
PendingIntent pintent = PendingIntent.getService(MainActivity.this,
0, intent, 0);
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
60* 1000, pintent);