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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође