Beberapa konfigurasi perangkat dapat berubah saat aplikasi berjalan. Perubahan tersebut mencakup, namun tidak terbatas pada:
- Ukuran tampilan aplikasi
- Orientasi layar
- Ketebalan dan ukuran font
- Lokalitas
- Mode gelap versus mode terang
- Ketersediaan keyboard
Sebagian besar perubahan konfigurasi ini terjadi karena beberapa interaksi pengguna. Misalnya,
memutar atau melipat perangkat akan mengubah jumlah ruang layar
yang tersedia untuk aplikasi Anda. Demikian pula, mengubah setelan perangkat seperti ukuran font,
bahasa, atau tema pilihan akan mengubah nilainya dalam objek
Configuration.
Parameter ini biasanya memerlukan perubahan yang cukup besar pada UI aplikasi Anda
agar platform Android memiliki mekanisme yang dibuat khusus saat berubah.
Mekanisme ini adalah pembuatan ulang Activity.
Pembuatan ulang aktivitas
Sistem membuat ulang Activity saat terjadi perubahan konfigurasi. Untuk melakukannya, sistem memanggil onDestroy dan menghancurkan instance Activity yang ada. Kemudian, sistem akan membuat instance baru menggunakan onCreate, dan instance Activity baru ini diinisialisasi dengan konfigurasi baru yang diupdate. Hal ini
juga berarti bahwa sistem juga membuat ulang UI dengan konfigurasi baru.
Biasanya, Activity bertindak sebagai host untuk composable. Saat Activity dibuat ulang, Compose juga membuat ulang UI Anda menggunakan nilai konfigurasi baru.
Perilaku pembuatan ulang membantu aplikasi Anda beradaptasi dengan konfigurasi baru melalui pemuatan ulang aplikasi secara otomatis menggunakan resource alternatif yang sesuai dengan konfigurasi perangkat baru.
Contoh pembuatan ulang
Pertimbangkan composable yang menampilkan judul statis menggunakan resource string:
// In the res/values/strings.xml file // <string name="compose">Jetpack Compose</string> // In your Compose code Text( text = stringResource(R.string.compose) )
Saat Activity dibuat, composable Text akan membaca konfigurasi saat ini (seperti bahasa) dan menyelesaikan resource string yang sesuai.
Jika bahasa berubah, sistem akan membuat ulang aktivitas. Jika hal ini terjadi,
Compose akan membuat ulang UI. Karena stringResource membaca dari konfigurasi saat ini, judul akan otomatis diperbarui ke nilai yang dilokalkan dengan benar.
Pembuatan ulang juga menghapus semua status yang disimpan sebagai kolom dalam
Activity.
Untuk mempertahankan status UI saat terjadi perubahan konfigurasi, gunakan pola pengelolaan
status yang direkomendasikan. Gunakan ViewModel untuk data dan logika bisnis, serta gunakan
rememberSaveable untuk status tingkat UI. Dengan mekanisme ini, status Anda
bertahan dari pembuatan ulang Activity sementara UI diperbarui untuk mencerminkan konfigurasi
baru.
Untuk mengetahui informasi selengkapnya tentang menyimpan status di Compose, lihat Menyimpan status UI di Compose.
Ekspektasi pengguna
Pengguna aplikasi mengharapkan status dipertahankan. Jika pengguna mengisi formulir dan membuka aplikasi lain dalam mode multi-aplikasi untuk mereferensikan informasi, pengalaman pengguna akan menjadi buruk jika mereka kembali ke formulir yang telah dihapus atau ke tempat lain di aplikasi. Sebagai developer, Anda harus memberikan pengalaman pengguna yang konsisten melalui perubahan konfigurasi dan pembuatan ulang aktivitas.
Untuk memastikan apakah status dipertahankan di aplikasi, Anda dapat melakukan tindakan yang menyebabkan perubahan konfigurasi saat aplikasi berada di latar depan dan saat aplikasi berada di latar belakang. Tindakan ini termasuk:
- Memutar perangkat
- Memasuki mode multi-aplikasi
- Mengubah ukuran aplikasi saat dalam mode multi-aplikasi atau jendela bentuk bebas
- Melipat perangkat foldable dengan beberapa layar
- Mengubah tema sistem, seperti mode gelap versus mode terang
- Mengubah ukuran font
- Mengubah bahasa sistem atau aplikasi
- Menyambungkan atau memutuskan sambungan keyboard hardware
- Menyambungkan atau memutuskan sambungan dok
Ada beberapa pendekatan yang dapat Anda lakukan untuk mempertahankan status yang relevan melalui
pembuatan ulang Activity. Yang akan digunakan bergantung pada jenis status yang ingin Anda pertahankan:
- Persistensi lokal guna menangani penghentian proses untuk data yang kompleks atau besar.
Penyimpanan lokal persisten mencakup database atau
DataStore. - Objek yang dipertahankan seperti instance
ViewModeluntuk menangani status terkait UI dalam memori saat pengguna aktif menggunakan aplikasi. rememberSaveableuntuk mempertahankan status UI sementara di seluruh perubahan konfigurasi dan penghentian proses yang diinisiasi sistem. Hal ini sesuai untuk status yang bergantung pada input pengguna, posisi scroll, atau navigasi, tetapi tidak termasuk dalamViewModel.
Untuk membaca secara mendetail tentang API untuk setiap status dan saat yang tepat untuk menggunakan masing-masing, lihat Menyimpan status UI.
Membatasi pembuatan ulang aktivitas
Anda dapat mencegah pembuatan ulang aktivitas otomatis untuk perubahan konfigurasi tertentu. Di aplikasi modern khusus Compose, UI Anda akan dikomposisi ulang, tetapi sebaiknya tangani perubahan konfigurasi secara langsung.
Secara default, perubahan konfigurasi memaksa sistem untuk menghancurkan dan membuat ulang
Aktivitas, termasuk UI dan objek apa pun yang berasal dari Aktivitas. Jika Anda mendeklarasikan bahwa Aktivitas Anda menangani perubahan konfigurasi itu sendiri, sistem akan mencegah hal ini. Sebagai gantinya, hanya objek Configuration yang diperbarui, dan
Compose merekomposisi UI Anda dengan nilai baru.
Menangani perubahan konfigurasi secara langsung di Compose memberikan beberapa manfaat:
- Peningkatan performa: Merekomposisi UI lebih murah daripada siklus pembuatan ulang Aktivitas penuh, terutama untuk perubahan kecil.
- Animasi lancar: Dengan menghindari mulai ulang Aktivitas, Anda dapat menjalankan animasi berkelanjutan di seluruh perubahan konfigurasi, seperti transisi tata letak yang lancar selama rotasi perangkat.
- Mempertahankan status: Mempertahankan instance Aktivitas mengurangi risiko hilangnya status UI sementara selama peristiwa seperti rotasi layar. Perhatikan bahwa Anda masih harus menangani penyimpanan status untuk penghentian proses yang dimulai oleh sistem.
Untuk menonaktifkan pembuatan ulang aktivitas bagi perubahan konfigurasi tertentu,
tambahkan jenis konfigurasi ke android:configChanges dalam
entri <activity> dalam file AndroidManifest.xml Anda. Nilai yang mungkin muncul dalam dokumentasi untuk atribut android:configChanges.
Kode manifes berikut menonaktifkan pembuatan ulang Activity untuk MyActivity saat
orientasi layar dan ketersediaan keyboard berubah:
<activity
android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
android:label="@string/app_name">
Android 17
Mulai Android 17 (level API 37), sistem tidak lagi memulai ulang
aktivitas secara default untuk beberapa perubahan konfigurasi yang biasanya tidak
memerlukan pembuatan ulang UI sepenuhnya.
Sebagai gantinya, aktivitas tetap aktif dan menerima update melalui callback
onConfigurationChanged().
Perubahan konfigurasi spesifik mencakup:
CONFIG_KEYBOARDCONFIG_KEYBOARD_HIDDENCONFIG_NAVIGATIONCONFIG_TOUCHSCREENCONFIG_COLOR_MODECONFIG_UI_MODE(hanya saat mode UI berubah menjadiUI_MODE_TYPE_DESKatau dariUI_MODE_TYPE_DESKke jenis lain)
Jika aplikasi Anda mengandalkan mulai ulang penuh untuk memuat ulang resource untuk perubahan ini, Anda kini harus secara eksplisit memilih untuk menggunakan perilaku lama dengan menggunakan atribut android:recreateOnConfigChanges dalam file manifes.
Atribut ini memungkinkan Anda menentukan perubahan konfigurasi yang harus memicu siklus
penghentian, penghancuran, dan pembuatan ulang aktivitas secara lengkap, misalnya:
<activity
android:name=".MyActivity"
android:recreateOnConfigChanges="keyboard|keyboardHidden|navigation|colorMode|touchscreen|...">
...
</activity>
Merespons perubahan konfigurasi
Jetpack Compose memungkinkan aplikasi Anda bereaksi lebih mudah terhadap perubahan konfigurasi.
Namun, jika Anda menonaktifkan pembuatan ulang Activity untuk semua perubahan konfigurasi yang
memungkinkan, aplikasi Anda masih harus menangani
perubahan konfigurasi dengan benar.
Objek Configuration tersedia dalam hierarki UI Compose dengan
lokal komposisi LocalConfiguration. Setiap kali berubah,
fungsi composable dapat membaca dari rekomposisi LocalConfiguration.current. Untuk
mengetahui informasi tentang cara kerja lokal komposisi, lihat Data yang
dibatasi secara lokal dengan CompositionLocal.
Contoh
Pada contoh berikut, composable menampilkan tanggal dengan format tertentu.
Composable bereaksi terhadap perubahan konfigurasi lokalitas sistem dengan memanggil
ConfigurationCompat.getLocales dengan LocalConfiguration.current.
@Composable
fun DateText(year: Int, dayOfYear: Int) {
val dateTimeFormatter = DateTimeFormatter.ofPattern(
"MMM dd",
ConfigurationCompat.getLocales(LocalConfiguration.current)[0]
)
Text(
dateTimeFormatter.format(LocalDate.ofYearDay(year, dayOfYear))
)
}
Untuk menghindari pembuatan ulang Activity saat lokalitas berubah, Activity yang menghosting
kode Compose harus memilih untuk tidak mengikuti perubahan konfigurasi lokalitas. Untuk melakukannya, tetapkan
android:configChanges ke locale|layoutDirection.
Perubahan konfigurasi: Konsep utama dan praktik terbaik
Berikut adalah konsep utama yang perlu Anda ketahui saat menangani perubahan konfigurasi:
- Konfigurasi: Konfigurasi perangkat menentukan cara UI ditampilkan kepada
pengguna, seperti ukuran tampilan aplikasi, lokalitas, atau tema sistem. Di Compose, Anda
dapat mengakses nilai konfigurasi menggunakan
LocalConfiguration. - Perubahan konfigurasi: Konfigurasi berubah melalui interaksi pengguna. Misalnya, pengguna mungkin mengubah setelan perangkat atau cara mereka berinteraksi secara fisik dengan perangkat. Tidak ada cara untuk mencegah perubahan konfigurasi.
- Pembuatan ulang
Activity: Perubahan konfigurasi menghasilkan pembuatan ulangActivitysecara default. Ini adalah mekanisme bawaan untuk menginisialisasi ulang status aplikasi untuk konfigurasi baru. - Penghancuran
Activity: Pembuatan ulangActivitymenyebabkan sistem menghancurkan instanceActivitylama dan membuat instance baru sebagai gantinya. Instance lama kini sudah tidak digunakan lagi. Hindari mempertahankan referensi ke objek yang tercakup dalam siklus proses di luar cakupan yang dimaksudkan. - Status: Status dalam instance
Activitylama tidak ada dalam instanceActivitybaru, karena keduanya adalah dua instance objek yang berbeda. Daripada mengikat status ke Aktivitas, gunakan API yang direkomendasikan untuk mempertahankan aplikasi dan status pengguna seperti yang dijelaskan dalam Menyimpan status UI. - Penonaktifan: Penonaktifan pembuatan ulang aktivitas untuk jenis perubahan konfigurasi mengharuskan aplikasi Anda diupdate dengan benar sebagai reaksi terhadap konfigurasi baru.
Untuk memberikan pengalaman pengguna yang baik, ikuti praktik terbaik berikut:
- Bersiaplah untuk perubahan konfigurasi yang sering terjadi: Jangan berasumsi bahwa perubahan konfigurasi jarang atau tidak pernah terjadi, terlepas dari level API, faktor bentuk, atau toolkit UI. Saat menyebabkan perubahan konfigurasi, pengguna ingin aplikasi melakukan update dan terus berfungsi dengan benar dengan konfigurasi baru.
- Pertahankan status: Jangan sampai status pengguna hilang saat pembuatan ulang
Activityterjadi. Pertahankan status seperti yang dijelaskan dalam Menyimpan status UI menggunakan API sepertiViewModeldanrememberSaveable. - Hindari penonaktifan sebagai perbaikan cepat: Jangan menonaktifkan pembuatan ulang
Activitysebagai pintasan untuk menghindari hilangnya status. Penonaktifan pembuatan ulang aktivitas mengharuskan Anda memenuhi janji untuk menangani perubahan, dan Anda masih dapat kehilangan status karena pembuatan ulangActivitydari perubahan konfigurasi lainnya, penghentian proses, atau penutupan aplikasi. Anda tidak dapat sepenuhnya menonaktifkan pembuatan ulangActivity. Pertahankan status seperti yang dijelaskan dalam Menyimpan status UI. - Jangan hindari perubahan konfigurasi: Jangan terapkan batasan pada orientasi,
rasio aspek, atau kemampuan mengubah ukuran untuk menghindari perubahan konfigurasi dan
pembuatan ulang
Activity. Hal ini berdampak negatif terhadap pengguna yang ingin menggunakan aplikasi Anda dengan cara yang mereka inginkan.
Menangani perubahan konfigurasi berbasis ukuran
Perubahan konfigurasi berbasis ukuran dapat terjadi kapan saja dan lebih mungkin terjadi saat aplikasi berjalan di perangkat layar besar tempat pengguna dapat memasuki mode multi-aplikasi. Mereka menginginkan aplikasi Anda berfungsi dengan baik di lingkungan tersebut.
Ada dua jenis umum perubahan ukuran: signifikan dan tidak signifikan. Perubahan ukuran yang signifikan adalah perubahan dari kumpulan resource alternatif yang berbeda ke konfigurasi baru karena adanya perbedaan ukuran layar, seperti lebar, tinggi, atau lebar terkecil. Resource ini mencakup resource yang ditentukan aplikasi itu sendiri dan resource dari library mana pun.
Membatasi pembuatan ulang aktivitas untuk perubahan konfigurasi berbasis ukuran
Jika Anda menonaktifkan pembuatan ulang Activity untuk perubahan konfigurasi berbasis ukuran,
sistem tidak akan membuat ulang Activity. Sebagai gantinya, sistem akan menerima panggilan ke
Activity.onConfigurationChanged. Setiap composable yang membaca
LocalConfiguration.current akan otomatis direkomposisi untuk mencerminkan ukuran baru.
Pembuatan ulang Activity dinonaktifkan untuk perubahan konfigurasi berbasis ukuran saat
Anda memiliki
android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout"
di file manifes.
Referensi lainnya
Untuk mengetahui informasi selengkapnya tentang menangani perubahan konfigurasi, lihat referensi tambahan berikut: