
Kembali Prediktif, fitur navigasi gestur, memungkinkan pengguna melihat pratinjau tempat geser kembali membawa mereka.
Misalnya, menggunakan gestur kembali dapat menampilkan pratinjau animasi Layar utama di belakang aplikasi, seperti yang ditampilkan dalam mockup pada gambar 1.
Mulai Android 15, opsi developer untuk animasi kembali prediktif tidak lagi tersedia. Animasi sistem seperti kembali ke layar utama, lintas tugas, dan lintas aktivitas kini muncul untuk aplikasi yang telah mengaktifkan gestur kembali prediktif secara keseluruhan atau di tingkat aktivitas.
Anda dapat menguji animasi kembali ke layar utama ini (seperti yang dijelaskan di bagian berikut di halaman ini).
Agar dapat mendukung gestur kembali prediktif, Anda harus mengupdate aplikasi menggunakan
OnBackPressedCallback
AppCompat 1.6.0-alpha05
(AndroidX) yang kompatibel dengan versi sebelumnya atau
API yang lebih tinggi, atau menggunakan versi baru API platform
OnBackInvokedCallback
. Sebagian besar aplikasi menggunakan AndroidX API yang kompatibel dengan versi sebelumnya.
Update ini menyediakan jalur migrasi untuk menangkap navigasi kembali dengan benar,
yang melibatkan penggantian intersepsi kembali dari KeyEvent.KEYCODE_BACK
dan class apa pun dengan metode onBackPressed
seperti Activity
dan
Dialog
dengan Back API sistem yang baru.
Codelab dan video Google I/O
Selain menggunakan dokumentasi di halaman ini, coba codelab kami. Codelab ini menyediakan implementasi kasus penggunaan umum tentang WebView yang menangani gestur kembali prediktif menggunakan AndroidX Activity API.
Anda juga dapat melihat video Google I/O kami, yang mencakup contoh tambahan untuk mengimplementasikan AndroidX dan API platform.
Mengupdate aplikasi yang menggunakan navigasi kembali default
Kembali prediktif diaktifkan secara default.
Jika aplikasi Anda menggunakan Fragment atau Komponen Navigasi, upgrade juga ke AndroidX Activity 1.6.0-alpha05 atau yang lebih tinggi.
Mengupdate aplikasi yang menggunakan navigasi kembali kustom
Jika aplikasi Anda menerapkan perilaku kembali kustom, ada jalur migrasi yang berbeda, bergantung pada apakah aplikasi tersebut menggunakan AndroidX dan caranya menangani navigasi kembali.
Aplikasi Anda menggunakan AndroidX | Cara aplikasi Anda menangani navigasi kembali | Jalur migrasi yang direkomendasikan (link di halaman ini) |
Ya | API AndroidX | Memigrasikan implementasi kembali AndroidX yang ada |
API platform yang tidak didukung | Memigrasikan aplikasi AndroidX yang berisi API navigasi kembali yang tidak didukung ke API AndroidX | |
Tidak | API platform yang tidak didukung, dapat dimigrasikan | Memigrasikan aplikasi yang menggunakan API navigasi kembali yang tidak didukung ke API platform |
API platform tidak didukung, tetapi tidak dapat dimigrasikan | Pilih untuk tidak ikut sementara dengan menetapkan atribut android:enableOnBackInvokedCallback ke false di
tag <application> atau <activity> dari file AndroidManifest.xml aplikasi Anda. |
Memigrasikan implementasi navigasi kembali AndroidX
Kasus penggunaan ini adalah yang paling umum (dan paling direkomendasikan). Ini berlaku untuk aplikasi baru
atau yang sudah ada, yang menerapkan penanganan navigasi gestur khusus dengan
OnBackPressedDispatcher
, seperti yang dijelaskan dalam
Menyediakan navigasi kembali khusus.
Untuk memastikan API yang sudah menggunakan OnBackPressedDispatcher
(seperti Fragment dan Komponen Navigasi) berfungsi dengan lancar
menggunakan gestur kembali prediktif, upgrade ke
AndroidX Activity 1.6.0-alpha05.
```xml
// In your build.gradle file:
dependencies {
// Add this in addition to your other dependencies
implementation "androidx.activity:activity:1.6.0-alpha05"
```
Memigrasikan aplikasi AndroidX yang berisi API navigasi kembali yang tidak didukung ke API AndroidX
Jika aplikasi Anda menggunakan library AndroidX, tetapi menerapkan atau membuat referensi ke API navigasi kembali yang tidak didukung, Anda harus bermigrasi untuk menggunakan API AndroidX untuk mendukung perilaku baru.
Untuk memigrasikan API yang tidak didukung ke API AndroidX:
Migrasikan logika penanganan Kembali sistem Anda ke
OnBackPressedDispatcher
AndroidX dengan implementasiOnBackPressedCallback
. Untuk panduan mendetail, lihat Menyediakan navigasi kembali khusus.Nonaktifkan
OnBackPressedCallback
saat siap menghentikan intersepsi gestur kembali.Menghentikan intersepsi peristiwa kembali melalui
OnBackPressed
atauKeyEvent.KEYCODE_BACK
.Pastikan untuk mengupgrade ke AndroidX Activity 1.6.0-alpha05.
// In your build.gradle file: dependencies { // Add this in addition to your other dependencies implementation "androidx.activity:activity:1.6.0-alpha05"
Memigrasikan aplikasi yang menggunakan API navigasi kembali yang tidak didukung ke API platform
Jika aplikasi Anda tidak dapat menggunakan library AndroidX dan sebagai gantinya mengimplementasikan atau membuat
referensi ke navigasi Kembali kustom menggunakan API yang tidak didukung, Anda harus bermigrasi
ke API platform OnBackInvokedCallback
.
Selesaikan langkah-langkah berikut untuk memigrasikan API yang tidak didukung ke API platform:
Gunakan
OnBackInvokedCallback
API baru di perangkat yang menjalankan Android 13 atau versi lebih baru, dan manfaatkan API yang tidak didukung di perangkat yang menjalankan Android 12 atau versi lebih lama.Daftarkan logika kembali kustom Anda di
OnBackInvokedCallback
denganonBackInvokedDispatcher
. Langkah ini akan mencegah aktivitas saat ini diselesaikan, dan callback Anda akan mendapat kesempatan untuk bereaksi terhadap tindakan Kembali setelah pengguna menyelesaikan navigasi Kembali sistem.Batalkan pendaftaran
OnBackInvokedCallback
saat siap menghentikan intersepsi gestur kembali. Jika tidak, pengguna mungkin akan melihat perilaku yang tidak diinginkan saat menggunakan navigasi Kembali sistem—misalnya, "terhenti" di antara tampilan dan memaksa mereka untuk menghentikan paksa aplikasi Anda.Berikut contoh cara memigrasikan logika dari
onBackPressed
:Kotlin
@Override fun onCreate() { if (BuildCompat.isAtLeastT()) { onBackInvokedDispatcher.registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT ) { /** * onBackPressed logic goes here. For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/window/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } } }
Java
@Override void onCreate() { if (BuildCompat.isAtLeastT()) { getOnBackInvokedDispatcher().registerOnBackInvokedCallback( OnBackInvokedDispatcher.PRIORITY_DEFAULT, () -> { /** * onBackPressed logic goes here - For instance: * Prevents closing the app to go home screen when in the * middle of entering data to a form * or from accidentally leaving a fragment with a WebView in it * * Unregistering the callback to stop intercepting the back gesture: * When the user transitions to the topmost screen (activity, fragment) * in the BackStack, unregister the callback by using * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback * (https://developer.android.com/reference/kotlin/android/view/OnBackInvokedDispatcher#unregisteronbackinvokedcallback) */ } ); } }
Hentikan intersepsi peristiwa kembali menggunakan
OnBackPressed
atauKeyEvent.KEYCODE_BACK
untuk Android 13 dan yang lebih baru.
Anda dapat mendaftarkan OnBackInvokedCallback
dengan PRIORITY_DEFAULT
atau
PRIORITY_OVERLAY
, yang tidak tersedia di OnBackPressedCallback
AndroidX
yang serupa. Mendaftarkan callback dengan PRIORITY_OVERLAY
akan membantu dalam beberapa kasus.
Hal ini berlaku saat Anda bermigrasi dari onKeyPreIme()
dan callback perlu
menerima gestur kembali, bukan IME terbuka. IME mendaftarkan callback dengan
PRIORITY_DEFAULT
saat dibuka. Daftarkan callback Anda ke PRIORITY_OVERLAY
untuk memastikan OnBackInvokedDispatcher
mengirim gestur kembali ke callback Anda,
bukan IME terbuka.
Memilih tidak menggunakan kembali prediktif
Untuk memilih tidak ikut, di AndroidManifest.xml
, di tag <application>
, tetapkan
tanda android:enableOnBackInvokedCallback
ke false
.
<application
...
android:enableOnBackInvokedCallback="false"
... >
...
</application>
Menetapkan setelan ini ke salah (false) akan melakukan hal berikut:
- Menonaktifkan sistem animasi gestur kembali prediktif.
- Mengabaikan
OnBackInvokedCallback
, tetapi panggilanOnBackPressedCallback
tetap berfungsi.
Menonaktifkan feed perjalanan di tingkat aktivitas
Mulai Android 16, tanda android:enableOnBackInvokedCallback
memungkinkan
Anda memilih untuk tidak menggunakan animasi sistem prediktif pada tingkat aktivitas. Perilaku ini
membuat proses migrasi aplikasi multi-aktivitas besar ke gestur kembali
prediktif menjadi lebih mudah.
Kode berikut menunjukkan contoh enableOnBackInvokedCallback
yang ditetapkan untuk
mengaktifkan animasi sistem "kembali ke layar utama" dari MainActivity
:
<manifest ...>
<application . . .
android:enableOnBackInvokedCallback="false">
<activity
android:name=".MainActivity"
android:enableOnBackInvokedCallback="true"
...
</activity>
<activity
android:name=".SecondActivity"
android:enableOnBackInvokedCallback="false"
...
</activity>
</application>
</manifest>
Harap perhatikan hal-hal berikut saat menggunakan
tanda android:enableOnBackInvokedCallback
:
- Menyetel
android:enableOnBackInvokedCallback=false
akan menonaktifkan animasi kembali prediktif baik pada tingkat aktivitas maupun pada tingkat aplikasi, bergantung pada tempat Anda menetapkan tag, dan memerintahkan sistem untuk mengabaikan panggilan ke API platformOnBackInvokedCallback
. Namun, panggilan keOnBackPressedCallback
akan terus berjalan karenaOnBackPressedCallback
kompatibel dengan versi lama dan memanggilonBackPressed
API, yang tidak didukung sebelum Android 13. - Menyetel tanda
enableOnBackInvokedCallback
pada tingkat aplikasi akan menetapkan nilai default untuk semua aktivitas di aplikasi. Anda dapat mengganti setelan default per aktivitas dengan menyetel tanda pada tingkat aktivitas, seperti yang ditunjukkan dalam contoh kode sebelumnya.
Praktik terbaik callback
Berikut adalah praktik terbaik untuk menggunakan callback kembali sistem yang didukung;
BackHandler
(untuk Compose), OnBackPressedCallback
, atau
OnBackInvokedCallback
.
Menentukan Status UI yang mengaktifkan dan menonaktifkan setiap callback
Status UI adalah properti yang mendeskripsikan UI. Sebaiknya ikuti langkah-langkah tingkat tinggi ini.
Tentukan status UI yang mengaktifkan dan menonaktifkan setiap callback.
Tentukan status tersebut menggunakan jenis holder data yang dapat diamati, seperti
StateFlow
atau Status Compose, dan aktifkan atau nonaktifkan callback saat status berubah.
Jika aplikasi Anda sebelumnya mengaitkan logika kembali dengan pernyataan bersyarat, hal ini mungkin menandakan bahwa Anda bereaksi terhadap peristiwa kembali setelah peristiwa itu terjadi. Hindari pola ini dengan callback yang lebih baru. Jika memungkinkan, pindahkan callback ke luar pernyataan bersyarat dan kaitkan callback ke jenis holder data yang dapat diamati.
Menggunakan callback kembali sistem untuk Logika UI
Logika UI menentukan cara menampilkan UI. Gunakan callback kembali sistem untuk menjalankan logika UI, seperti menampilkan pop-up atau menjalankan animasi.
Jika aplikasi Anda mengaktifkan callback kembali sistem, animasi prediktif tidak akan berjalan, dan Anda harus menangani peristiwa kembali. Jangan membuat callback hanya untuk menjalankan logika non-UI.
Misalnya, jika Anda menghentikan peristiwa kembali hanya untuk mencatat, sebaiknya catat dalam siklus proses Aktivitas atau Fragmen saja.
- Untuk kasus aktivitas ke aktivitas atau kasus fragmen ke aktivitas, catat jika
isFinishing
dalamonDestroy
adalahtrue
dalam siklus proses Aktivitas. - Untuk kasus fragmen ke fragmen, catat jika
isRemoving
dalamonDestroy
bernilai benar dalam siklus proses tampilan Fragmen. Atau, catat menggunakan metodeonBackStackChangeStarted
atauonBackStackChangeCommitted
dalamFragmentManager.OnBackStackChangedListener
.
Untuk kasus Compose, catat dalam callback onCleared()
dari ViewModel
yang terkait dengan tujuan Compose. Ini adalah sinyal terbaik untuk mengetahui
kapan tujuan compose dikeluarkan dari data sebelumnya dan dihancurkan.
Membuat callback tanggung jawab tunggal
Anda dapat menambahkan beberapa callback ke dispatcher. Callback ditambahkan ke tumpukan tempat callback yang terakhir ditambahkan dan diaktifkan akan menangani gestur kembali berikutnya dengan satu callback per gestur kembali.
Lebih mudah untuk mengelola status callback yang diaktifkan jika callback tersebut memiliki satu tanggung jawab. Contoh:

Gambar 2 menunjukkan cara memiliki beberapa callback dalam stack, yang masing-masing bertanggung jawab atas satu hal. Callback hanya berjalan jika callback di atasnya dalam stack dinonaktifkan. Dalam contoh ini, callback "Apakah Anda yakin..." diaktifkan saat pengguna memasukkan data ke dalam formulir, dan dinonaktifkan jika tidak. Callback akan membuka dialog konfirmasi saat pengguna menggeser kembali untuk keluar dari formulir.
Callback lainnya dapat menyertakan komponen material yang mendukung kembali prediktif, transisi AndroidX menggunakan Progress API, atau callback kustom lainnya.
Callback childFragmentManager
berjalan jika callback di atas
dinonaktifkan dan data sebelumnya untuk FragmentManager
ini tidak kosong, dengan
childFragmentManager
dilampirkan dalam Fragment. Dalam contoh ini, callback internal ini dinonaktifkan.
Demikian pula, callback internal supportFragmentManager
akan berjalan jika callback
di atas dinonaktifkan dan stack-nya tidak kosong. Perilaku ini konsisten
saat menggunakan FragmentManager
atau NavigationComponent
untuk navigasi,
karena NavigationComponent
mengandalkan FragmentManager
. Dalam contoh ini, callback ini dijalankan jika pengguna tidak memasukkan teks ke dalam formulir sehingga callback "Are you sure..." dinonaktifkan.
Terakhir, super.onBackPressed()
adalah callback tingkat sistem, yang lagi-lagi berjalan jika
callback di atas dinonaktifkan. Untuk memicu animasi sistem seperti
kembali ke layar utama, lintas aktivitas, dan lintas tugas, data sebelumnya
supportFragmentManager
harus kosong sehingga callback internalnya dinonaktifkan.
Menguji animasi gestur kembali prediktif
Jika masih menggunakan Android 13 atau Android 14, Anda dapat menguji animasi kembali-ke-layar-utama yang ditampilkan pada Gambar 1.
Untuk menguji animasi ini, selesaikan langkah-langkah berikut:
Di perangkat, buka Setelan > Sistem > Opsi developer.
Pilih Animasi kembali prediktif.
Luncurkan aplikasi yang telah diupdate, dan gunakan gestur kembali untuk melihat cara kerjanya.