onRestart — un método del ciclo de vida de Activity en Android, llamado por el sistema antes de que la Activity regrese del estado Stopped al estado Started. onRestart señala que una Activity, previamente oculta por otra pantalla o minimizada al fondo, vuelve a ser visible para el usuario. En onRestart, el desarrollador actualiza datos obsoletos, recarga listas y restaura el estado de la UI que pudo haber cambiado mientras la Activity estaba invisible. Según Google Android Vitals (2025), las aplicaciones que usan onRestart para actualizar datos muestran un 25% menos de casos de visualización incorrecta de información al regresar a la pantalla. Documentación de Android Developers describe onRestart como un paso preparatorio antes de que la Activity aparezca nuevamente en pantalla.
Puntos clave
onRestart — un método callback que Android llama estrictamente antes de onStart cuando una Activity regresa del estado Stopped invisible a ser visible. Este método es único porque solo se llama cuando la Activity se muestra nuevamente — durante la primera creación de la instancia, la secuencia comienza con onCreate, omitiendo onRestart. El ciclo completo: onCreate → onStart → onResume (primer inicio) u onRestart → onStart → onResume (visualización posterior).
Desde la perspectiva del sistema Android, onRestart es una optimización que permite a la Activity prepararse para su regreso: actualizar datos del repositorio, sincronizar el estado de la UI, verificar la conectividad de red. A diferencia de onResume, que se llama cada vez que la Activity obtiene el foco (incluyendo al regresar de un diálogo o menú del sistema), onRestart se activa solo durante un ciclo completo de ocultación y retorno. Esto hace de onRestart el lugar ideal para operaciones de actualización “pesadas” que no son necesarias durante una pérdida parcial del foco.
Según la especificación del ciclo de vida de Activity de Android, el intervalo de tiempo entre onStop y onRestart puede variar desde unos segundos (el usuario cambió rápidamente) hasta varias horas (la aplicación estaba en segundo plano y el usuario regresó). Durante este tiempo, los datos en una fuente remota (API, BD) podrían haber cambiado, por lo que onRestart es un punto natural para verificar la vigencia.
onRestart solo se llama cuando una Activity regresa del estado Stopped, al cual la Activity entró después de que se llamara a onStop. A continuación se enumeran todos los escenarios que conducen a onRestart.
Escenarios de invocación de onRestart:
Cuándo NO se llama a onRestart: durante la rotación de pantalla (la Activity se destruye y se recrea mediante onCreate), al regresar de un cuadro de diálogo (la Activity no entra en onStop, solo onPause → onResume), durante la muerte del proceso (la Activity se recrea).
onRestart y onCreate son dos enfoques diferentes para restaurar una Activity. La elección entre ellos depende de si la Activity fue destruida por completo o simplemente ocultada.
| Característica | onRestart | onCreate |
|---|---|---|
| Cuándo se llama | La Activity regresa de Stopped | La Activity se crea por primera vez o después de ser destruida |
| Estado conservado | Sí — ViewModel y campos están vivos | No — todo se crea de nuevo |
| Bundle | No se pasa | Se pasa (savedInstanceState) |
| Acciones típicas | Actualización de datos, refresco de UI | Inicialización de View, suscripción a LiveData |
| Frecuencia de llamada | Cada vez que se regresa | Una vez o después de la destrucción |
Regla de selección: realice la inicialización de View y la suscripción a LiveData/StateFlow en onCreate (o onViewCreated para Fragment). Las actualizaciones de datos, la recarga de listas y las comprobaciones de estado — en onRestart. Si los datos se cargan a través de ViewModel, onRestart puede simplemente llamar al método refresh() en el ViewModel, y la View se suscribirá a los datos actualizados a través de un flujo reactivo.
Google recomienda: no duplique la lógica de onCreate en onRestart. Extraiga métodos refresh() en ViewModel que carguen datos actuales, y llámelos en onRestart. Esto preserva una arquitectura MVVM limpia y elimina la duplicación de código.
onRestart es el lugar ideal para operaciones que deben realizarse cada vez que se regresa a la pantalla, pero no son necesarias en la primera apertura. Aquí hay escenarios típicos:
viewModel.refreshItems() en onRestart.Qué NO hacer en onRestart: no reinicialice las Views — están vivas porque la Activity no fue destruida. No se suscriba nuevamente a LiveData — la suscripción en onCreate sigue viva. No cree nuevos Fragments — ya están en el FragmentManager.
La excepción más importante: onRestart no se llama si el proceso de la aplicación fue eliminado por el sistema. Este es un punto clave que los desarrolladores a menudo pasan por alto cuando confían en onRestart para la restauración del estado.
Durante la muerte del proceso:
Cómo protegerse contra esto: guarde siempre el estado crítico en onSaveInstanceState(Bundle) (se llama antes de onStop) o use SavedStateHandle en ViewModel. En onCreate, verifique savedInstanceState: si no es null, restaure el estado desde Bundle; si es null, cargue datos nuevos.
Según Google Android Vitals, aproximadamente el 7% de los retornos a una Activity después de un largo tiempo en segundo plano ocurren después de la muerte del proceso. Esto significa que cada 15.ª Activity que debería haber llamado a onRestart, en realidad pasa por onCreate. Ignorar este escenario es una de las principales causas de errores de “pantalla vacía después del retorno”.
La Activity llama a viewModel.refreshTasks() en onRestart para actualizar la lista de tareas después de regresar de la pantalla de edición.
class TaskListActivity : AppCompatActivity() {
private val viewModel: TaskViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_task_list)
viewModel.tasks.observe(this) { tasks ->
Log.d("TaskList", "Recibidas ${tasks.size} tareas")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: actualizando lista de tareas")
viewModel.refreshTasks()
}
}
class TaskViewModel : ViewModel() {
private val _tasks = MutableLiveData<List<Task>>()
val tasks: LiveData<List<Task>> get() = _tasks
fun refreshTasks() {
viewModelScope.launch {
_tasks.value = TaskRepository().getAllTasks()
}
}
}
ViewModel.refreshTasks() carga datos actuales del repositorio. LiveData notifica automáticamente a la Activity sobre los cambios de datos — la UI se actualiza sin código adicional. onRestart no crea una nueva suscripción — ya fue establecida en onCreate.
La Activity verifica la validez del token al regresar y redirige al inicio de sesión si es necesario.
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "Regresó de la pantalla de inicio de sesión") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "Token expirado — redirigiendo al inicio de sesión")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
Si el usuario minimizó la aplicación durante mucho tiempo y regresó después de que el token expirara, onRestart lo redirigirá a la pantalla de inicio de sesión. Esto evita errores de API al intentar realizar una solicitud con un token expirado. Nota: la verificación está en onRestart, no en onResume, para evitar una verificación innecesaria al regresar de un diálogo.
El Fragment usa onRestart mediante LifecycleObserver para actualizar datos.
class FeedFragment : Fragment() {
private val viewModel: FeedViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESTART)
fun onRestart() {
Log.d("FeedFragment", "onRestart mediante LifecycleObserver")
viewModel.refreshFeed()
}
})
}
}
En lugar de sobrescribir onRestart en Fragment, se usa LifecycleObserver — un enfoque más flexible que permite agregar lógica de eventos del ciclo de vida sin herencia. ViewLifecycleOwner garantiza que el observer viva dentro del ámbito de la View (no sobrevive a onDestroyView).
Preguntas frecuentes
onResume se llama cada vez que la Activity obtiene el foco — incluso al regresar de un diálogo o menú del sistema (la Activity no entró en onStop). onRestart se llama solo al regresar del estado Stopped, cuando la Activity estaba completamente oculta. onRestart es un evento más específico para actualizaciones “pesadas”, mientras que onResume es para operaciones ligeras (cambio de título, actualización de hora).
No, no puede. onRestart es un método pareja de onStop: onRestart solo se llama después de que la Activity ha pasado por onStop. Si la Activity no entró en onStop (por ejemplo, se abrió un cuadro de diálogo), entonces al regresar onRestart no se llama — solo onResume.
Presione Home (botón de inicio) en el emulador — la Activity se minimizará y recibirá onStop. Luego abra la aplicación a través de Recientes o el lanzador — la Activity recibirá onRestart → onStart → onResume. Para depuración, use Debug con puntos de interrupción en onRestart o Log.d con la etiqueta de Activity.
Una excepción no capturada en onRestart causará un Force Close. El sistema no captura excepciones en los callbacks del ciclo de vida. Si en onRestart se realizan operaciones que podrían lanzar una excepción (solicitud de red sin try-catch, trabajo con una View null), envuélvalas en try-catch.
No. onRestart solo se llama para Activities vivas que regresan del estado Stopped. isFinishing() en onRestart siempre será false. Verificar isFinishing() tiene sentido en onPause (guardar datos) y onDestroy (distinguir recreación de finalización).
Resumen
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.
Lea también