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 идеално място за „тежки“ операции по актуализиране, които не са необходими при частична загуба на фокус.
Според спецификацията на жизнения цикъл на Android Activity, времевият интервал между 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) |
| Типични действия | Актуализиране на данни, опресняване на 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също