Sei sulla pagina 1di 7

Servicios de fondo para

Android
Decidí escribir este artículo después de una larga lucha en la
ejecución de tareas en segundo plano en Android, lo que me
llevó cerca de un mes para encontrar la mejor manera posible
de administrar las tareas en segundo plano. He intentado
muchos métodos y voy a discutir todos mis hallazgos para
ayudar a cualquier otro desarrollador de Android que pueda
estar atrapado en el mismo problema también.

Métodos de ejecución de tareas en


segundo plano.
1. Servicios
2. Planificador de trabajo
3. Distribuidor de trabajo Firebase
4. Servicio de Intención + Gestor de Alarmas.

Permítanme dar una breve introducción para cada uno de los


siguientes enfoques

Servicio: un servicio es un componente que se ejecuta en


segundo plano, sin interacción directa con el usuario. Como el
servicio no tiene interfaz de usuario, no está vinculado al ciclo
de vida de una actividad. Los servicios se utilizan para
operaciones de larga ejecución repetitivas y potenciales, la
comprobación de nuevos datos, procesamiento de datos,
indexación de contenidos, etc .

Intención Servicio -La IntentService clase proporciona una


estructura sencilla para la ejecución de una operación en un
solo hilo de fondo. IntentService se ejecuta fuera de la
aplicación en un proceso en segundo plano, por lo que el
proceso se ejecutará incluso si su aplicación está cerrada.

Limitaciones del Servicio de Intención

 No puede afectar la interfaz de usuario directamente desde


este servicio en segundo plano.
 Las solicitudes se manejan en un solo subproceso de
trabajo y procesan solo una solicitud a la vez.
 No puede cancelar fácilmente un servicio de intención una
vez que inicie uno

Intención Servicio Vs AsyncTask

Un punto común de confusión es cuándo usar una AsyncTask y


cuándo usar un IntentService. Una AsyncTask está
estrechamente vinculada a una Actividad en particular. En
otras palabras, si la Actividad se destruye o la configuración
cambia, AsyncTask no podrá actualizar la interfaz de usuario
una vez finalizada. Para las tareas de fondo breves de una sola
vez estrechamente unidas a la actualización de una Actividad,
deberíamos usar una AsyncTask. Un buen ejemplo es para una
segunda solicitud de red que llenará los datos en un ListView.
IntentServiceestá orientado a tareas de ejecución más
prolongadas que deben ejecutarse en segundo plano,
independientemente de la actividad que se encuentre abierta y
que se esté viendo actualmente. La actividad se puede cambiar
o la aplicación se puede pausar y la
aplicación IntentServicecontinuará ejecutándose en segundo
plano. Para tareas de ejecución más prolongadas que son
independientes de una Actividad en particular, use
IntentService.

Job Scheduler : laAPI de JobScheduler se introdujo en la


API 21. Antes de JobScheduler, teníamos laAPI
de AlarmManager que está presente desde la versión 1 de
Android. Aunque se realizaron cambios significativos en esta
API desde la versión 19, para ahorrar El mayor inconveniente
de Alarm Manager es que solo funciona en base al
tiempo. Para superar este inconveniente, Google presentó
JobScheduler, que funciona en diversas condiciones, como la
disponibilidad de la red y la carga del dispositivo.

JobScheduler es una buena noticia para todos los


desarrolladores cuya aplicación tenga una versión mínima de
SDK establecida en 21 o superior, ya que pueden usar esta API
directamente. Pero ¿qué pasa con las aplicaciones cuyo SDK
mínimo es inferior a 21 ?. Afortunadamente, hay un par de
opciones disponibles para los desarrolladores.

Firebase Job Dispachter: esta biblioteca es un


contenedor sobre GcmNetworkManager. Pero hay una gran
ventaja que tiene sobre GcmNetworkManager. Si la aplicación
Google Play Services no está instalada o la versión de la
aplicación es inferior a 7.5, entonces esta biblioteca utiliza
AlarmManager internamente para programar las tareas. Esto
puede funcionar hasta el mínimo de SDK 9. Al igual que en
GcmNetworkManager, esta biblioteca usa el JobScheduler del
marco si la aplicación se ejecuta en Lollipop y superior.

Intención de Sevice + Alarm Manager : después de


semanas de intentar trabajar con servicios, programador de
tareas y despachador de tareas de base de fuego, pude utilizar
el servicio de intenciones en combinación con el administrador
de alarmas para manejar las tareas en segundo plano en
Android, que funciona bien en todas las circunstancias.

¿Por qué Intención Service + Alarm


Manager?
1. Para los servicios es que se ejecutan en el subproceso
principal y los servicios pueden eliminarse en cualquier
momento en que se interrumpa la actividad que inició el
servicio. Pero para el servicio intencional, se ejecuta en el
hilo de fondo, lo que significa que incluso cuando las
actividades se destruyen, el servicio intencional no se
destruirá
2. Para el programador de tareas y el despachador de tareas
de base de fuego, configuran una tarea para que se ejecute
una hora en el futuro que puede dejar de funcionar si en el
momento establecido el dispositivo si es. Para este caso
(Intent Service + Alarm Manager) tenemos la alarma que
ahora activa la ejecución de la tarea a la hora
establecida. Cuando el dispositivo está apagado, la tarea se
pondrá en cola y se ejecutará una vez que el dispositivo esté
encendido. En cuanto al administrador de alarmas, puede
reiniciar las alarmas cuando el dispositivo se enciende o
reinicia.
3. Bajo el capó, el servicio de intención utiliza el hilo del
controlador para realizar las tareas en segundo plano, lo
que le ahorra el ajetreo de tener que crear una AsyncTask
para manejar los procesos en segundo plano.
AndroidBackgroundServices
proyecto de demostración
Creé un proyecto de muestra para demostrar el uso del servicio
de intención y el administrador de alarmas para crear una
tarea recurrente.

En este proyecto, quiero mostrar un mensaje de brindis cada


15 minutos. Puede agregar toda su funcionalidad compleja más
tarde, después de obtener el concepto completo, pero hasta el
momento es para fines de demostración. No hay muchas
características de interfaz de usuario. Es solo una actividad
que, cuando se crea, crea una alarma que luego activa el
servicio de intento para que funcione. Voy a explicar los bits
más significativos.

Creando un IntentService
Primero, define una clase dentro de su aplicación que
extiende IntentServicey define onHandleIntentla tarea que describe
el trabajo a realizar cuando se ejecuta este intento:

Ahora podemos usar este servicio dentro de nuestra


aplicación.

Registrando el IntentService
Cada servicio debe estar registrado en el manifiesto para
su aplicación:

<application
android: icon = "@ drawable / icon"
android: label = "@ string / app_name">

<service
android: name = ". BackgroundService"
android: export = = false "/>
<application />
Observe que especificamos esto en el archivo de manifiesto con
el conjunto de propiedades namey exported. exportedDetermina si el
servicio puede ser ejecutado por otras aplicaciones.

Ejecutando el IntentService
En este caso, vamos a crear una alarma que, cuando se activa,
inicia el servicio de intento.

En el código anterior creamos una alarma que se repite cada 15


minutos. El ToastBroadcastReceiver es una clase que extiende
BroadCastReceiver. En el método OnReceive de esta clase es
donde iniciamos el servicio de intento de la siguiente manera:

Ahora que el servicio está en funcionamiento, veamos cómo


nos comunicaremos con la actividad para enviar una respuesta
desde el servicio interno. Vamos a utilizar BroadCastReceiver
para mostrar los mensajes de brindis. El BroadCastReceiver
recibirá las transmisiones del servicio como se demostró
anteriormente en la clase de servicio interno donde enviamos
la transmisión con el mensaje " Estoy en ejecución después de
15 minutos ".

Recuerde que el servicio de atención al cliente no funciona en


el hilo principal, por eso estamos usando el receptor de
transmisión para mostrar el mensaje de brindis. Todo está casi
listo ahora que tenemos algunas cosas que hacer con nuestro
receptor de difusión amplia. Tenemos que registrarlo en el
manifiesto al igual que nuestro servicio intencional

<receptor
android: name = ". ResponseBroadcastReceiver"
android: process = ": remote">
</receiver>
Tenga en cuenta que tenemos dos receptores de difusión en
nuestro caso, asegúrese de que todos ellos estén registrados en
el manifiesto como se muestra arriba. (Tenga en cuenta que
debemos definirlo android:process=":remote"para que
BroadcastReceiver se ejecute en un proceso separado para que
continúe vivo La aplicación se ha cerrado. Finalmente,
permitimos registrar el ResponseBroadcastReceiver en nuestra
HomeActivity para obtener el brindis.

IntentFilter intentFilter = nuevo IntentFilter ();


intentFilter.addAction (CallLogService. ACTION );
registerReceiver (broadcastReceiver, intentFilter);

Registre el receptor de difusión de respuesta en el método


onCreate y también en el método onResume. Y eso es todo lo
que tienes que hacer. El proyecto completo de demostración
está en github:

Potrebbero piacerti anche