tutorial - alarmmanager android ejemplo
AlarmManager no funciona en varios dispositivos (13)
¿Estás escuchando BOOT_COMPLETED? Debe configurar las alarmas nuevamente cuando se reinicia un dispositivo.
Mi aplicación utiliza AlarmManager y funciona desde hace 4 años. Pero noté que comenzó a fallar en algunos dispositivos.
Estoy bastante seguro de que el código es correcto (estoy usando WakefulBroadcastReceiver y configuroExactAndAllowWhileIdle para dispositivos con Doze) porque funciona perfectamente en dispositivos Nexus, pero falla en dispositivos de algunos fabricantes (Huawei, Xiaomi ...).
Los dispositivos Huawei, por ejemplo, tienen un tipo de administrador de batería que mata las aplicaciones, y cuando se mata una aplicación, se cancelan las alarmas programadas. Por lo tanto, configurar una aplicación como "protegida" en el administrador de baterías de Huawei resuelve el problema.
Pero recientemente noté que no funciona con más dispositivos: Xiaomi, Samsung (¿tal vez está relacionado con el nuevo "Smart Manager"?) ... Parece que este comportamiento se está convirtiendo en un estándar: matar aplicaciones en segundo plano.
Alguien sabe algo al respecto? ¿Alguna forma de garantizar que se dispare la alarma?
EDITAR: Este problema es causado por "ahorradores de batería" añadidos por diferentes fabricantes. Más información aquí: https://dontkillmyapp.com/
¿Qué versión de Android están ejecutando estos dispositivos?
A partir de API 23, el sistema operativo en sí entrará en un modo inactivo de baja potencia cuando no se haya utilizado durante un tiempo, y en ese modo no se enviarán alarmas.
Sin embargo, hay una manera para que las aplicaciones digan explícitamente "Necesito que esta alarma se active en este momento, independientemente del uso de la batería";
Los nuevos métodos AlarmManager se llaman
setAndAllowWhileIdle()
y
setExactAndAllowWhileIdle()
.
Según su descripción, parece que esta podría no ser la causa particular de sus problemas en ciertos dispositivos OEM, pero esto es algo que todos los desarrolladores que usan el Administrador de alarmas deben tener en cuenta.
Finalmente, muchos usos del Administrador de alarmas se abordan mejor utilizando los mecanismos del Programador de trabajos. En cuanto a la compatibilidad con versiones anteriores, el "GCM Network Manager" de Play Services está realmente muy cerca del Job Scheduler en cuanto a funcionalidad, ya que utiliza Job Scheduler internamente en las versiones más recientes de Android, y no se trata necesariamente de redes, a pesar del nombre de la clase.
Dejé de usar AlarmManager hace un tiempo ... una alternativa mejor y más estable
- crear un servicio
- registre un BroadcastReceiver para BOOT_COMPLETED
- disparar su servicio desde el receptor
- iniciar un nuevo controlador dentro de su servicio que se repita cada X minutos ( Android: ejecutar un método periódicamente usando la llamada postDelayed () )
- compruebe si ha llegado el momento de ejecutar la tarea: ahora - tiempo de ejecución> 0 ( ¿Cómo encontrar la duración de la diferencia entre dos fechas en Java? )
- si es así, ejecute la tarea y detenga el controlador
sí ... es un dolor ... pero el trabajo se hace SIN IMPORTAR QUE
El problema es Smart Manager. Samsung tiene un administrador de batería que a veces desactiva ciertas aplicaciones para que no se ejecuten en segundo plano. Intentó "reanudar" al volver a la aplicación, pero inhabilita por completo la aplicación o puede reanudar cada 5 minutos más o menos (dependiendo de cómo Samsung la tenga).
Esto funcionaría en versiones estándar de Android, ya que no hay Samsung Manager. También puede instalar una versión personalizada de Android que tiene algunas características para habilitar SM (dependiendo de la rom).
Estaba buscando una respuesta y después de varias horas encontré esto:
https://.com/a/35220476/3174791
En resumen, es una forma de saber si su aplicación fue eliminada por ''Aplicaciones protegidas'' y esto solo funciona en dispositivos Huawei. avíseme si hay alguna solución para otros dispositivos (Samsung, Sony, Xiaomi, etc.).
Estoy tratando de resolverlo varias semanas ya. No encontré nada Huawei acaba de apagar todas las alarmas después de un tiempo. Si pongo la aplicación en la aplicación protegida en su ahorro de batería, no ayuda. Pero si cambio el nombre del paquete de mi aplicación para que contenga palabras como alarma, reloj o calendario, funciona absolutamente normal como en cualquier otro dispositivo. No entiendo cómo Google puede dar certificación para esta basura. Creo que el OEM no debería modificar la plataforma central de esa manera. Entiendo que tienen su propio protector de batería que mata la aplicación después de un tiempo, cuando el usuario no la usa. Pero esto mata las alarmas también de aplicaciones protegidas.
También estableceAlarmClock () para las alarmas de temporización exacta ayuda. Pero no es posible usar esto para pensar como actualización de widgets.
La mayoría de los dispositivos Android modernos vienen con una aplicación o mecanismo, que intenta automáticamente descubrir cómo ahorrar batería y, como resultado, puede matar ciertas aplicaciones de terceros. Esto podría resultar en la eliminación de tareas y trabajos programados (por ejemplo, las alarmas no suenan, la notificación automática no funciona, etc.). En muchos casos esto sucede completamente independiente de los mecanismos de ahorro de batería de Android, en mi caso no pude hacer más optimización de la batería cuando detecto algunos modelos de dispositivos, redirijo al usuario al administrador de inicio para incluir mi aplicación en la lista blanca
Encontraste en este enlace para cada modelo la intención de invocar https://android-arsenal.com/details/1/6771
La mayoría de los teléfonos nuevos de hoy en día incluyen algún tipo de administrador de batería / ahorro de energía que hace lo mismo que usted describió. sin contar duboosters y maestros limpios.
Creo que debe incluir un descargo de responsabilidad o preguntas frecuentes en su lista de aplicaciones / play store que indique que esta aplicación debe colocarse en excepción de su aplicación de administrador de batería para que funcione correctamente.
Necesitamos habilitar nuestra aplicación en el administrador de inicio automático en el administrador de aplicaciones, algunos teléfonos como vivo v5,
En vivo v5, podemos encontrar este menú en iManager -> Administrador de aplicaciones -> Administrador de inicio automático. Habilita nuestra aplicación aquí.
Entonces su alarma / alarmmanager activará la alarma si la aplicación se cierra o se cierra.
No creo que matar la aplicación evite que el administrador de alarmas active su aplicación.
Solo cuando "fuerza la detención" o deshabilita la aplicación, no recibe devoluciones de llamadas del administrador de alarmas.
La causa raíz podría ser otra cosa.
También en M ... setExactAndAllowWhileIdle acelera ... es decir, si programa una alarma cada 2 minutos, no se activará. .. Debe haber una ventana de 15 minutos. .
Para Xiaomi, es posible que deba habilitar AutoStart para su aplicación. Estoy tratando de hacer una lista de modificaciones de Android (generalmente del fabricante del teléfono) que pueden afectar un proceso en segundo plano. Si tiene algo nuevo, agregue una respuesta aquí Lista de asesinos de tareas de Android
También tengo una aplicación que establece alarmas. La solución es usar AlarmManager.setAlarmClock() en api> = 21. Esto no se ve afectado por doze afaik y tiene la ventaja adicional de poner un icono de reloj despertador en la bandeja del sistema.
Use AlarmManager para dispositivos <5.0 y JobScheduler para dispositivos 5.0+. No puedo decir con certeza que JobScheduler no se verá afectado por las travesuras del fabricante, pero me parece mucho menos probable, dado que Android está tratando de alejar a las personas de AlarmManager y entrar en JobScheduler.
EDITAR: Google ha presentado una solución propia para este problema llamada WorkManager . Resume múltiples marcos de programación y utiliza el más apropiado para el dispositivo.