Programación de alarma por segundo en android 5.1

Quiero ejecutar el servicio de alarma por cada segundo en mi aplicación. Está trabajando muy bien por debajo de la versión 5.1. Pero no está desencadenando en dispositivos 5.1. Estoy usando commonsware servicio wakeful intención.El mensaje logcat está diciendo que " Intervalo sospechosamente corto 1000 millis, la expansión a 60 segundos ". ¿Cómo puedo votar por cada segundo en 5.1? ¿Puede alguien sugerirme cómo lograr esto?

Explicación un poco más:

Mi caso de uso es que tengo que hacer algo de operación por cada intervalo de 30 minutos. AFAIK Para esto El uso del administrador de alarmas es una manera eficiente, pero aquí

1) Tengo que mostrar el temporizador de cuenta atrás al usuario. (Tarea del temporizador, cuenta atrás temporizador, ScheduledExecutorService es bastante útil para esto)
2) Necesito notificar al usuario por cada 30minutes (vía la notificación) incluso si la aplicación está en fondo. (El servicio de alarma es bastante para esto)

Pero aquí mi problema es cuando la aplicación está en segundo plano, cuando usted desliza hacia fuera la aplicación de recents (es decir, el proceso de aplicación es asesinado) ninguno de los servicios o temporizadores, manejadores, servicios de ejecutor no funcionará). En este caso, ¿cómo puedo notificar al usuario después de completar 30 minutos. Por favor, me guía si estoy pensando en forma incorrecta.

Gracias,
Chaitanya

Este es un comportamiento normal en Android Lollipop.

Intervalo sospechosamente corto 1000 milis; Expandiéndose a 60 segundos

Le dice que el sistema ya no le gusta esos cortos intervalos de tiempo.

El número # 161244 documentó que:

Esto está funcionando como se pretende, aunque en la actualidad está insuficientemente documentado (y estamos conscientes de ese lado del problema).

Hablando de manera muy general: las alarmas de corto plazo y próximas al futuro son sorprendentemente costosas en batería; Las aplicaciones que requieren trabajo de corto plazo o de futuro próximo deben utilizar otros mecanismos para programar su actividad.

Así que no use un AlarmService para esto. Preferir un hilo o Executors o TimerTask o algo más:

 // Using Handler new Handler().postDelayed(runnable, TimeUnit.SECONDS.toMillis(1)); // Using Executors Executors.newSingleThreadScheduledExecutor().schedule(runnable, 1, TimeUnit.SECONDS); 

¿Por qué harías eso?
Utilice un manejador en su lugar:

 Runnable runnable = new Runnable() { @Override public void run() { // do your stuff here, called every second mHandler.postDelayed(this, 1000); } }; // start it with: mHandler.post(runnable); 

Y utilice lo siguiente para detener su temporizador de 1 seg:

 mHandler.removeCallbacks(runnable); 

No entiendo exactamente su caso de uso, pero establecer la alarma para cada segundo es excesivo. Puede utilizar el temporizador . Echa un vistazo a esta clase.

Este es un problema informado para Android 5.1 que sucede cada vez que intenta establecer una alarma para un intervalo inferior a 60000 milisegundos.

Esta advertencia ocurre porque establecer un intervalo muy bajo como este drenará su batería muy rápidamente.

El miembro del proyecto en la plataforma dijo:

Hablando de manera muy general: las alarmas de corto plazo y próximas al futuro son sorprendentemente costosas en batería; Las aplicaciones que requieren trabajo de corto plazo o de futuro próximo deben utilizar otros mecanismos para programar su actividad.

Es por eso que no se recomienda utilizar la Alarm en su caso.

De acuerdo con su actualización de preguntas. Desea mantener el servicio de fondo despierto incluso si el usuario lo borró manualmente de la lista de aplicaciones recientes. Esto se puede hacer de forma sencilla utilizando el indicador START_STICKY como el siguiente. Agregue este código a su servicio en el método onStartCommand :

 @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("LocalService", "Received start id " + startId + ": " + intent); // We want this service to continue running until it is explicitly // stopped, so return sticky. return START_STICKY; } 

Fuente: respuesta

Utilice tanto 1 como 2:

  • Utilice el AlarmManager para el papel de alertar al usuario cada 30 minutos

  • Si la actividad en la que necesita mostrar actualizaciones está en primer plano, entonces también haga algo barato, como postDelayed() , para dar al usuario actualizaciones periódicas en esa actividad

Pruebe estos pasos.

  1. Utilice un periódico Alarmmaager después de 1 min
  2. Dentro de ese administrador de alarmas usa un manejador que llama después de unos segundos y realiza tu tarea.

Recuerda

No es una buena idea, ya que el administrador de alarma no es consciente de la situación actual del dispositivo, por ejemplo, no considera si el dispositivo está conectado a un enchufe de alimentación, inactivo o conectado a una red También el administrador de alarmas de residuos Porque su no se preocupa cuando el dispositivo tiene más recursos disponibles.

He cambiado con éxito el intervalo mínimo de AlarmManager de 1 minuto a 30 segundos.

En su dispositivo, copie /system/framework/services.jar en su computadora. Extraiga classes.dex de él, abra con Winrar por ejemplo.

Descargar baksmali

Java -jar baksmali.jar -o extractfolder classes.dex

Edit extractfolder \ com \ android \ servidor \ AlarmManagerService $ Constants.smali

Reemplazar todos los valores 0xea60 (60000ms / 1min en hexadecimal) a cualquier ms que desee que el intervalo mínimo sea ejemplo 30seconds 0x7530

Guardar y Smali de nuevo a classes.dex

Java -Xmx512M -jar smali.jar extractfolder -o class.dex

Abra services.jar nuevamente en Winrar, elimine classes.dex y arrastre el nuevo classes.dex en services.jar.

Copiar de nuevo a /system/framework/services.jar

Reiniciar el dipositivo.

También en mi dispositivo Samsung, tener la alarma de palabra o alerta (no probado) en el nombre del paquete lo agrega a una lista blanca. Mis alarmas se disparan exactamente cuando hago esto.

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