onRestart — esensi, pemulihan Activity dalam siklus hidup

Penulis: IT Sectr Diterbitkan: 2026-03-04 Waktu membaca: 8 mnt

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 dipanggil saat Activity kembali dari status Stopped, sebelum onStart dan onResume.
  • onRestart tidak dipanggil saat pembuatan pertama Activity — hanya saat ditampilkan kembali setelah disembunyikan.
  • Tugas utama onRestart adalah memperbarui data yang mungkin telah berubah saat Activity tidak terlihat.
  • onRestart tidak dipanggil saat process death — dalam kasus ini Activity dibuat ulang melalui onCreate.
  • Penggunaan onRestart yang benar meningkatkan pengalaman pengguna saat multitasking dan beralih antar aplikasi.

onRestart — esensi metode dalam siklus hidup Android

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.

Kapan onRestart dipanggil: kondisi dan urutan

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:

  • Kembali dari Activity lain — pengguna membuka Activity baru (misalnya, mengklik notifikasi) dan kemudian kembali (menekan „Kembali“). Stack: MainActivity.onPause → MainActivity.onStop → SecondActivity dibuat → pengguna menekan „Kembali“ → SecondActivity.onPause → SecondActivity.onStop → SecondActivity.onDestroy → MainActivity.onRestart → MainActivity.onStart → MainActivity.onResume.
  • Kembali dari minimalisasi — pengguna meminimalkan aplikasi (Home) dan setelah beberapa saat kembali. CurrentActivity.onPause → CurrentActivity.onStop → (aplikasi di latar belakang) → pengguna kembali → CurrentActivity.onRestart → CurrentActivity.onStart → CurrentActivity.onResume.
  • Kembali dari layar kunci — layar kunci menutupi Activity; setelah dibuka, Activity menerima onRestart jika waktu yang signifikan telah berlalu (lebih dari 5 detik).
  • Kembali dari aplikasi yang diluncurkan melalui Intent — kamera, galeri, browser — aplikasi pihak ketiga mana pun yang diluncurkan melalui startActivityForResult() atau ActivityResultLauncher.

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

Perbedaan onRestart dan onCreate: apa yang dipilih

onRestart dan onCreate adalah dua pendekatan berbeda untuk memulihkan Activity. Pilihan di antara keduanya tergantung pada apakah Activity telah dihancurkan sepenuhnya atau hanya disembunyikan.

KarakteristikonRestartonCreate
Kapan dipanggilActivity kembali dari StoppedActivity dibuat pertama kali atau setelah penghancuran
Status disimpanYa — ViewModel dan bidang hidupTidak — semuanya dibuat ulang
BundleTidak diteruskanDiteruskan (savedInstanceState)
Tindakan tipikalPembaruan data, penyegaran UIInisialisasi View, langganan LiveData
Frekuensi pemanggilanSetiap kali kembaliSekali 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.

Skenario penggunaan onRestart: pembaruan data dan UI

onRestart — tempat ideal untuk operasi yang harus dijalankan setiap kali kembali ke layar, tetapi tidak diperlukan saat pembukaan pertama. Berikut adalah skenario tipikal:

  • Memperbarui daftar dari DB atau API — pengguna pergi ke Activity lain, mengubah data di sana, kembali — daftar harus terkini. Panggil viewModel.refreshItems() di onRestart.
  • Memeriksa otorisasi — jika Activity disembunyikan untuk waktu yang lama, token akses mungkin telah kedaluwarsa. onRestart adalah titik untuk memeriksa validitas token dan mengarahkan ke layar login.
  • Sinkronisasi status UI — mengganti tema, mengubah bahasa, memperbarui pengaturan — perubahan harus diterapkan saat kembali ke layar.
  • Memuat ulang media — jika Activity menampilkan konten yang mungkin telah berubah (feed berita, nilai tukar, cuaca), perbarui data di onRestart.
  • Memeriksa koneksi jaringan — saat kembali dari mode offline, Activity harus memeriksa ketersediaan jaringan dan mengalihkan UI.
  • Memulihkan animasi — animasi yang dibebaskan di onStop, mulai ulang di onRestart sebelum onStart.

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.

onRestart dan process death: pengecualian penting

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:

  • Aplikasi berada di latar belakang, Android membunuh proses untuk membebaskan memori.
  • Pengguna kembali — sistem meluncurkan proses baru.
  • Activity dibuat ulang: onCreate(Bundle) → onStart → onResume.
  • onRestart TIDAK dipanggil — bagi sistem ini adalah instance Activity baru.

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“.

Contoh kode dengan onRestart di Kotlin

Contoh 1: onRestart dengan pembaruan daftar melalui ViewModel

Activity memanggil viewModel.refreshTasks() di onRestart untuk memperbarui daftar tugas setelah kembali dari layar edit.

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} 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.

Contoh 2: onRestart dengan pemeriksaan otorisasi

Activity memeriksa validitas token saat kembali dan mengarahkan ke login jika diperlukan.

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

Contoh 3: onRestart di Fragment dengan ViewLifecycleOwner

Fragment menggunakan onRestart melalui LifecycleObserver untuk pembaruan data.

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 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

Apa perbedaan onRestart dengan onResume?

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

Bisakah onRestart dipanggil tanpa onStop?

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.

Bagaimana cara mensimulasikan onRestart di emulator?

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.

Apa yang terjadi jika pengecualian dilemparkan di onRestart?

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.

Apakah perlu memeriksa isFinishing() di onRestart?

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

  • onRestart — metode siklus hidup yang dipanggil saat Activity kembali dari status Stopped, sebelum onStart dan onResume.
  • onRestart TIDAK dipanggil saat pembuatan pertama Activity — hanya saat ditampilkan kembali setelah disembunyikan sepenuhnya.
  • Tujuan utama onRestart adalah memperbarui data usang dan memeriksa status (token, jaringan, pengaturan).
  • onRestart tidak dipanggil saat process death — gunakan onCreate dengan Bundle untuk pemulihan setelah proses dibunuh.
  • Jangan duplikasi logika onCreate di onRestart: inisialisasi di onCreate, pembaruan di onRestart.
  • Untuk Fragment, gunakan LifecycleObserver pada viewLifecycleOwner daripada menimpa onRestart.
  • Implementasi onRestart yang benar meningkatkan UX saat multitasking dan mencegah tampilan data usang.

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.

Diskusikan proyek

Baca juga