onRestart — metod i Activity-livscykeln i Android, anropad av systemet innan Activity återgår från Stopped-status till Started-status. onRestart signalerar att Activity, som tidigare dolts av en annan skärm eller minimerats till bakgrunden, åter blir synligt för användaren. I onRestart uppdaterar utvecklaren föråldrade data, laddar om listor och återställer UI-status som kan ha ändrats medan Activity var osynligt. Enligt Google Android Vitals (2025) visar appar som använder onRestart för datauppdatering 25% färre fall av felaktig informationsvisning vid återgång till skärmen. Android Developers dokumentation beskriver onRestart som ett förberedande steg innan Activity visas på skärmen igen.
Huvudpunkter
onRestart — en callback-metod som Android anropar strikt före onStart, när Activity återvänder från det osynliga Stopped-statusen tillbaka till den synliga. Denna metod är unik eftersom den endast anropas vid upprepad visning av Activity — vid första instansskapandet börjar sekvensen med onCreate och hoppar över onRestart. Fullständig cykel: onCreate → onStart → onResume (första start) eller onRestart → onStart → onResume (upprepad visning).
Ur Android-systemets perspektiv är onRestart en optimering som gör att Activity kan förbereda sig för återkomst: uppdatera data från arkivet, synkronisera UI-status, kontrollera nätverksanslutningen. Till skillnad från onResume, som anropas varje gång fokus erhålls (inklusive vid återkomst från en dialog eller systemmenyn), aktiveras onRestart endast vid den fullständiga cykeln av döljning-återkomst. Detta gör onRestart till den idealiska platsen för „tunga“ uppdateringsoperationer som inte behövs vid partiell fokusförlust.
Enligt specifikationen för Android Activity-livscykeln kan tidsintervallet mellan onStop och onRestart variera från några sekunder (användaren växlade snabbt) till flera timmar (appen var i bakgrunden och användaren återvände). Under denna tid kan data i den fjärrkällan (API, DB) ha ändrats, därför är onRestart den naturliga punkten för att kontrollera aktuallitet.
onRestart anropas endast när Activity återvänder från Stopped-status, som Activity gick in i efter anrop av onStop. Nedan listas alla scenarier som leder till onRestart.
Scenarier för anrop av onRestart:
När onRestart ANROPAS INTE: vid skärmrotation (Activity förstörs och skapas på nytt via onCreate), vid återkomst från en dialogruta (Activity går inte till onStop, bara onPause → onResume), vid process death (Activity skapas på nytt).
onRestart och onCreate är två olika tillvägagångssätt för att återställa Activity. Valet mellan dem beror på om Activity har förstörts helt eller bara dolts.
| Egenskap | onRestart | onCreate |
|---|---|---|
| När anropas | Activity återvänder från Stopped | Activity skapas för första gången eller efter förstöring |
| Status sparad | Ja — ViewModel och fält lever | Nej — allt skapas på nytt |
| Bundle | Skickas inte | Skickas (savedInstanceState) |
| Typiska åtgärder | Datauppdatering, UI-uppdatering | Initialisering av View, prenumeration på LiveData |
| Anropsfrekvens | Varje gång vid återkomst | En gång eller efter förstöring |
Urvalsregel: initialisering av View och prenumeration på LiveData/StateFlow gör i onCreate (eller onViewCreated för Fragment). Datauppdatering, omladdning av listor och statuskontroll — i onRestart. Om data laddas via ViewModel kan onRestart helt enkelt anropa metoden refresh() på ViewModel, och View prenumererar på uppdaterade data via den reaktiva strömmen.
Google rekommenderar: duplicera inte logiken från onCreate i onRestart. Separera i ViewModel metoderna refresh() som laddar aktuella data och anropa dem i onRestart. Detta bevarar renheten i MVVM-arkitekturen och eliminerar kodduplicering.
onRestart — den idealiska platsen för operationer som ska utföras vid varje återkomst till skärmen, men inte behövs vid första öppnandet. Här är typiska scenarier:
viewModel.refreshItems() i onRestart.Vad man INTE ska göra i onRestart: initiera inte View på nytt — de lever eftersom Activity inte har förstörts. Prenumerera inte på LiveData igen — prenumerationen i onCreate lever. Skapa inte nya fragment — de finns redan i FragmentManager.
Det viktigaste undantaget: onRestart anropas inte om applikationsprocessen har dödats av systemet. Detta är den avgörande punkten som utvecklare ofta missar genom att förlita sig på onRestart för statusåterställning.
Vid process death:
Hur man skyddar sig: spara alltid kritisk status i onSaveInstanceState(Bundle) (anropas före onStop) eller använd SavedStateHandle i ViewModel. I onCreate, kontrollera savedInstanceState: om den inte är null, återställ status från Bundle, om den är null — ladda färska data.
Enligt Google Android Vitals sker cirka 7% av återkomsterna till Activity efter lång vistelse i bakgrunden efter process death. Detta innebär att var 15:e Activity som borde ha anropat onRestart i själva verket går igenom onCreate. Att ignorera detta scenario är en av huvudorsakerna till buggar med „tom skärm efter återkomst“.
Activity anropar viewModel.refreshTasks() i onRestart för att uppdatera uppgiftslistan efter återkomst från redigeringsskärmen.
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} uppgifter mottagna")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: uppdatering av uppgiftslistan")
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() laddar aktuella data från arkivet. LiveData meddelar automatiskt Activity om dataändring — UI uppdateras utan extra kod. OnRestart skapar ingen ny prenumeration — den är redan inställd i onCreate.
Activity kontrollerar tokenets giltighet vid återkomst och omdirigerar till inloggning om det behövs.
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "Återvände från inloggningsskärmen") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "Token har löpt ut — omdirigering till inloggning")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
Om användaren minimerade appen under lång tid och återvände efter att token löpt ut, kommer onRestart att omdirigera till inloggningsskärmen. Detta förhindrar API-fel vid försök att utföra en begäran med en utgången token. Observera: kontroll i onRestart, inte i onResume, för att undvika onödig kontroll vid återkomst från en dialog.
Fragment använder onRestart via LifecycleObserver för datauppdatering.
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 via LifecycleObserver")
viewModel.refreshFeed()
}
})
}
}
Istället för att åsidosätta onRestart i Fragment används LifecycleObserver — ett mer flexibelt tillvägagångssätt som gör det möjligt att lägga till logik till livscykelhändelser utan arv. ViewLifecycleOwner garanterar att observatören lever inom View-omfånget (överlever inte onDestroyView).
Vanliga frågor
onResume anropas varje gång Activity får fokus — inklusive vid återkomst från en dialog eller systemmenyn (Activity gick inte till onStop). onRestart anropas endast vid återkomst från Stopped-status, när Activity var helt dolt. onRestart är en snävare händelse för „tunga“ uppdateringar, onResume för lätta operationer (ändra titel, uppdatera tid).
Nej, det kan det inte. onRestart är den parade metoden till onStop: onRestart anropas endast efter att Activity har gått igenom onStop. Om Activity inte gick till onStop (t.ex. en dialogruta är öppen), anropas onRestart inte vid återkomst — bara onResume.
Tryck på Home (hemknappen) i emulatorn — Activity minimeras och får onStop. Öppna sedan appen via Recent Apps eller startprogrammet — Activity får onRestart → onStart → onResume. För felsökning, använd Debug med brytpunkter i onRestart eller Log.d med taggen Activity.
Ett oavfångat undantag i onRestart orsakar Force Close. Systemet fångar inte undantag i livscykel-callbacks. Om operationer som kan kasta ett undantag (nätverksbegäran utan try-catch, arbete med null View) utförs i onRestart, omge dem med try-catch.
Nej. onRestart anropas endast för levande Activity som återvänder från Stopped-status. isFinishing() i onRestart kommer alltid att vara false. Kontroll av isFinishing() är meningsfull i onPause (spara data) och onDestroy (skilja återskapande från finish()).
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också