onStop — ocultación de Activity en el ciclo de vida de Android

Autor: IT Sectr Publicado: 2026-03-04 Tiempo de lectura: 9 min

onStop — un método del ciclo de vida de Activity en Android, llamado por el sistema cuando la Activity deja de ser visible para el usuario. La Activity pasa al estado Stopped después de que una nueva Activity la cubre completamente, o cuando se minimiza la aplicación. En el método onStop, el desarrollador debe detener las animaciones, liberar los recursos de la cámara y los sensores, y guardar los borradores de los datos ingresados. Según Android Vitals (Google, 2025), el manejo correcto de onStop reduce la cantidad de ANR (Application Not Responding) al minimizar la aplicación en un 35%. Después de onStop, el sistema puede llamar a onRestart (volver a la pantalla) o onDestroy (terminación completa). La documentación de Android Developers sobre el ciclo de vida de Activity describe onStop como el límite entre el estado visible e invisible.

Puntos clave

  • onStop — método llamado cuando la Activity pierde completamente la visibilidad, pero la Activity todavía está en memoria.
  • Después de onStop, la Activity pasa al estado Stopped — viva en memoria, pero no visible y sin interactuar con el usuario.
  • El sistema puede llamar a onRestart → onStart → onResume al regresar a la Activity u onDestroy al finalizar.
  • En onStop es necesario liberar recursos: detener animaciones, desactivar sensores y cámara, guardar datos intermedios.
  • La implementación correcta de onStop es un factor clave para la estabilidad de la aplicación durante la multitarea y la minimización.

¿Qué es onStop en Android?

onStop — un método callback de la clase AppCompatActivity (y su predecesor Activity), llamado por el sistema operativo Android cuando la Activity deja de ser completamente visible para el usuario. En este momento, la Activity está oculta por otra Activity, una ventana de diálogo, el lanzador del sistema o la pantalla de bloqueo. Desde la perspectiva del ciclo de vida, onStop sigue a onPause e indica que la Activity ya no es visible en la pantalla, aunque el objeto Activity y su estado permanecen en la memoria.

Cuando la Activity pasa al estado Stopped (detenida), conserva su estado en la memoria RAM — todos los campos, la jerarquía de vistas y la ViewModel siguen siendo accesibles. Esto distingue Stopped del estado Destroyed (destruido), donde la Activity se elimina por completo. La interfaz de sistema puede eliminar el proceso de la aplicación en estado Stopped cuando falta memoria — esto se conoce como process death (muerte del proceso). El desarrollador debe guardar los datos críticos (borradores, posición de desplazamiento) en onSaveInstanceState(), que se llama antes de onStop, para garantizar la restauración en caso de muerte del proceso.

Según el Documento de Definición de Compatibilidad de Android (CDD) para la versión 14+, un proceso en estado Stopped tiene una prioridad reducida para ser eliminado por OOM Killer — menor que los procesos en fase Background, pero mayor que los procesos en caché. Según las estadísticas de Google, el 68% de los casos de muerte de procesos ocurren cuando la Activity está en estado Stopped, no en Paused.

¿Cuándo se llama a onStop?: escenarios y orden

onStop se llama cuando la Activity pierde completamente la visibilidad, independientemente de la razón: iniciar una nueva Activity sobre la actual, minimizar la aplicación (presionar Inicio), bloquear la pantalla, una llamada entrante o abrir un diálogo del sistema. En todos estos casos, la Activity primero recibe onPause (pérdida parcial del foco) y luego onStop (pérdida total de visibilidad).

Escenarios principales de llamada a onStop:

  • Iniciar una nueva Activity sobre la actual — la Activity actual recibe onPause, luego onStop; la nueva Activity pasa por onCreate → onStart → onResume.
  • Minimizar la aplicación (Inicio) — la Activity pasa a onPause → onStop en 200–300 ms, permanece en memoria en estado Stopped.
  • Bloquear la pantalla — el sistema llama a onPause → onStop porque la pantalla de bloqueo cubre completamente la Activity.
  • Llamada entrante — la aplicación de teléfono (Dialer) se inicia encima, la Activity actual pasa a onStop.
  • Cambiar a otra aplicación (Recientes) — la Activity se oculta, recibe onStop, pero permanece en la memoria caché de procesos.

Es importante entender que onStop no se llama al rotar la pantalla — en este caso, la Activity se destruye (onPause → onStop → onDestroy) y se recrea (onCreate → onStart → onResume). La excepción es la bandera android:configChanges="orientation" en el manifiesto, que evita la recreación de la Activity y en su lugar llama a onConfigurationChanged().

onStop en el ciclo de vida de Activity

onStop ocupa un lugar central en la secuencia del ciclo de vida de Activity entre el estado visible e invisible. La secuencia completa: onCreate → onStart → onResume → (estado activo) → onPause → onStop → onDestroy (o onRestart → onStart → onResume al regresar).

EstadoMétodoVisibilidadInteracciónMemoria
CreatedonCreateNoNoAsignada
StartedonStartParcialNoCompleta
ResumedonResumeCompletaCompleta
PausedonPauseParcialNoCompleta
StoppedonStopNoNoCompleta*
DestroyedonDestroyNoNoLiberada

*En el estado Stopped, la Activity se conserva en memoria, pero puede ser eliminada por el sistema cuando faltan recursos. La prioridad de eliminación de procesos Stopped es la penúltima, solo por encima de los procesos vacíos en caché.

onStop y onSaveInstanceState: El sistema llama a onSaveInstanceState(Bundle) antes de onStop para guardar el estado dinámico de la interfaz. El desarrollador sobrescribe este método para guardar en el Bundle los valores de los campos de entrada, la posición del RecyclerView y los elementos seleccionados. Incluso si la Activity no se destruye (el usuario simplemente minimizó y regresó), el Bundle se pasa a onCreate en cambios de configuración. Google recomienda guardar solo el estado transitorio de la interfaz — no los datos del repositorio o ViewModel, que viven fuera de la Activity.

Qué recursos liberar en onStop

En onStop, el desarrollador debe liberar todos los recursos que no son necesarios cuando la Activity no es visible. Esto reduce la carga de la batería, la CPU y la memoria, y también previene ANR al regresar a la actividad.

Qué liberar en onStop:

  • Animaciones y transiciones — detener ObjectAnimator, ValueAnimator, ViewPropertyAnimator. Las animaciones en ejecución en una Activity invisible desperdician ciclos de GPU.
  • Sensores — cancelar la suscripción de SensorManager (acelerómetro, giróscopo, magnetómetro). Los sensores consumen energía incluso cuando la Activity está oculta.
  • Cámara y micrófono — liberar Camera2 o CameraX, detener MediaRecorder. Dejar la cámara activa con la Activity oculta está prohibido por la política de Google Play.
  • LocationListener — cancelar la suscripción de FusedLocationProviderClient o LocationManager. La geolocalización es el recurso que más energía consume.
  • Listeners de red — cerrar WebSocket, cancelar solicitudes HTTP que no son necesarias en segundo plano.
  • MediaPlayer y ExoPlayer — pausar o detener la reproducción si no debe continuar en segundo plano.

Qué no hacer en onStop: No realice operaciones largas — guardar grandes cantidades de datos en la base de datos, solicitudes de red, cálculos complejos. onStop se ejecuta en el hilo principal y bloquea el regreso a la Activity. Para operaciones largas, use WorkManager con retardo o corrutinas en viewModelScope. No libere recursos de ViewModel — ViewModel sobrevive a onStop y se usará al regresar.

Diferencia entre onStop y onPause

onPause y onStop se diferencian en el grado de pérdida de visibilidad y el alcance de las acciones obligatorias. onPause se llama al perder parcialmente el foco (por ejemplo, al abrir una ventana de diálogo o un menú del sistema), onStop — al perder completamente la visibilidad. Esta diferencia es importante para elegir qué recursos liberar en cada etapa.

CaracterísticaonPauseonStop
Nivel de visibilidadParcialmente visibleCompletamente invisible
FocoPerdidoPerdido
Tiempo de ejecuciónHasta 500 msHasta 5 s (tiempo de espera ANR)
Recursos a liberarCríticos (medios, cámara)Todos los invisibles (sensores, animaciones, ubicación)
RestauraciónonResumeonRestart → onStart → onResume
Prioridad del procesoAlta (Foreground)Media (Background)

Regla general: en onPause, libere los recursos del sistema que inmediatamente afectan la experiencia del usuario de otra aplicación (cámara, reproductor multimedia); en onStop — todos los demás recursos que no son necesarios cuando la Activity está oculta. Google recomienda guardar los datos críticos del usuario (borrador de correo, configuraciones) en onPause, ya que onStop puede no llamarse durante un cambio rápido.

onStop → onRestart: volver a la pantalla

Cuando el usuario regresa a una Activity oculta, el sistema llama a onRestart → onStart → onResume. El método onRestart señala que la Activity está regresando del estado Stopped. Esta es una etapa importante para restaurar la interfaz y los recursos que se liberaron en onStop.

Secuencia de llamadas al regresar:

  • onRestart() — la Activity es notificada de que se mostrará nuevamente. Acciones típicas: recargar datos, actualizar listas.
  • onStart() — la Activity se vuelve visible pero aún no activa. Aquí se reinicializan los recursos liberados en onStop.
  • onResume() — la Activity obtiene el foco y está lista para la interacción. Se inician las animaciones, se registran los sensores.

Si el proceso de la aplicación fue eliminado por el sistema en estado Stopped, se llama a onCreate en lugar de onRestart, y el Bundle de onSaveInstanceState se pasa para restaurar el estado. Este escenario (process death) es una de las causas más comunes de errores en aplicaciones Android: los desarrolladores implementan onRestart pero olvidan considerar la restauración a través de onCreate después de la muerte del proceso.

Ejemplos de código con onStop en Kotlin

Ejemplo 1: Implementación básica de onStop con liberación de sensores

Demuestra la cancelación correcta de la suscripción a sensores y la detención de animaciones al ocultar la Activity. Al regresar a la pantalla, los recursos se restauran en onStart.

kotlin
class MainActivity : AppCompatActivity() {
    private lateinit var sensorManager: SensorManager
    private var accelerometer: Sensor? = null
    private var rotationAnimator: ObjectAnimator? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
    }

    override fun onStart() {
        super.onStart()
        accelerometer?.let {
            sensorManager.registerListener(sensorListener, it, SensorManager.SENSOR_DELAY_NORMAL)
        }
        rotationAnimator = ObjectAnimator.ofFloat(findViewById(R.id.icon), "rotation", 0f, 360f)
        rotationAnimator?.apply {
            duration = 3000
            repeatMode = ValueAnimator.RESTART
            repeatCount = ValueAnimator.INFINITE
            start()
        }
    }

    override fun onStop() {
        super.onStop()
        sensorManager.unregisterListener(sensorListener)
        rotationAnimator?.cancel()
    }

    override fun onRestart() {
        super.onRestart()
        Log.d("MainActivity", "Activity regresa del estado Stopped")
    }

    private val sensorListener = SensorEventListener { event, _ ->
        Log.d("MainActivity", "Acel: x=${event.values[0]}, y=${event.values[1]}, z=${event.values[2]}")
    }
}

El código registra el sensor de acelerómetro e inicia una animación de rotación infinita en onStart. En onStop, el sensor se desregistra y la animación se cancela — esto evita el consumo de batería cuando la Activity está oculta. Después de regresar mediante onRestart → onStart, los recursos se recrean.

Ejemplo 2: onStop con conservación de estado mediante SavedStateHandle

Un enfoque moderno que usa ViewModel + SavedStateHandle. Los datos del formulario se guardan automáticamente durante onStop sin necesidad de manejar Bundle manualmente.

kotlin
class FormViewModel(
    private val savedStateHandle: SavedStateHandle
) : ViewModel() {
    var email: String
        get() = savedStateHandle["email"] ?: ""
        set(value) { savedStateHandle["email"] = value }

    var message: String
        get() = savedStateHandle["message"] ?: ""
        set(value) { savedStateHandle["message"] = value }
}

class FormActivity : AppCompatActivity() {
    private val viewModel: FormViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_form)
        Log.d("FormActivity", "onCreate: email=${viewModel.email}")
    }

    override fun onStop() {
        super.onStop()
        Log.d("FormActivity", "onStop: datos guardados en SavedStateHandle")
    }
}

SavedStateHandle guarda automáticamente los valores en el Bundle durante onSaveInstanceState, que se llama antes de onStop. Al rotar la pantalla o en caso de muerte del proceso, los datos se restauran sin pérdida. Google recomienda SavedStateHandle para formularios y borradores en lugar de onSaveInstanceState directo.

Ejemplo 3: lifecycleScope para operaciones en onStop

Uso de lifecycleScope con corrutinas para guardar datos de forma asíncrona durante la transición a onStop. La corrutina se ejecuta en el despachador IO sin bloquear el hilo principal.

kotlin
class NoteActivity : AppCompatActivity() {
    private val noteRepository = NoteRepository()

    override fun onStop() {
        lifecycleScope.launch(Dispatchers.IO) {
            val text = findViewById<EditText>(R.id.note_content).text.toString()
            noteRepository.saveDraft(text)
            withContext(Dispatchers.Main) {
                Log.d("NoteActivity", "Borrador guardado en onStop")
            }
        }
        super.onStop()
    }
}

La corrutina lifecycleScope.launch se cancela automáticamente si el ciclo de vida de la Activity finaliza. El uso de Dispatchers.IO garantiza que la escritura en la base de datos o en un archivo no bloquee el regreso a la Activity. Según Google, las corrutinas en lifecycleScope son la forma preferida de realizar operaciones asíncronas en onStop.

Preguntas frecuentes

¿En qué se diferencia onStop de onDestroy?

onStop — la Activity deja de ser visible pero permanece en memoria en estado Stopped. El sistema puede devolver la Activity mediante onRestart. onDestroy — la Activity se destruye, la memoria se libera. Después de onDestroy, solo es posible regresar creando una nueva instancia de Activity (onCreate).

¿Es obligatorio llamar a super.onStop()?

Sí, es obligatorio. super.onStop() garantiza el funcionamiento correcto de los componentes del sistema: fragmentos, LoaderManager, ViewModelStore. Omitir super.onStop() puede causar fugas de memoria y una restauración incorrecta de fragmentos. Llame siempre a super.onStop() al final o al principio — el orden no es crítico, pero la llamada es obligatoria.

¿Cómo verificar que se llamó a onStop?

Use Log.d o Timber en cada método del ciclo de vida. Active el filtro de logcat por la etiqueta de su Activity. Para producción, use Android Vitals — Google recopila automáticamente métricas del ciclo de vida y muestra anomalías en Play Console. También está disponible la monitorización del ciclo de vida a través de ProcessLifecycleOwner.

¿Qué sucede si se lanza una excepción en onStop?

Una excepción no capturada en onStop provoca un Force Close de la aplicación. El sistema no captura excepciones en los callbacks del ciclo de vida. Si en onStop se realizan operaciones que pueden lanzar excepciones (operaciones con archivos, red), envuélvalas en try-catch y registre el error sin interrumpir super.onStop().

¿Es necesario liberar Bitmap en onStop?

No, el Bitmap en la Activity será recolectado por el GC si no hay referencias a él. La liberación forzada (recycle()) en onStop no es necesaria e incluso es perjudicial — si la Activity regresa mediante onRestart, habría que cargar el Bitmap nuevamente. Use Glide o Coil para cargar imágenes — estas bibliotecas gestionan automáticamente el caché y el ciclo de vida.

Resumen

  • onStop — método del ciclo de vida de Activity llamado al perder completamente la visibilidad. La Activity permanece en memoria en estado Stopped.
  • Después de onStop, son posibles dos escenarios: onRestart (volver a la pantalla) u onDestroy (destrucción de la Activity).
  • En onStop, debe liberar sensores, animaciones, cámara, listeners de ubicación — todo lo que no es necesario cuando la Activity está invisible.
  • onStop se diferencia de onPause en el nivel de visibilidad: onPause — pérdida parcial, onStop — pérdida completa de visibilidad.
  • onSaveInstanceState se llama antes de onStop — úselo para guardar el estado transitorio de la interfaz.
  • Corrutinas de lifecycleScope con Dispatchers.IO — la forma preferida para operaciones asíncronas en onStop.
  • Llame siempre a super.onStop() y envuelva las operaciones peligrosas en try-catch para evitar Force Close.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también