Middle
¿Cuál es el ciclo de vida de los servicios en Android?
sobes.tech AI
Respuesta de la IA
El servicio no tiene interfaz de usuario y funciona en segundo plano. Su ciclo de vida se gestiona mediante tres métodos principales:
onCreate(): Se llama por primera vez cuando se crea el servicio. Aquí se realiza la inicialización.onStartCommand()/ método llamado al vincularse (por ejemplo,onBind()):onStartCommand()se llama al iniciar el servicio mediantestartService(). Devuelve una bandera que indica cómo debe restaurarse el servicio si es terminado.onBind()se llama al vincular un cliente al servicio mediantebindService().onDestroy(): Se llama cuando el servicio es destruido. Aquí se liberan todos los recursos.
Existen dos tipos de servicios que afectan el ciclo de vida:
- Servicio iniciado (Started Service): Se inicia mediante
startService(). Funciona hasta que se detiene explícitamente constopSelf()ostopService(). El sistema intentará reiniciarlo después de su destrucción sionStartCommand()devolvió la bandera correspondiente. - Servicio vinculado (Bound Service): Se inicia mediante
bindService(). Existe mientras al menos un cliente activo esté vinculado. Cuando todos los clientes se desconectan, el servicio se destruye.onBind()devuelve una implementación deIBinder, que se usa para interactuar con el servicio.
Diagrama del ciclo de vida:
Start Service --+--> onStartCommand() --+--> En ejecución
| |
Bind Service ---+--> onBind() -----------+--> Vinculado
|
onCreate() -----+
|
+--> onRebind()
|
onDestroy() <---+-------------------------+---- Desvinculado <--- unbindService()
|
+---- Detenido <--- stopSelf() / stopService()
Puntos clave:
onCreate()se llama solo una vez.onStartCommand()puede llamarse varias veces sistartService()se llama repetidamente.- El servicio funciona en el hilo principal de la interfaz de usuario por defecto. Operaciones prolongadas deben realizarse en un hilo separado o usando
IntentService. - Los servicios vinculados tienen un ciclo de vida más complejo, dependiente del estado de los clientes.
Ejemplo de onStartCommand():
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Realizar alguna acción
// Por ejemplo, comenzar un trabajo en segundo plano
// Devolver la bandera que determina el comportamiento del sistema al destruir el servicio
return START_STICKY; // El servicio será restaurado si fue terminado
}
Ejemplo de onBind():
private final IBinder binder = new LocalBinder();
public class LocalBinder extends Binder {
MyService getService() {
// Devolver la instancia del servicio para los clientes
return MyService.this;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public boolean onUnbind(Intent intent) {
// Se llama cuando todos los clientes se desconectan
return super.onUnbind(intent);
}