Siklus hidup aktivitas

Saat pengguna menelusuri, keluar, dan kembali ke aplikasi Anda, instance Activity dalam aplikasi Anda melakukan transisi ke berbagai status dalam siklus prosesnya. Class Activity menyediakan sejumlah callback yang memungkinkan aktivitas mengetahui kapan status berubah atau bahwa sistem membuat, menghentikan, atau melanjutkan suatu aktivitas atau menutup proses tempat beradanya aktivitas.

Dalam metode callback siklus proses, Anda dapat mendeklarasikan cara aktivitas berperilaku saat pengguna meninggalkan dan memasuki kembali aktivitas itu. Misalnya, jika Anda sedang membangun pemutar video streaming, Anda dapat menjeda video dan mengakhiri koneksi jaringan saat pengguna beralih ke aplikasi lain. Saat pengguna kembali ke aplikasi, Anda dapat menghubungkan ulang ke jaringan dan memungkinkan pengguna melanjutkan video tersebut dari titik yang sama.

Setiap callback memungkinkan Anda melakukan pekerjaan tertentu yang sesuai dengan perubahan status yang diberikan. Melakukan pekerjaan yang tepat dan pada waktu yang tepat, serta menangani transisi dengan benar membuat aplikasi Anda lebih andal dan efektif. Misalnya, penerapan callback siklus proses yang baik dapat membantu aplikasi Anda menghindari hal berikut:

  • Error jika pengguna menerima panggilan telepon atau beralih ke aplikasi lain saat menggunakan aplikasi Anda.
  • Penggunaan resource sistem yang berharga jika pengguna tidak menggunakannya secara aktif.
  • Kehilangan progres pengguna jika mereka keluar dari aplikasi Anda dan kembali lagi nanti.
  • Error atau kehilangan progres pengguna saat layar berputar antara orientasi lanskap dan potret.

Dokumen ini menjelaskan siklus proses aktivitas secara detail. Dokumen dimulai dengan menjelaskan paradigma siklus proses. Selanjutnya, dokumen menjelaskan setiap callback: apa yang terjadi secara internal saat callback dieksekusi dan apa yang perlu Anda terapkan selama callback tersebut.

Selanjutnya, dokumen tersebut secara singkat memperkenalkan hubungan antara status aktivitas dan kerentanan suatu proses akan ditutup oleh sistem. Terakhir, dokumen ini membahas beberapa topik yang terkait dengan transisi antara status aktivitas.

Untuk mengetahui informasi tentang penanganan siklus proses, termasuk panduan tentang praktik terbaik, lihat Siklus Proses di Jetpack Compose dan Menyimpan status UI. Untuk mempelajari cara merancang aplikasi yang andal dan berkualitas produksi menggunakan aktivitas yang dikombinasikan dengan komponen arsitektur, lihat Panduan arsitektur aplikasi.

Konsep siklus proses aktivitas

Untuk menavigasi transisi di antara tahap siklus proses aktivitas, class Activity menyediakan set inti sebanyak enam callback: onCreate, onStart, onResume, onPause, onStop, dan onDestroy. Sistem memanggil setiap callback ini saat aktivitas memasuki status baru.

Gambar 1 menyajikan representasi visual dari paradigma ini.

Gambar 1. Ilustrasi sederhana dari siklus proses aktivitas.

Saat pengguna mulai meninggalkan aktivitas, sistem memanggil metode untuk membongkar aktivitas. Dalam beberapa kasus, aktivitas hanya dibongkar sebagian dan masih berada dalam memori, seperti saat pengguna beralih ke aplikasi lain. Dalam kasus ini, aktivitas masih dapat kembali ke latar depan.

Jika pengguna kembali ke aktivitas, aktivitas akan dilanjutkan dari tempat pengguna keluar. Dengan beberapa pengecualian, aplikasi dibatasi untuk memulai aktivitas saat berjalan di latar belakang.

Kemungkinan sistem untuk menutup proses tertentu, beserta aktivitas di dalamnya, bergantung pada status aktivitas pada saat itu. Untuk mengetahui informasi selengkapnya tentang hubungan antara status dan kerentanan terhadap pengeluaran, lihat bagian tentang status aktivitas dan pengeluaran dari memori.

Bergantung pada kompleksitas aktivitas, Anda mungkin tidak perlu mengimplementasikan semua metode siklus proses. Namun, Anda perlu memahami masing-masing metode dan mengimplementasikan metode tersebut untuk memastikan aplikasi berperilaku seperti harapan pengguna.

Compose dan Siklus Proses

Di Compose, hindari menempatkan logika bisnis atau penyiapan pengamat manual secara langsung dalam callback aktivitas seperti onStart atau onResume. Sebagai gantinya, gunakan efek yang mendukung Lifecycle dan pengamat yang mendukung status yang otomatis selaras dengan kehadiran UI di layar.

  • Pengumpulan yang mendukung siklus proses: Gunakan collectAsStateWithLifecycle untuk menggunakan alur dari ViewModel. API ini otomatis mulai mengumpulkan saat UI memasuki status Dimulai dan berhenti saat beralih ke latar belakang, sehingga mencegah konsumsi resource yang tidak perlu. Setelah mengumpulkan flow sebagai status, Anda dapat menggunakan LifecycleEffects untuk menjalankan kode saat peristiwa Siklus proses terjadi.
  • Alur logika: Dengan menggunakan API ini, UI bereaksi terhadap status siklus proses secara alami melalui hierarki komposisi, sehingga memastikan bahwa logika bisnis hanya dijalankan saat pengguna berinteraksi secara aktif dengan komponen.

Untuk mengetahui informasi selengkapnya tentang Compose dan siklus proses, lihat Siklus Proses di Jetpack Compose.

Callback siklus proses

Bagian ini memberikan informasi konseptual dan implementasi tentang metode callback yang digunakan selama siklus proses aktivitas.

Beberapa tindakan termasuk dalam metode siklus proses aktivitas. Namun, tempatkan kode yang menerapkan tindakan komponen dependen dalam komponen, bukan metode siklus proses aktivitas. Untuk melakukannya, Anda harus membuat komponen dependen berbasis siklus proses. Untuk mempelajari cara membuat komponen dependen berbasis siklus proses, lihat Siklus Proses di Jetpack Compose.

onCreate

Anda harus menerapkan callback ini, yang aktif saat sistem pertama kali membuat aktivitas. Pada pembuatan aktivitas, aktivitas memasuki status Dibuat. Dalam metode onCreate, jalankan logika startup aplikasi dasar yang hanya terjadi sekali selama siklus proses aktivitas.

Misalnya, implementasi onCreate Anda dapat mengikat data ke daftar, mengaitkan aktivitas dengan ViewModel, dan membuat instance beberapa variabel lingkup class. Metode ini menerima parameter savedInstanceState, yang merupakan objek Bundle yang berisi status aktivitas yang sebelumnya disimpan. Jika aktivitas belum pernah ada sebelumnya, nilai objek Bundle adalah nol.

Jika Anda memiliki komponen berbasis siklus proses yang terhubung dengan siklus proses aktivitas Anda, komponen tersebut akan menerima peristiwa ON_CREATE. Metode yang diberi anotasi dengan @OnLifecycleEvent dipanggil sehingga komponen berbasis siklus proses Anda dapat melakukan kode penyiapan apa pun yang diperlukan untuk status yang dibuat.

Contoh berikut menunjukkan cara mengintegrasikan composable Text dalam aktivitas minimum:

class ExampleActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent { // In here, we can call composables!
            MaterialTheme {
                Greeting(name = "compose")
            }
        }
    }
}

@Composable
fun Greeting(name: String) {
    Text(text = "Hello $name!")
}

Aktivitas Anda tidak tetap dalam status Dibuat. Setelah metode onCreate selesai dieksekusi, aktivitas memasuki status Dimulai dan sistem memanggil metode onStart dan onResume dalam urutan cepat.

onStart

Saat aktivitas memasuki status Dimulai, sistem akan memanggil onStart. Panggilan ini membuat aktivitas terlihat oleh pengguna saat aplikasi mempersiapkan aktivitas untuk memasuki latar depan dan menjadi interaktif. Misalnya, metode ini adalah tempat kode yang mengelola UI diinisialisasi.

Saat aktivitas berpindah ke status Dimulai, komponen berbasis siklus proses yang terkait dengan siklus proses aktivitas akan menerima peristiwa ON_START.

Metode onStart selesai dengan cepat dan, seperti pada status Dibuat, aktivitas tidak tetap berada dalam status Dimulai. Setelah callback ini selesai, aktivitas memasuki status Dilanjutkan dan sistem memanggil metode onResume.

onResume

Saat aktivitas memasuki status Dilanjutkan, aktivitas tersebut masuk ke latar depan, dan sistem memanggil callback onResume. Ini adalah status saat aplikasi berinteraksi dengan pengguna. Aplikasi tetap dalam status ini sampai terjadi sesuatu untuk mengambil fokus dari aplikasi, seperti perangkat menerima panggilan telepon, pengguna beralih ke aktivitas lain, atau layar perangkat mati.

Saat aktivitas berpindah ke status Dilanjutkan, komponen berbasis siklus proses apa pun yang terkait dengan siklus proses aktivitas akan menerima peristiwa ON_RESUME. Di sinilah komponen siklus proses dapat mengaktifkan fungsi apa pun yang perlu dijalankan saat komponen terlihat dan berada di latar depan, seperti memulai pratinjau kamera.

Jika terjadi suatu peristiwa interupsi, aktivitas memasuki status Dijeda dan sistem memanggil callback onPause.

Jika aktivitas kembali ke status Dilanjutkan dari status Dijeda, sistem akan memanggil metode onResume sekali lagi. Oleh karena itu, terapkan onResume untuk menginisialisasi komponen yang Anda rilis selama onPause dan untuk melakukan inisialisasi lainnya yang harus terjadi setiap kali aktivitas memasuki status Dilanjutkan.

Berikut adalah contoh komponen berbasis siklus proses yang mengakses kamera saat komponen menerima peristiwa ON_RESUME:

class CameraComponent : LifecycleObserver {
    ...
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun initializeCamera() {
        if (camera == null) {
            getCamera()
        }
    }
    ...
}

Kode sebelumnya menginisialisasi kamera setelah LifecycleObserver menerima peristiwa ON_RESUME. Namun, dalam mode multi-aplikasi, aktivitas Anda mungkin sepenuhnya terlihat meski sedang dalam status Dijeda. Misalnya, saat aplikasi berada dalam mode multi-aplikasi dan pengguna mengetuk jendela yang tidak berisi aktivitas Anda, aktivitas Anda akan berpindah ke status Dijeda.

Jika Anda ingin kamera hanya aktif saat aplikasi Dilanjutkan (terlihat dan aktif di latar depan), lakukan inisialisasi kamera setelah peristiwa ON_RESUME yang ditunjukkan sebelumnya. Jika Anda ingin kamera tetap aktif saat aktivitas Dijeda tetapi terlihat, seperti dalam mode multi-aplikasi, lakukan inisialisasi kamera setelah peristiwa ON_START.

Namun, mengaktifkan kamera saat aktivitas Anda Dijeda dapat menolak akses ke kamera untuk aplikasi lain yang Dilanjutkan dalam mode multi-aplikasi. Terkadang hal ini diperlukan untuk menjaga kamera tetap aktif saat aktivitas Dijeda, tetapi sebenarnya hal ini dapat menurunkan pengalaman pengguna secara keseluruhan.

Oleh karena itu, pikirkan dengan cermat di mana dalam siklus proses yang paling tepat untuk mengontrol resource sistem bersama dalam konteks mode multi-aplikasi. Untuk mempelajari lebih lanjut cara mendukung mode multi-aplikasi, lihat Mendukung mode multi-aplikasi.

Terlepas dari peristiwa build-up yang Anda pilih untuk melakukan operasi inisialisasi, pastikan untuk menggunakan peristiwa siklus proses yang sesuai untuk melepaskan resource. Jika Anda menginisialisasi sesuatu setelah peristiwa ON_START, lepaskan atau hentikan setelah peristiwa ON_STOP. Jika Anda melakukan inisialisasi setelah peristiwa ON_RESUME, lepaskan setelah peristiwa ON_PAUSE.

Cuplikan kode sebelumnya menempatkan kode inisialisasi kamera dalam komponen berbasis siklus proses. Sebagai gantinya, Anda dapat memasukkan kode ini langsung ke callback siklus proses aktivitas, seperti onStart dan onStop, tetapi kami tidak merekomendasikannya. Menambahkan logika ini ke komponen yang mandiri dan berbasis siklus proses memungkinkan Anda menggunakan kembali komponen tersebut di berbagai aktivitas tanpa harus menduplikasi kode. Untuk mempelajari cara membuat komponen berbasis siklus proses, lihat Siklus Proses di Jetpack Compose.

onPause

Sistem akan memanggil metode ini sebagai indikasi pertama bahwa pengguna meninggalkan aktivitas Anda, meskipun tidak selalu berarti aktivitas sedang ditutup. Hal ini menunjukkan bahwa aktivitas tidak lagi berada di latar depan, tetapi masih terlihat jika pengguna berada dalam mode multi-aplikasi. Ada beberapa alasan mengapa aktivitas dapat memasuki status ini:

  • Peristiwa yang mengganggu eksekusi aplikasi, seperti yang dijelaskan di bagian tentang callback onResume, akan menjeda aktivitas saat ini. Ini adalah kasus yang paling umum.
  • Dalam mode multi-aplikasi, hanya satu aplikasi yang memiliki fokus setiap saat, dan sistem menjeda semua aplikasi lainnya.
  • Pembukaan aktivitas semi-transparan baru, seperti dialog, akan menjeda aktivitas yang ditutupinya. Selama aktivitas terlihat sebagian tetapi tidak dalam fokus, aktivitas tersebut tetap dijeda.

Saat aktivitas berpindah ke status Dijeda, komponen berbasis siklus proses yang terkait dengan siklus proses aktivitas akan menerima peristiwa ON_PAUSE. Di sinilah komponen siklus proses dapat menghentikan fungsi apa pun yang tidak perlu dijalankan saat komponen tidak ada di latar depan, seperti menghentikan pratinjau kamera.

Gunakan metode onPause untuk menjeda atau menyesuaikan operasi yang tidak dapat dilanjutkan, atau mungkin dilanjutkan dalam jumlah sedang, sementara Activity berada dalam status Dijeda, dan Anda berharap untuk segera melanjutkan.

Anda juga dapat menggunakan metode onPause untuk melepaskan resource sistem, menangani sensor (seperti GPS), atau resource apa pun yang memengaruhi daya tahan baterai saat aktivitas Anda dijeda dan pengguna tidak membutuhkannya.

Namun, seperti yang disebutkan di bagian tentang onResume, aktivitas yang Dijeda mungkin masih sepenuhnya terlihat jika aplikasi berada dalam mode multi-aplikasi. Sebaiknya gunakan onStop, bukan onPause, untuk sepenuhnya melepaskan atau menyesuaikan resource dan operasi terkait UI agar lebih optimal mendukung mode multi-aplikasi.

Contoh LifecycleObserver berikut yang menanggapi peristiwa ON_PAUSE adalah kebalikan dari contoh peristiwa ON_RESUME sebelumnya, dengan merilis kamera yang diinisialisasi setelah peristiwa ON_RESUME diterima:

class CameraComponent : LifecycleObserver {
    ...
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun releaseCamera() {
        camera?.release()
        camera = null
    }
    ...
}

Contoh ini menempatkan kode rilis kamera setelah peristiwa ON_PAUSE diterima oleh LifecycleObserver.

Eksekusi onPause sangat singkat dan tidak perlu banyak waktu untuk melakukan operasi penyimpanan. Oleh karena itu, jangan gunakan onPause untuk menyimpan data aplikasi atau pengguna, melakukan panggilan jaringan, atau menjalankan transaksi database. Pekerjaan tersebut mungkin tidak selesai sebelum metode selesai.

Sebagai gantinya, lakukan operasi penonaktifan beban berat selama onStop. Untuk mengetahui informasi selengkapnya tentang operasi yang sesuai untuk dilakukan selama onStop, lihat bagian berikutnya. Untuk mengetahui informasi selengkapnya tentang cara menyimpan data, lihat bagian tentang menyimpan dan memulihkan status.

Penyelesaian metode onPause tidak berarti bahwa aktivitas meninggalkan status Dijeda. Sebaliknya, aktivitas tetap dalam status ini sampai aktivitas dilanjutkan atau menjadi tidak terlihat sama sekali oleh pengguna. Jika aktivitas dilanjutkan, sistem akan memanggil callback onResume sekali lagi.

Jika aktivitas kembali dari status Dijeda ke status Dilanjutkan, sistem akan menyimpan instance Activity tetap ada di memori, dan memanggil kembali instance tersebut ketika sistem memanggil onResume. Dalam skenario ini, Anda tidak perlu menginisialisasi ulang komponen yang dibuat selama salah satu metode callback mengarah ke status Dilanjutkan. Jika aktivitas menjadi benar-benar tidak terlihat, sistem akan memanggil onStop.

onStop

Jika aktivitas Anda tidak lagi terlihat oleh pengguna, aktivitas tersebut akan memasuki status Berhenti, dan sistem memanggil callback onStop. Hal ini dapat terjadi saat aktivitas yang baru diluncurkan menutupi seluruh layar. Sistem juga memanggil onStop saat aktivitas selesai berjalan dan akan segera dihentikan.

Saat aktivitas berpindah ke status Berhenti, komponen berbasis siklus proses yang terkait dengan siklus proses aktivitas akan menerima peristiwa ON_STOP. Di sinilah komponen siklus proses dapat menghentikan fungsi apa pun yang tidak perlu dijalankan saat komponen tidak terlihat di layar.

Dalam metode onStop, lepaskan atau sesuaikan resource yang tidak diperlukan saat aplikasi tidak terlihat oleh pengguna. Misalnya, aplikasi Anda dapat menjeda animasi atau beralih dari pembaruan lokasi yang sangat akurat ke kurang akurat. Menggunakan onStop, dan bukannya onPause, berarti pekerjaan terkait UI berlanjut, meskipun pengguna melihat aktivitas Anda dalam mode multi-aplikasi.

Selain itu, gunakan onStop untuk melakukan operasi penghentian yang relatif intensif CPU. Misalnya, jika Anda tidak dapat menemukan waktu yang lebih tepat untuk menyimpan informasi ke database, Anda dapat melakukannya selama onStop. Contoh berikut menunjukkan implementasi onStop yang menyimpan konten catatan draf ke penyimpanan persisten:

override fun onStop() {
    super.onStop()

    // Delegate the save operation to the ViewModel, which handles the
    // background thread operations (e.g., using Kotlin Coroutines and Room).
    noteViewModel.saveDraft()
}

Saat aktivitas Anda memasuki status Berhenti, objek Activity disimpan di memori: objek ini akan mempertahankan semua informasi status dan anggota, tetapi tidak dilampirkan ke pengelola jendela. Saat dilanjutkan, aktivitas akan mengingat kembali informasi ini.

Dari status Berhenti, aktivitas akan kembali untuk berinteraksi dengan pengguna, atau aktivitas akan selesai berjalan dan hilang. Jika aktivitas kembali, sistem akan memanggil onRestart. Jika Activity selesai berjalan, sistem akan memanggil onDestroy.

onDestroy

onDestroy dipanggil sebelum aktivitas dihancurkan. Sistem memanggil callback ini karena salah satu dari dua alasan berikut:

  1. Aktivitas sedang diselesaikan, karena pengguna benar-benar menutup aktivitas atau karena finish dipanggil pada aktivitas tersebut.
  2. Sistem sementara menutup aktivitas karena perubahan konfigurasi, seperti rotasi perangkat atau memasuki mode multi-aplikasi.

Saat aktivitas berpindah ke status ditutup, komponen berbasis siklus proses apa pun yang terkait dengan siklus proses aktivitas akan menerima peristiwa ON_DESTROY. Di sinilah komponen siklus proses dapat membersihkan apa pun yang diperlukan sebelum Activity dihancurkan.

Alih-alih menempatkan logika di Activity untuk menentukan alasan Activity ditutup, gunakan objek ViewModel untuk memuat data tampilan yang relevan bagi Activity Anda. Jika Activity dibuat ulang karena perubahan konfigurasi, ViewModel tidak perlu melakukan apa pun, karena dipertahankan dan diberikan ke instance Activity berikutnya.

Jika Activity tidak dibuat ulang, metode onCleared akan dipanggil di ViewModel, yang dapat membersihkan data yang diperlukan sebelum dihancurkan. Anda dapat membedakan kedua skenario ini dengan metode isFinishing.

Jika aktivitas selesai, onDestroy adalah callback siklus proses terakhir yang diterima aktivitas. Jika onDestroy dipanggil sebagai hasil dari perubahan konfigurasi, sistem akan segera membuat instance aktivitas baru, lalu memanggil onCreate pada instance baru dalam konfigurasi baru.

Callback onDestroy melepaskan semua resource yang tidak dilepaskan oleh callback sebelumnya, seperti onStop.

Status aktivitas dan pengeluaran dari memori

Sistem akan menghentikan proses saat perlu membebaskan RAM. Kemungkinan sistem menutup proses tertentu bergantung pada status proses pada saat itu. Pada gilirannya, status proses bergantung pada status aktivitas yang berjalan dalam proses. Tabel 1 menunjukkan korelasi antara status proses, status aktivitas, dan kemungkinan sistem menutup proses. Tabel ini hanya berlaku jika proses tidak menjalankan jenis komponen aplikasi lainnya.

Kemungkinan ditutup

Status proses

Status aktivitas akhir

Terendah

Latar depan (memiliki atau akan mendapatkan fokus)

Dilanjutkan

Rendah

Terlihat (tanpa fokus)

Dimulai/Dijeda

Lebih tinggi

Latar belakang (tidak terlihat)

Dihentikan

Tertinggi

Kosong

Ditutup

Tabel 1. Hubungan antara siklus proses dan status aktivitas.

Sistem tidak pernah menutup aktivitas secara langsung untuk membebaskan memori. Namun, sistem akan menghentikan proses tempat aktivitas berjalan, bukan hanya menghentikan aktivitas, tetapi juga semua hal lain yang berjalan dalam proses. Untuk mempelajari cara mempertahankan dan memulihkan status UI aktivitas Anda saat terjadi proses penghapusan yang diinisiasi sistem, lihat bagian tentang menyimpan dan memulihkan status.

Pengguna juga dapat menghentikan proses menggunakan Pengelola Aplikasi, di bagian Setelan, untuk menghentikan aplikasi yang sesuai.

Untuk mengetahui informasi selengkapnya tentang proses, lihat Ringkasan proses dan thread.

Menyimpan dan memulihkan status UI sementara

Pengguna berharap status UI aktivitas tetap sama selama perubahan konfigurasi, seperti rotasi atau beralih ke mode multi-aplikasi. Namun, sistem menutup aktivitas secara default ketika perubahan konfigurasi tersebut terjadi, sehingga menghapus semua status UI yang disimpan dalam instance aktivitas.

Demikian pula, pengguna mengharapkan status UI tetap sama jika beralih sementara dari aplikasi Anda ke aplikasi yang berbeda, lalu kembali ke aplikasi Anda nanti. Namun, sistem dapat menutup proses aplikasi saat pengguna keluar dan aktivitas dihentikan.

Jika batasan sistem menghancurkan aktivitas, pertahankan status UI sementara pengguna menggunakan kombinasi ViewModel (untuk logika bisnis dan status layar yang kompleks), API rememberSaveable Jetpack Compose (untuk status UI ringan), dan/atau penyimpanan lokal. Untuk mempelajari lebih lanjut ekspektasi pengguna dibandingkan dengan perilaku sistem dan cara terbaik untuk mempertahankan data status UI yang kompleks di seluruh aktivitas dan penutupan proses yang diinisiasi sistem, lihat Menyimpan status UI.

rememberSaveable otomatis bertahan dari perubahan konfigurasi dan penghentian proses yang diinisiasi sistem dengan menggabungkan status di balik layar, sehingga memberikan pengalaman yang lancar tanpa memerlukan boilerplate tingkat aktivitas.

Status instance

Ada beberapa skenario ketika aktivitas Anda ditutup karena perilaku aplikasi normal, seperti saat pengguna menekan tombol Kembali atau aktivitas Anda memberi sinyal penutupannya sendiri dengan memanggil metode finish.

Setelah aktivitas Anda ditutup karena pengguna menekan Kembali atau aktivitas selesai dengan sendirinya, konsep sistem dan pengguna tentang instance Activity hilang selamanya. Dalam skenario ini, ekspektasi pengguna cocok dengan perilaku sistem, dan Anda tidak perlu melakukan pekerjaan tambahan.

Namun, jika sistem menutup aktivitas karena batasan sistem (seperti perubahan konfigurasi atau tekanan memori), meskipun instance Activity yang sebenarnya hilang, sistem akan mengingat bahwa itu ada. Jika pengguna mencoba membuka kembali aktivitas, sistem membuat instance baru dari aktivitas tersebut menggunakan sekumpulan data yang disimpan yang menggambarkan status aktivitas saat ditutup.

Data tersimpan yang digunakan sistem untuk memulihkan status sebelumnya disebut status instance. Di balik layar, ini adalah kumpulan key-value pair. Secara default, sistem menggunakan status instance untuk menyimpan informasi dasar tentang tata letak UI Anda, seperti input teks pengguna atau posisi scroll.

Anda dapat terhubung ke perilaku sistem ini menggunakan rememberSaveable. Jika instance aktivitas Anda ditutup dan dibuat ulang, status UI yang di-wrap dalam rememberSaveable akan otomatis dipulihkan, tanpa kode tingkat aktivitas tambahan yang Anda perlukan.

Namun, aktivitas Anda kemungkinan akan memiliki informasi status yang lebih kompleks yang ingin Anda pulihkan, seperti data pengguna, respons jaringan, atau variabel anggota yang melacak progres pengguna. Mekanisme status instance (dan, dengan demikian, rememberSaveable) tidak sesuai untuk mempertahankan lebih dari jumlah data yang sedikit, karena memerlukan serialisasi pada thread utama dan menggunakan memori proses sistem.

Untuk menyimpan lebih dari jumlah data yang sangat kecil, lakukan pendekatan gabungan menggunakan penyimpanan lokal yang persisten, class ViewModel, dan pengangkatan status Compose, sebagaimana diuraikan dalam Menyimpan status UI.

Menyimpan status UI yang sederhana dan ringan menggunakan rememberSaveable

Saat aktivitas Anda mulai berhenti, sistem bersiap untuk menyimpan informasi status ke bundle status instance. Untuk terhubung ke perilaku sistem ini, Anda menggunakan rememberSaveable secara langsung dalam fungsi composable Anda. rememberSaveable otomatis menyimpan dan memulihkan status UI sementara, seperti input teks pengguna atau posisi scroll, di seluruh pembuatan ulang aktivitas.

Untuk menyimpan informasi status kustom yang ringan (seperti progres pengguna dalam game), deklarasikan status Anda menggunakan rememberSaveable. Framework Compose menangani serialisasi ke paket status instance di balik layar:

var userTypedQuery by rememberSaveable(typedQuery, stateSaver = TextFieldValue.Saver) {
    mutableStateOf(
        TextFieldValue(text = typedQuery, selection = TextRange(typedQuery.length))
    )
}

Untuk menyimpan data persisten, seperti preferensi pengguna atau data untuk database, ambil peluang yang sesuai saat aktivitas Anda berada di latar depan. Jika tidak muncul peluang seperti itu, simpan data persisten selama metode onStop.

Memulihkan status UI aktivitas menggunakan status instance tersimpan

Saat aktivitas Anda dibuat ulang setelah sebelumnya ditutup, pemulihan status akan otomatis. Saat menggunakan rememberSaveable, Anda tidak perlu menulis logika pemulihan eksplisit, memeriksa paket null, atau mengganti callback aktivitas. Kode yang menginisialisasi dan menyimpan status Anda juga memulihkannya dengan lancar saat aktivitas kembali:

var userTypedQuery by rememberSaveable(typedQuery, stateSaver = TextFieldValue.Saver) {
    mutableStateOf(
        TextFieldValue(text = typedQuery, selection = TextRange(typedQuery.length))
    )
}

Aktivitas dan navigasi

Aplikasi cenderung bertransisi antar-layar berkali-kali selama masa pakainya, seperti saat pengguna mengetuk tombol Kembali perangkat atau memilih tujuan baru. Aplikasi Android modern biasanya menggunakan arsitektur satu aktivitas. Daripada memulai Activity baru untuk setiap layar, aplikasi Anda menghosting satu Activity dan menggunakan komponen Navigation untuk menukar layar composable dalam aktivitas tersebut.

Untuk mempelajari cara menerapkan navigasi modern yang mengutamakan Compose, lihat panduan untuk library Navigation 3 Jetpack Compose.

Memulai satu aktivitas dari aktivitas lain

Aktivitas mungkin perlu memulai aktivitas lain di beberapa titik. Kebutuhan ini muncul, misalnya, ketika suatu aplikasi perlu berpindah dari layar saat ini ke layar baru.

Bergantung pada apakah aktivitas Anda menginginkan hasil kembali dari aktivitas baru yang akan dimulai, Anda memulai aktivitas baru menggunakan metode startActivity atau startActivityForResult. Dalam kedua kasus tersebut, Anda memasukkan objek Intent.

Objek Intent menentukan aktivitas yang tepat yang ingin Anda mulai atau menggambarkan jenis tindakan yang ingin Anda lakukan. Sistem memilih aktivitas yang sesuai untuk Anda, yang bahkan dapat berasal dari aplikasi yang berbeda. Objek Intent juga dapat membawa sejumlah kecil data untuk digunakan oleh aktivitas yang dimulai. Untuk mengetahui informasi selengkapnya tentang class Intent, lihat Intent dan Filter Intent.

startActivity

Jika aktivitas yang baru dimulai tidak perlu menampilkan hasil, aktivitas saat ini dapat memulainya dengan memanggil metode startActivity.

Saat menangani aplikasi Anda sendiri, biasanya Anda perlu meluncurkan aktivitas yang dikenal. Misalnya, cuplikan kode berikut menunjukkan cara meluncurkan aktivitas yang disebut SignInActivity.

val context = LocalContext.current

Button(onClick = {
    val intent = Intent(context, SignInActivity::class.java)
    context.startActivity(intent)
}) {
    Text("Sign In")
}

Memulai aktivitas eksternal

Meskipun navigasi aplikasi internal ditangani oleh Navigation, Activity Anda terkadang perlu memulai aktivitas lain. Hal ini biasanya terjadi saat Anda ingin memanfaatkan aplikasi eksternal untuk melakukan tindakan tertentu, seperti membuka browser web, mengirim email, atau mengambil foto.

Untuk melakukannya, Anda menggunakan objek Intent untuk mendeskripsikan jenis tindakan yang ingin Anda lakukan, dan sistem meluncurkan aktivitas yang sesuai dari aplikasi lain.

Misalnya, jika ingin mengizinkan pengguna mengirim pesan email, Anda dapat membuat intent berikut:

val intent = Intent(Intent.ACTION_SEND).apply {
    putExtra(Intent.EXTRA_EMAIL, recipientArray)
}
startActivity(intent)

Jika Anda perlu meluncurkan aktivitas eksternal dan mendapatkan hasil kembali (seperti meminta aplikasi kamera untuk mengambil foto dan menampilkan gambar), gunakan API hasil Activity modern, bukan callback startActivityForResult yang tidak digunakan lagi.

Mengoordinasikan aktivitas

Bila suatu aktivitas memulai aktivitas lain, keduanya akan mengalami transisi siklus proses. Aktivitas pertama berhenti beroperasi dan memasuki status Dijeda atau Berhenti, sedangkan aktivitas lainnya dibuat. Jika aktivitas ini membagikan data yang disimpan ke disk atau tempat lain, penting untuk dipahami bahwa aktivitas pertama tidak sepenuhnya dihentikan sebelum yang kedua dibuat. Sebaliknya, proses memulai yang kedua tumpang tindih dengan proses penghentian yang pertama.

Urutan callback siklus proses ditentukan dengan baik, terutama ketika dua aktivitas berada dalam proses yang sama—dengan kata lain, aplikasi yang sama—dan satu aktivitas memulai aktivitas yang lain. Berikut urutan operasi yang terjadi saat Aktivitas A memulai Aktivitas B:

  1. Metode onPause aktivitas A akan dieksekusi.
  2. Metode onCreate, onStart, dan onResume aktivitas B dieksekusi secara berurutan. Aktivitas B sekarang mendapatkan fokus pengguna.
  3. Jika Aktivitas A tidak lagi terlihat di layar, metode onStop-nya akan dieksekusi.

Urutan callback siklus proses ini memungkinkan Anda mengelola transisi informasi dari satu aktivitas ke aktivitas lainnya.

Referensi lainnya

Untuk mempelajari siklus proses aktivitas lebih lanjut, lihat referensi tambahan berikut:

Melihat konten