Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android AlarmManager – RTC_WAKEUP vs ELAPSED_REALTIME_WAKEUP

¿Puede alguien explicarme la diferencia entre AlarmManager.RTC_WAKEUP y AlarmManager.ELAPSED_REALTIME_WAKEUP ? He leído la documentación pero todavía no entiendo realmente la implicación de usar uno sobre el otro.

Ejemplo de código:

  • Java.lang.SecurityException:! @Too muchas alarmas (500) registradas de pid 10790 uid 10206
  • Cancelar un AlarmManager pendienteIntent en otro pendienteintent
  • Cómo configurar múltiples alarmas usando el administrador de alarmas de android
  • ¿Qué sucede cuando inicio una alarma dos veces?
  • ¿Cuál es la definición de dormido para un dispositivo Android?
  • Cómo reiniciar la alarma si la aplicación se cierra forzada en android
  •   alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, scheduledAlarmTime, pendingIntent); alarmManager.set(AlarmManager.RTC_WAKEUP, scheduledAlarmTime, pendingIntent); 

    ¿Qué tan diferentes serán las dos líneas de código de ejecutar? ¿Cuándo se ejecutarán estas dos líneas de código entre sí?

    Aprecio tu ayuda.

  • Cómo obtener un mapa de bits de un dibujable definido en un xml?
  • Aplicación de una sola actividad
  • Eclipse ADT: nombre del proyecto "appcompat_v7" que se crea después de crear cada nuevo proyecto
  • ¿Es una buena práctica crear AsyncTask anónima para paralelo pequeño proceso de congelación conocido?
  • Google Maps API v2 con diferentes acciones de marcador
  • API de Android de Go
  • 5 Solutions collect form web for “Android AlarmManager – RTC_WAKEUP vs ELAPSED_REALTIME_WAKEUP”

    AlarmManager.ELAPSED_REALTIME_WAKEUP tipo se utiliza para activar la alarma desde el arranque:

     alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 600000, pendingIntent); 

    En realidad hará que la alarma se apague 10 minutos después de que el dispositivo arranque .

    Hay un temporizador que comienza a ejecutarse cuando el dispositivo se inicia para medir el tiempo de actividad del dispositivo y este es el tipo que activa la alarma de acuerdo con el tiempo de actividad del dispositivo.

    Mientras que AlarmManager.RTC_WAKEUP activará la alarma de acuerdo con la hora del reloj. Por ejemplo, si lo hace:

     long thirtySecondsFromNow = System.currentTimeMillis() + 30 * 1000; alarmManager.set(AlarmManager.RTC_WAKEUP, thirtySecondsFromNow , pendingIntent); 

    Esto, por otro lado, disparará la alarma en 30 segundos a partir de ahora .

    AlarmManager.ELAPSED_REALTIME_WAKEUP tipo AlarmManager.ELAPSED_REALTIME_WAKEUP se utiliza raramente en comparación con AlarmManager.RTC_WAKEUP .

    A pesar de la respuesta aceptada y actualizada, los tipos AlarmManager.ELAPSED_REALTIME * junto con SystemClock.elapsedRealtime () siempre han sido más confiables que los relojes RTC para alarmas y sincronización.

    El uso de ELAPSED_REALTIME_WAKEUP con AlarmManager dependerá de un reloj monotónico a partir del tiempo de arranque " y continúa marcando incluso cuando la CPU está en modos de ahorro de energía, por lo que es la base recomendable para el intervalo de tiempo de uso general ". Asi que,

     alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60*1000, pendingIntent); 

    Hará que su fuego PendingIntent en 1 min (60 * 1000 milisegundos).

    Considerando que, AlarmManager.RTC_WAKEUP es para el estándar de "pared" de tiempo en milisegundos desde la época. Asi que,

     alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 60*10000, pendingIntent); 

    También puede activar la alarma 60 segundos a partir de ahora, pero no de forma fiable, porque como se indica en la documentación de SystemClock :

    El reloj de pared puede ser configurado por el usuario o la red telefónica (ver setCurrentTimeMillis (largo)), de manera que el tiempo puede saltar hacia atrás o hacia adelante impredeciblemente. Este reloj sólo debe utilizarse cuando es importante la correspondencia con fechas y horas del mundo real, como en una aplicación de calendario o despertador. El intervalo o el tiempo transcurrido mediciones deben utilizar un reloj diferente. Si está utilizando System.currentTimeMillis (), considere escuchar las transmisiones ACTION_TIME_TICK, ACTION_TIME_CHANGED y ACTION_TIMEZONE_CHANGED para averiguar cuándo cambia el horario.

    Además, la pregunta solo hace referencia sólo a las alarmas de * _WAKEUP, pero también vea la documentación de AlarmManager para asegurarse de que entiende lo que proporcionan las alarmas de activación y no de despertar.

    Solo una nota. Puede obtener el tiempo de actividad de millis llamando:

     long uptimeMillis = SystemClock.elapsedRealtime(); 

    Así que si quieres disparar la alarma en 30 segundos a partir de ahora y quieres usar el reloj de tiempo de actividad en lugar del reloj normal, puedes hacer lo siguiente:

     long thirtySecondsFromNow = SystemClock.elapsedRealtime() + 30 * 1000; alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, thirtySecondsFromNow, pendingIntent); 

    Siempre que desee comprobar el tiempo transcurrido en lugar de una fecha / hora específica, es mejor utilizar el tiempo de actividad. Esto se debe a que la hora actual establecida por el usuario en el dispositivo puede cambiar si el usuario lo cambia utilizando la configuración.

    He programado este problema en mi propio proyecto de esta manera. En debajo del código que estoy usando

     AlarmManager.ELAPSED_REALTIME_WAKEUP 

    Para establecer la alarma en un momento específico. La variable 'intentionName' se utiliza en el archivo de intenciónFilter para recibir esta alarma. Porque estoy disparando muchas alarmas de este tipo. Cuando cancelo todas las alarmas. Yo uso el método de cancelar. Dado en la parte inferior.

    // para retener alarmas y cancelar cuando sea necesario

      public static ArrayList<String> alarmIntens = new ArrayList<String>(); 

    //

      public static String setAlarm(int hour, int minutes, long repeatInterval, final Context c) { /* * to use elapsed realTime monotonic clock, and fire alarm at a specific time * we need to know the span between current time and the time of alarm. * then we can add this span to 'elapsedRealTime' to fire the alarm at that time * this way we can get alarms even when device is in sleep mood */ Time nowTime = new Time(); nowTime.setToNow(); Time startTime = new Time(nowTime); startTime.hour = hour; startTime.minute = minutes; //get the span from current time to alarm time 'startTime' long spanToStart = TimeUtils.spanInMillis(nowTime, startTime); // intentName = "AlarmBroadcast_" + nowTime.toString(); Intent intent = new Intent(intentName); alarmIntens.add(intentName); PendingIntent pi = PendingIntent.getBroadcast(c, alarms++, intent, PendingIntent.FLAG_UPDATE_CURRENT); // AlarmManager am = (AlarmManager) c .getSystemService(Context.ALARM_SERVICE); //adding span to elapsedRealTime long elapsedRealTime = SystemClock.elapsedRealtime(); Time t1 = new Time(); t1.set(elapsedRealTime); t1.second=0;//cut inexact timings, seconds etc elapsedRealTime = t1.toMillis(true); if (!(repeatInterval == -1)) am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, elapsedRealTime + spanToStart, repeatInterval, pi); else am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, elapsedRealTime + spanToStart, pi); 

    Donde la función span es la siguiente:

      public static long spanInMillis(Time startTime, Time endTime) { long diff = endTime.toMillis(true) - startTime.toMillis(true); if (diff >= 0) return diff; else return AlarmManager.INTERVAL_DAY - Math.abs(diff); } 

    Función de cancelación de alarma es esta.

     public static void cancel(Context c) { AlarmManager am = (AlarmManager) c .getSystemService(Context.ALARM_SERVICE); // cancel all alarms for (Iterator<String> iterator = alarmIntens.iterator(); iterator .hasNext();) { String intentName = (String) iterator.next(); // cancel Intent intent = new Intent(intentName); PendingIntent pi = PendingIntent.getBroadcast(c, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); am.cancel(pi); // iterator.remove(); } } 

    Algunas notas importantes al elegir qué alarma utilizar : (para quién que ya lea los votos upvoted)

    El valle de la muerte RTC_WAKEUP – cambio de horario:
    Si el usuario ha cambiado manualmente el tiempo hasta el pasado, la alarma no se apagará y el futuro hará que la alarma se apague inmediatamente si sobrepasa la marca de tiempo RTC .
    No utilice esta alarma para realizar ninguna verificación del lado del cliente / trabajos importantes porque tiene la oportunidad de fallar.

    El significado de WAKEUP (Marshmallow y arriba)
    En general – no mucho. No despertará el dispositivo cuando esté idle o mientras alarmManager.setExactAndAllowWhileIdle alarmManager.setAndAllowWhileIdle , para ese alarmManager.setExactAndAllowWhileIdle o alarmManager.setAndAllowWhileIdle ( Doze & Idle )

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.