onRestart — суштина, обнављање Activity у животном циклусу

Аутор: IT Sectr Објављено: 2026-03-04 Време читања: 8 мин

onRestart — метод животног циклуса Activity у Android-у, кога систем позива пре повратка Activity из стања Stopped у стање Started. onRestart сигнализира да Activity, претходно скривено другим екраном или сведено у позадину, поново постаје видљиво кориснику. У onRestart-у програмер ажурира застареле податке, поново учитава листе и обнавља UI-стање које се могло променити док је Activity било невидљиво. Према Google Android Vitals (2025), апликације које користе onRestart за ажурирање података показују 25% мање случајева неисправног приказа информација при повратку на екран. Документација Android Developers описује onRestart као припремну фазу пре него што се Activity поново појави на екрану.

Главно

  • onRestart се позива при повратку Activity из Stopped-стања, пре onStart и onResume.
  • onRestart се не позива при првом креирању Activity — само при поновном приказивању након скривања.
  • Основни задатак onRestart-а је ажурирање података који су се могли променити док је Activity било невидљиво.
  • onRestart се не позива при process death — у овом случају Activity се креира изнова кроз onCreate.
  • Исправна употреба onRestart-а побољшава корисничко искуство при мултитаскингу и пребацивању између апликација.

onRestart — суштина метода у животном циклусу Android-а

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: услови и редослед

onRestart се позива само при повратку Activity из Stopped-стања, у које је Activity прешло након позива onStop. У наставку су наведени сви сценарији који воде ка onRestart-у.

Сценарији позивања onRestart-а:

  • Повратак из другог Activity — корисник је отворио ново Activity (нпр. кликнуо на обавештење), а затим се вратио (притиснуо „Назад“). Стек: MainActivity.onPause → MainActivity.onStop → SecondActivity се креира → корисник притиска „Назад“ → SecondActivity.onPause → SecondActivity.onStop → SecondActivity.onDestroy → MainActivity.onRestart → MainActivity.onStart → MainActivity.onResume.
  • Повратак из смањивања — корисник је смањио апликацију (Home) и након неког времена се вратио. CurrentActivity.onPause → CurrentActivity.onStop → (апликација у позадини) → корисник се враћа → CurrentActivity.onRestart → CurrentActivity.onStart → CurrentActivity.onResume.
  • Повратак са екрана закључавања — екран закључавања прекрива Activity; након откључавања Activity добија onRestart ако је прошло значајно време (више од 5 секунди).
  • Повратак из апликације покренуте кроз Intent — камера, галерија, прегледач — било која трећа апликација покренута кроз startActivityForResult() или ActivityResultLauncher.

Када се onRestart НЕ позива: при ротацији екрана (Activity се уништава и поново креира кроз onCreate), при повратку из дијалошког прозора (Activity не иде у onStop, само onPause → onResume), при process death (Activity се поново креира).

Разлика између onRestart и onCreate: шта изабрати

onRestart и onCreate су два различита приступа обнављању Activity. Избор између њих зависи од тога да ли је Activity потпуно уништено или само скривено.

КарактеристикаonRestartonCreate
Када се позива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-а: ажурирање података и UI-ја

onRestart — идеално место за операције које треба извршити при сваком повратку на екран, али нису потребне при првом отварању. Ево типичних сценарија:

  • Ажурирање листе из БД или API-ја — корисник је отишао у друго Activity, тамо променио податке, вратио се — листа мора бити ажурна. Позовите viewModel.refreshItems() у onRestart-у.
  • Провера ауторизације — ако је Activity било скривено дуже време, токен приступа је могао истећи. onRestart је тачка за проверу валидности токена и преусмеравање на екран за пријаву.
  • Синхронизација UI-стања — пребацивање тема, промена језика, ажурирање подешавања — промене треба да се примене при повратку на екран.
  • Поновно учитавање медија — ако Activity приказује садржај који се могао променити (феед вести, курс валута, време), ажурирајте податке у onRestart-у.
  • Провера мрежне конекције — при повратку из офлајн режима, Activity треба да провери доступност мреже и пребаци UI.
  • Обнављање анимација — анимације ослобођене у onStop-у поново покрените у onRestart-у пре onStart-а.

Шта не радити у onRestart-у: не иницијализујте View поново — они су живи јер Activity није уништено. Не претплаћујте се поново на LiveData — претплата у onCreate-у је жива. Не креирајте нове фрагменте — они су већ у FragmentManager-у.

onRestart и process death: важан изузетак

Најважнији изузетак: onRestart се не позива ако је процес апликације убијен од стране система. Ово је кључни моменат који програмери често пропуштају, ослањајући се на onRestart за обнављање стања.

При process death:

  • Апликација је била у позадини, Android је убио процес ради ослобађања меморије.
  • Корисник се враћа — систем покреће нови процес.
  • Activity се креира изнова: onCreate(Bundle) → onStart → onResume.
  • onRestart се НЕ позива — за систем је ово нова инстанца Activity-ја.

Како се заштитити од овога: увек чувајте критично стање у onSaveInstanceState(Bundle) (позива се пре onStop) или користите SavedStateHandle у ViewModel-у. У onCreate-у проверите savedInstanceState: ако није null, обновите стање из Bundle-а, ако је null — учитајте свеже податке.

Према Google Android Vitals, око 7% повратака на Activity након дужег боравка у позадини дешава се након process death-а. То значи да свако 15. Activity које је требало да позове onRestart заправо пролази кроз onCreate. Игнорисање овог сценарија је један од главних узрока грешака „празан екран након повратка“.

Примери кода са onRestart у Kotlin-у

Пример 1: onRestart са ажурирањем листе кроз ViewModel

Activity позива viewModel.refreshTasks() у onRestart-у за ажурирање листе задатака након повратка са екрана за уређивање.

kotlin
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-у.

Пример 2: onRestart са провером ауторизације

Activity проверава валидност токена при повратку и преусмерава на пријаву по потреби.

kotlin
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-у, да би се избегла непотребна провера при повратку из дијалога.

Пример 3: onRestart у Fragment-у са ViewLifecycleOwner

Fragment користи onRestart кроз LifecycleObserver за ажурирање података.

kotlin
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).

Често постављана питања

Чим се onRestart разликује од onResume-а?

onResume се позива сваки пут када Activity добије фокус — укључујући повратак из дијалога или системског менија (Activity није ишло у onStop). onRestart се позива само при повратку из Stopped-стања, када је Activity било потпуно скривено. onRestart је уже обухваћен догађај за „тешка“ ажурирања, onResume — за лаке операције (промена наслова, ажурирање времена).

Може ли onRestart бити позван без onStop-а?

Не, не може. onRestart је парни метод уз onStop: onRestart се позива само након што је Activity прошло кроз onStop. Ако Activity није ишло у onStop (нпр. отворен је дијалошки прозор), онда се при повратку onRestart не позива — само onResume.

Како симулирати onRestart у емулатору?

Притисните Home (дугме кућице) у емулатору — Activity ће се смањити, добити onStop. Затим отворите апликацију кроз Recent Apps или лаунчер — Activity ће добити onRestart → onStart → onResume. За отклањање грешака користите Debug са тачкама заустављања у onRestart-у или Log.d са ознаком Activity.

Шта ће се десити ако се баци изузетак у onRestart-у?

Неухваћени изузетак у onRestart-у изазваће Force Close. Систем не хвата изузетке у повратним позивима животног циклуса. Ако се у onRestart-у извршавају операције које могу бацити изузетак (мрежни захтев без try-catch, рад са null View), обмотајте их у try-catch.

Да ли треба проверавати isFinishing() у onRestart-у?

Не. onRestart се позива само за живе Activity које се враћају из Stopped-стања. isFinishing() у onRestart-у ће увек бити false. Провера isFinishing() има смисла у onPause (чување података) и onDestroy (разликовање поновног креирања од finish()-а).

Резиме

  • onRestart — метод животног циклуса који се позива при повратку Activity из Stopped-стања, пре onStart и onResume.
  • onRestart се НЕ позива при првом креирању Activity — само при поновном приказивању након потпуног скривања.
  • Основна намена onRestart-а је ажурирање застарелих података и провера стања (токен, мрежа, подешавања).
  • onRestart се не позива при process death — користите onCreate са Bundle-ом за обнављање након убијања процеса.
  • Не дуплирајте логику onCreate у onRestart-у: иницијализацију радите у onCreate-у, ажурирање — у onRestart-у.
  • За Fragment користите LifecycleObserver на viewLifecycleOwner-у уместо преклапања onRestart-а.
  • Исправна имплементација onRestart-а побољшава UX при мултитаскингу и спречава приказ застарелих података.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође