studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android alarmmanager background-process android-handler android-jobscheduler

para - manual de programacion android pdf



Programador de trabajo vs servicio de fondo (6)

Tengo una aplicación que tiene una característica A que debería ejecutarse en segundo plano cada minuto.

Eso no sucederá en cientos de millones de dispositivos Android, aquellos que ejecutan Android 6.0 o superior, debido al modo Doze (y, posiblemente, a la aplicación en espera, dependiendo del resto de la aplicación).

Pero AlarmManager parece ser un buen candidato para el problema porque cuando están permitidos existen incluso después de reiniciar el sistema

No ellos no. AlarmManager reprogramar todas las alarmas programadas con AlarmManager después de reiniciar.

Alarm Manager está diseñado para tareas que deben ejecutarse a una hora específica

AlarmManager soporta opciones de repetición.

Esto es más para tareas como la descarga en segundo plano, ya que he leído y no tengo la intención de hacer algo que he explicado.

Un Service será esencial para cualquier solución que utilice.

JobScheduler no parece ser para una tarea que debe realizarse de forma permanente, sino para tareas que cumplen una restricción específica como inactivo o sin red.

JobScheduler , como con AlarmManager , admite trabajos repetidos.

Entonces, ¿cuál de estos (u otros, si existen) recomienda usar para la tarea que expliqué en la primera parte?

No use ninguno de ellos, ya que no podrá ejecutar cosas cada minuto en Android 6.0+ una vez que el dispositivo entre en el modo Doze, que estará dentro de una hora después de que la pantalla se apague. En su lugar, rediseña la aplicación para que solo necesite trabajo en segundo plano unas cuantas veces al día, o no te molestes en escribirla.

Tengo una aplicación que tiene una característica A que debería ejecutarse en segundo plano cada minuto. La característica A es que la aplicación debe conectarse a una base de datos, leer algunos datos, obtener la ubicación actual del dispositivo y, en base a ellos, verificar una condición, si la condición es verdadera, debe enviar una notificación de barra de estado al usuario para que cuando el usuario Al hacer clic en la notificación, se mostrará la interfaz de usuario de la aplicación y sucederá algo.
Esta tarea en segundo plano debe ejecutarse permanentemente cada minuto, independientemente de que la aplicación se utilice, cierre, finalice (como Facebook o Whatsapp que nos muestren notificaciones, independientemente de que estén en la pila de aplicaciones o no).
Ahora he buscado y he encontrado que Android ofrece Programador de trabajos , Servicio en segundo plano , Administrador de alarmas y Controladores .
Pero cuanto más leo sobre ellos, más contradictorias me parecen las declaraciones.

  1. Acerca de los manejadores He leído que no existen por retrasos prolongados y se cancelarán después de reiniciar el sistema. Así que no serán apropiados para mi tarea.
  2. Pero AlarmManager parece ser un buen candidato para el problema porque cuando están permitidos existen incluso después de reiniciar el sistema y pueden volver a ejecutar la aplicación. Pero en la Documentación de Android, el Administrador de alarmas está diseñado para tareas que deben ejecutarse a una hora específica (como el Reloj de alarma). Pero mi tarea tiene que ser ejecutada cada minuto.
  3. Luego está el servicio en segundo plano. Esto es más para tareas como la descarga en segundo plano, ya que he leído y no tengo la intención de hacer algo que he explicado.
  4. JobScheduler no parece ser para una tarea que deba realizarse de forma permanente, sino para tareas que cumplan una restricción específica como inactivo o sin red ... Entonces, ¿cuál de estos (u otros, si existen) recomienda usar? Para la tarea que expliqué en la primera parte.

En las versiones anteriores de Android, las personas utilizaban Handler o servicios de fondo para este propósito. Después de un tiempo, anunciaron la clase de administrador de alarmas para trabajos permanentes programados.

Whatsapp, Facebook o algunas aplicaciones de redes sociales utilizan principalmente los mensajes de la nube de Google con fines de notificación, lo que no es útil para usted.

Te recomendaré usar el administrador de alarmas para esto. Después de la versión KitKat (4.2), el sistema operativo bloquea el controlador de fondo para un mejor uso de la batería.

Los servicios en segundo plano se utilizan principalmente para cargar imágenes o procesos pesados ​​que tienen un tiempo de finalización. Cuando está enviando un video a su amigo en Whatsapp, se inicia el proceso en segundo plano y se carga el video en el servidor backend.

No estoy seguro de que JobScheduler api admita las versiones anteriores de soporte, pero es tan bueno como el Administrador de alarmas.


Primero, un JobService es un Servicio. Un servicio en segundo plano es ambiguo, déjame adivinar que te refieres a un servicio que se ejecuta en el hilo en segundo plano. El Servicio de trabajo se ejecuta en el subproceso de la interfaz de usuario, pero puede crear un objeto de tarea asíncrona dentro de él para que se ejecute en segundo plano.

De su pregunta, JobService no es el camino a seguir. Lo que sugiero es:

  1. Puede crear una clase que amplíe IntentService (esto se ejecuta en el subproceso en segundo plano) en el método onDestroy de esa clase, enviar una difusión y hacer que la difusión reinicie el servicio.

    @onDestroy(){ Intent broadcastIntent = new Intent("com.example.myapp.serviceRestarted"); sendBroadcast(broadcastIntent);}

  2. Crear una clase que extienda el receptor de difusión

    public class RestartServiceReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { context.startService(new Intent(context, MyService.class)); } }

    1. En su manifiesto, registre su servicio y receptor.

<receiver android:name=".RestartServiceReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.example.myapp.serviceRestarted" /> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>

El permiso de inicio es permitir que el receptor se llame cuando el sistema haya terminado de iniciarse y, una vez que se llame al receptor, se volverá a llamar al servicio.


Puede usar la moderna API JobScheduler que se introdujo en Android 5.0 si su minSdkVersion = 21.

También hay https://github.com/firebase/firebase-jobdispatcher-android que requiere instalado Google Play minSdkVersion = 9

Pero recomiendo usar esta biblioteca https://github.com/evernote/android-job donde, según la versión de Android, se GcmNetworkManager JobScheduler , GcmNetworkManager o AlarmManager .

Con estas API puede programar su trabajo y ejecutar el servicio que describe la tarea.

ACTUALIZAR Ahora es mejor usar el nuevo WorkManager ( docs ). android-job será desaprobado pronto


Según this y otro enlace en el comentario 1 abajo.

Debe utilizar AlarmManager para su tarea.

Si necesita configurar alarmas que se activan mientras está en Doze, use:

setAndAllowWhileIdle() or setExactAndAllowWhileIdle().

Para obtener una explicación completa y fácil de entender sobre las diferentes formas de hacer cosas en segundo plano, lea: https://www.bignerdranch.com/blog/choosing-the-right-background-scheduler-in-android/

¡Buena suerte!


puede hacerlo usando el servicio, con el retorno de start_sticky en "START_STICKY le dice al sistema operativo que vuelva a crear el servicio después de que tenga suficiente memoria y llame a onStartCommand () nuevamente con una intención nula. START_NOT_STICKY le dice al sistema operativo que no se moleste en volver a crear el servicio. También es un tercer código START_REDELIVER_INTENT que le dice al sistema operativo que vuelva a crear el servicio y que vuelva a enviar la misma intención a onStartCommand () "

y configure un TEMPORIZADOR con un período de 1 minuto y ejecute su código.

Además, si desea reiniciar el servicio cuando el usuario lo detenga, puede hacerlo "como respuestas anteriores"

  1. Puede crear una clase que amplíe IntentService (esto se ejecuta en el subproceso en segundo plano) en el método onDestroy de esa clase, enviar una difusión y hacer que la difusión reinicie el servicio.

    @onDestroy(){ Intent broadcastIntent = new Intent("com.example.myapp.serviceRestarted"); sendBroadcast(broadcastIntent); }

  2. Crear una clase que extienda el receptor de difusión.

    public class RestartServiceReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { context.startService(new Intent(context, MyService.class)); } }

  3. En su manifiesto, registre su servicio y receptor.

    <receiver android:name=".RestartServiceReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.example.myapp.serviceRestarted" /> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>

Además, puede usar AlarmManager y si necesita configurar alarmas que se activan mientras está en Doze, use:

setAndAllowWhileIdle () o setExactAndAllowWhileIdle ().

configúrelo "hora actual en segundo + 60 segundos" para que lo configure el minuto siguiente.

y ejecute su código y, en el último, reinicie el AlarmManager al minuto siguiente.

Además, puede iniciar su servicio o AlarmManager después de reiniciar el dispositivo, solo use un brodcastReciever cuando "RECEIVE_BOOT_COMPLETED"

y pon este permiso:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />