onRestart — metode siklus hidup Activity di Android, dipanggil oleh sistem sebelum Activity kembali dari status Stopped ke status Started. onRestart menandakan bahwa Activity, yang sebelumnya disembunyikan oleh layar lain atau diminimalkan ke latar belakang, kembali terlihat oleh pengguna. Di onRestart, pengembang memperbarui data usang, memuat ulang daftar, dan memulihkan status UI yang mungkin telah berubah saat Activity tidak terlihat. Menurut Google Android Vitals (2025), aplikasi yang menggunakan onRestart untuk pembaruan data menunjukkan 25% lebih sedikit kasus tampilan informasi yang salah saat kembali ke layar. Dokumentasi Android Developers menjelaskan onRestart sebagai tahap persiapan sebelum Activity muncul kembali di layar.
Poin Utama
onRestart — metode callback yang dipanggil Android tepat sebelum onStart, ketika Activity kembali dari status Stopped yang tidak terlihat kembali ke status terlihat. Metode ini unik karena hanya dipanggil saat penampilan ulang Activity — pada pembuatan instance pertama, urutan dimulai dengan onCreate, melewati onRestart. Siklus lengkap: onCreate → onStart → onResume (peluncuran pertama) atau onRestart → onStart → onResume (penampilan ulang).
Dari sudut pandang sistem Android, onRestart adalah optimalisasi yang memungkinkan Activity bersiap untuk kembali: memperbarui data dari repositori, menyinkronkan status UI, memeriksa koneksi jaringan. Tidak seperti onResume, yang dipanggil setiap kali mendapatkan fokus (termasuk saat kembali dari dialog atau menu sistem), onRestart hanya aktif pada siklus penuh penyembunyian-kembali. Ini menjadikan onRestart tempat ideal untuk operasi pembaruan „berat“ yang tidak diperlukan saat kehilangan fokus sebagian.
Menurut spesifikasi siklus hidup Android Activity, interval waktu antara onStop dan onRestart dapat berkisar dari beberapa detik (pengguna cepat beralih) hingga beberapa jam (aplikasi di latar belakang dan pengguna kembali). Selama waktu ini, data di sumber jarak jauh (API, DB) mungkin telah berubah, oleh karena itu onRestart adalah titik alami untuk memeriksa keaktualan.
onRestart hanya dipanggil saat Activity kembali dari status Stopped, yang dimasuki Activity setelah pemanggilan onStop. Di bawah ini adalah semua skenario yang mengarah ke onRestart.
Skenario pemanggilan onRestart:
Kapan onRestart TIDAK dipanggil: saat rotasi layar (Activity dihancurkan dan dibuat ulang melalui onCreate), saat kembali dari jendela dialog (Activity tidak masuk ke onStop, hanya onPause → onResume), saat process death (Activity dibuat ulang).
onRestart dan onCreate adalah dua pendekatan berbeda untuk memulihkan Activity. Pilihan di antara keduanya tergantung pada apakah Activity telah dihancurkan sepenuhnya atau hanya disembunyikan.
| Karakteristik | onRestart | onCreate |
|---|---|---|
| Kapan dipanggil | Activity kembali dari Stopped | Activity dibuat pertama kali atau setelah penghancuran |
| Status disimpan | Ya — ViewModel dan bidang hidup | Tidak — semuanya dibuat ulang |
| Bundle | Tidak diteruskan | Diteruskan (savedInstanceState) |
| Tindakan tipikal | Pembaruan data, penyegaran UI | Inisialisasi View, langganan LiveData |
| Frekuensi pemanggilan | Setiap kali kembali | Sekali atau setelah penghancuran |
Aturan pemilihan: lakukan inisialisasi View dan langganan LiveData/StateFlow di onCreate (atau onViewCreated untuk Fragment). Pembaruan data, memuat ulang daftar, dan pemeriksaan status — di onRestart. Jika data dimuat melalui ViewModel, onRestart dapat memanggil metode refresh() pada ViewModel, dan View akan berlangganan data yang diperbarui melalui aliran reaktif.
Google merekomendasikan: jangan duplikasi logika onCreate di onRestart. Pisahkan di ViewModel metode refresh() yang memuat data terkini dan panggil di onRestart. Ini menjaga kemurnian arsitektur MVVM dan menghilangkan duplikasi kode.
onRestart — tempat ideal untuk operasi yang harus dijalankan setiap kali kembali ke layar, tetapi tidak diperlukan saat pembukaan pertama. Berikut adalah skenario tipikal:
viewModel.refreshItems() di onRestart.Apa yang tidak boleh dilakukan di onRestart: jangan inisialisasi View lagi — mereka hidup karena Activity tidak dihancurkan. Jangan berlangganan LiveData lagi — langganan di onCreate hidup. Jangan membuat fragmen baru — mereka sudah ada di FragmentManager.
Pengecualian terpenting: onRestart tidak dipanggil jika proses aplikasi dibunuh oleh sistem. Ini adalah poin kunci yang sering dilewatkan pengembang dengan mengandalkan onRestart untuk pemulihan status.
Saat process death:
Cara melindungi diri dari ini: selalu simpan status kritis di onSaveInstanceState(Bundle) (dipanggil sebelum onStop) atau gunakan SavedStateHandle di ViewModel. Di onCreate, periksa savedInstanceState: jika tidak null, pulihkan status dari Bundle, jika null — muat data segar.
Menurut Google Android Vitals, sekitar 7% pengembalian ke Activity setelah lama berada di latar belakang terjadi setelah process death. Ini berarti setiap Activity ke-15 yang seharusnya memanggil onRestart, pada kenyataannya melewati onCreate. Mengabaikan skenario ini adalah salah satu penyebab utama bug „layar kosong setelah kembali“.
Activity memanggil viewModel.refreshTasks() di onRestart untuk memperbarui daftar tugas setelah kembali dari layar edit.
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} tugas diterima")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: memperbarui daftar tugas")
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() memuat data terkini dari repositori. LiveData secara otomatis memberi tahu Activity tentang perubahan data — UI diperbarui tanpa kode tambahan. OnRestart tidak membuat langganan baru — sudah diatur di onCreate.
Activity memeriksa validitas token saat kembali dan mengarahkan ke login jika diperlukan.
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "Kembali dari layar login") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "Token kedaluwarsa — diarahkan ke login")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
Jika pengguna meminimalkan aplikasi untuk waktu yang lama dan kembali setelah token kedaluwarsa, onRestart akan mengarahkannya ke layar login. Ini mencegah kesalahan API saat mencoba melakukan permintaan dengan token kedaluwarsa. Perhatikan: pemeriksaan di onRestart, bukan di onResume, untuk menghindari pemeriksaan yang tidak perlu saat kembali dari dialog.
Fragment menggunakan onRestart melalui LifecycleObserver untuk pembaruan data.
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 melalui LifecycleObserver")
viewModel.refreshFeed()
}
})
}
}
Alih-alih menimpa onRestart di Fragment, LifecycleObserver digunakan — pendekatan yang lebih fleksibel yang memungkinkan penambahan logika ke peristiwa siklus hidup tanpa pewarisan. ViewLifecycleOwner memastikan bahwa observer hidup dalam lingkup View (tidak bertahan melewati onDestroyView).
Pertanyaan yang Sering Diajukan
onResume dipanggil setiap kali Activity mendapatkan fokus — termasuk saat kembali dari dialog atau menu sistem (Activity tidak masuk ke onStop). onRestart dipanggil hanya saat kembali dari status Stopped, ketika Activity benar-benar disembunyikan. onRestart adalah peristiwa yang lebih sempit untuk pembaruan „berat“, onResume untuk operasi ringan (mengubah judul, memperbarui waktu).
Tidak, tidak bisa. onRestart adalah metode berpasangan dengan onStop: onRestart hanya dipanggil setelah Activity melewati onStop. Jika Activity tidak masuk ke onStop (misalnya, jendela dialog terbuka), maka saat kembali onRestart tidak dipanggil — hanya onResume.
Tekan Home (tombol rumah) di emulator — Activity akan diminimalkan, menerima onStop. Kemudian buka aplikasi melalui Recent Apps atau peluncur — Activity akan menerima onRestart → onStart → onResume. Untuk debugging, gunakan Debug dengan titik henti di onRestart atau Log.d dengan tag Activity.
Pengecualian yang tidak tertangkap di onRestart akan menyebabkan Force Close. Sistem tidak menangkap pengecualian di callback siklus hidup. Jika di onRestart menjalankan operasi yang dapat melemparkan pengecualian (permintaan jaringan tanpa try-catch, bekerja dengan View null), bungkus dengan try-catch.
Tidak. onRestart hanya dipanggil untuk Activity hidup yang kembali dari status Stopped. isFinishing() di onRestart akan selalu false. Pemeriksaan isFinishing() berguna di onPause (menyimpan data) dan onDestroy (membedakan pembuatan ulang dari finish()).
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga