onRestart — метод життєвого циклу Activity в Android, що викликається системою перед поверненням Activity зі стану Stopped до стану Started. onRestart сигналізує, що Activity, раніше прихована іншим екраном або згорнута у фон, знову стає видимою для користувача. У onRestart розробник оновлює застарілі дані, перезавантажує списки та відновлює стан UI, який міг змінитися, поки Activity була невидимою. За даними Google Android Vitals (2025), додатки, що використовують onRestart для оновлення даних, показують на 25% менше випадків некоректного відображення інформації при поверненні на екран. Документація Android Developers описує onRestart як підготовчий етап перед тим, як Activity знову з'явиться на екрані.
Головне
onRestart — метод-колбек, який Android викликає строго до onStart, коли Activity повертається з невидимого стану Stopped назад у видимий. Цей метод унікальний тим, що він викликається тільки при повторному показі Activity — при першому створенні екземпляра послідовність починається з onCreate, минаючи onRestart. Повний цикл: onCreate → onStart → onResume (перший запуск) або onRestart → onStart → onResume (повторний показ).
З точки зору системи Android, onRestart — це оптимізація, що дозволяє Activity підготуватися до повернення: оновити дані з репозиторію, синхронізувати стан UI, перевірити підключення до мережі. На відміну від onResume, який викликається щоразу при отриманні фокусу (у тому числі при поверненні з діалогу або системного меню), onRestart спрацьовує тільки при повному циклі приховування-повернення. Це робить onRestart ідеальним місцем для «важких» операцій оновлення, які не потрібні при частковій втраті фокусу.
Згідно зі специфікацією життєвого циклу Activity Android, часовий проміжок між onStop та onRestart може становити від кількох секунд (користувач швидко перемкнувся) до кількох годин (додаток був у фоні і користувач повернувся). За цей час дані у віддаленому джерелі (API, БД) могли змінитися, тому onRestart — природна точка для перевірки актуальності.
onRestart викликається тільки при поверненні Activity зі стану Stopped, у який Activity перейшла після виклику onStop. Нижче перераховані всі сценарії, що ведуть до onRestart.
Сценарії виклику onRestart:
Коли onRestart НЕ викликається: при повороті екрана (Activity знищується та створюється заново через onCreate), при поверненні з діалогового вікна (Activity не йде в onStop, тільки onPause → onResume), при process death (Activity створюється заново).
onRestart та onCreate — два різних підходи до відновлення Activity. Вибір між ними залежить від того, чи була Activity повністю знищена або просто прихована.
| Характеристика | onRestart | onCreate |
|---|---|---|
| Коли викликається | Activity повертається з Stopped | Activity створюється вперше або після знищення |
| Стан збережено | Так — ViewModel та поля живі | Ні — все створюється заново |
| Bundle | Не передається | Передається (savedInstanceState) |
| Типові дії | Оновлення даних, refresh UI | Ініціалізація View, підписка LiveData |
| Частота виклику | Кожного разу при поверненні | Один раз або після знищення |
Правило вибору: ініціалізацію View та підписку на LiveData/StateFlow робіть у onCreate (або onViewCreated для Fragment). Оновлення даних, перезавантаження списків та перевірку стану — у onRestart. Якщо дані завантажуються через ViewModel, onRestart може просто викликати метод refresh() на ViewModel, а View підпишеться на оновлені дані через реактивний потік.
Google рекомендує: не дублюйте логіку onCreate в onRestart. Виділіть у ViewModel методи refresh(), які завантажують актуальні дані, та викликайте їх у onRestart. Це зберігає чистоту архітектури MVVM та виключає дублювання коду.
onRestart — ідеальне місце для операцій, які повинні виконуватися при кожному поверненні на екран, але не потрібні при першому відкритті. Ось типові сценарії:
viewModel.refreshItems() в onRestart.Чого не робити в onRestart: не ініціалізуйте View заново — вони живі, оскільки Activity не знищена. Не підписуйтеся на LiveData повторно — підписка в onCreate жива. Не створюйте нові фрагменти — вони вже у FragmentManager.
Найважливіший виняток: onRestart не викликається, якщо процес додатка був убитий системою. Це ключовий момент, який розробники часто упускають, покладаючись на onRestart для відновлення стану.
При process death:
Як захиститися від цього: завжди зберігайте критичний стан у onSaveInstanceState(Bundle) (викликається до onStop) або використовуйте SavedStateHandle у ViewModel. У onCreate перевіряйте savedInstanceState: якщо він не null, відновлюйте стан з Bundle, якщо null — завантажуйте свіжі дані.
Згідно з Google Android Vitals, близько 7% повернень на Activity після тривалого перебування у фоні відбуваються після process death. Це означає, що кожна 15-та Activity, яка мала викликати onRestart, насправді проходить через onCreate. Ігнорування цього сценарію — одна з головних причин багів «порожній екран після повернення».
Activity викликає viewModel.refreshTasks() в onRestart для оновлення списку завдань після повернення з екрана редагування.
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", "Отримано ${tasks.size} завдань")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: оновлення списку завдань")
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() завантажує актуальні дані з репозиторію. LiveData автоматично сповіщає Activity про зміну даних — UI оновлюється без додаткового коду. onRestart не створює нову підписку — вона вже встановлена в onCreate.
Activity перевіряє дійсність токена при поверненні та перенаправляє на логін при необхідності.
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "Повернулися з екрана логіна") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "Токен прострочений — перенаправлення на логін")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
Якщо користувач згорнув додаток на тривалий час і повернувся після закінчення терміну дії токена, onRestart перенаправить його на екран логіна. Це запобігає помилкам API при спробі виконати запит із простроченим токеном. Зверніть увагу: перевірка в onRestart, а не в onResume, щоб уникнути зайвої перевірки при поверненні з діалогу.
Fragment використовує onRestart через LifecycleObserver для оновлення даних.
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 через LifecycleObserver")
viewModel.refreshFeed()
}
})
}
}
Замість перевизначення onRestart у Fragment використовується LifecycleObserver — більш гнучкий підхід, що дозволяє додавати логіку на події життєвого циклу без успадкування. ViewLifecycleOwner гарантує, що observer живе в скоупі View (не переживає onDestroyView).
Часто задавані питання
onResume викликається кожного разу, коли Activity отримує фокус — у тому числі при поверненні з діалогу або системного меню (Activity не йшла в onStop). onRestart викликається тільки при поверненні зі стану Stopped, коли Activity була повністю прихована. onRestart — більш вузька подія для «важких» оновлень, onResume — для легких операцій (зміна тайтла, оновлення часу).
Ні, не може. onRestart — парний метод до onStop: onRestart викликається тільки після того, як Activity пройшла через onStop. Якщо Activity не йшла в onStop (наприклад, відкрито діалогове вікно), то при поверненні onRestart не викликається — тільки onResume.
Натисніть Home (кнопка будиночка) в емуляторі — Activity згорнеться, отримає onStop. Потім відкрийте додаток через Recent Apps або лаунчер — Activity отримає onRestart → onStart → onResume. Для налагодження використовуйте Debug з точками зупинки в onRestart або Log.d з тегом Activity.
Не перехоплений виняток в onRestart викличе Force Close. Система не перехоплює винятки в колбеках життєвого циклу. Якщо в onRestart виконуються операції, які можуть викинути виняток (мережевий запит без try-catch, робота з null View), обгорніть їх у try-catch.
Ні. onRestart викликається тільки для живих Activity, які повертаються зі стану Stopped. isFinishing() в onRestart завжди буде false. Перевірка isFinishing() має сенс в onPause (збереження даних) та onDestroy (відмінність перестворення від finish()).
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також