
Kembali Prediktif, fitur navigasi gestur, memungkinkan pengguna melihat pratinjau ke mana geser kembali akan 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 sepenuhnya atau di tingkat aktivitas.
Anda dapat menguji animasi kembali ke layar utama ini (seperti yang dijelaskan di bagian berikutnya 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 | Nonaktifkan sementara dengan menyetel atribut android:enableOnBackInvokedCallback ke false dalam tag
<application> atau <activity> di 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 Anda 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.
Menonaktifkan kembali prediktif
Untuk memilih tidak menggunakan, dalam AndroidManifest.xml
di tag <application>
, setel
tanda android:enableOnBackInvokedCallback
ke false
.
<application
...
android:enableOnBackInvokedCallback="false"
... >
...
</application>
Menyetelnya ke salah (false) akan melakukan hal berikut:
- Menonaktifkan sistem animasi gestur kembali prediktif.
- Mengabaikan
OnBackInvokedCallback
, tetapi panggilanOnBackPressedCallback
tetap berfungsi.
Menonaktifkan pada tingkat aktivitas
Mulai Android 16, tanda android:enableOnBackInvokedCallback
memungkinkan
Anda menonaktifkan 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, tergantung 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 dialog atau menjalankan animasi.
Jika aplikasi Anda mengaktifkan OnBackPressedCallback
atau OnBackInvokedCallback
dengan PRIORITY_DEFAULT
atau PRIORITY_OVERLAY
, animasi kembali prediktif
tidak akan berjalan dan Anda harus menangani peristiwa kembali. Jangan membuat callback ini untuk
menjalankan logika bisnis atau untuk mencatat.
Gunakan pendekatan berikut jika aplikasi Anda harus menjalankan logika bisnis atau mencatat log saat pengguna menggeser kembali:
- Gunakan
OnBackInvokedCallback
denganPRIORITY_SYSTEM_NAVIGATION_OBSERVER
di perangkat yang menjalankan Android 16 dan yang lebih tinggi. Tindakan ini membuat callback pengamat yang tidak menggunakan peristiwa kembali. Misalnya, Anda dapat mendaftarkan callback ini saat pengguna menggeser kembali dari aktivitas root, atau dengan kata lain, saat pengguna telah keluar dari aplikasi Anda. Dalam hal ini, Anda dapat mencatat peristiwa kembali atau menjalankan logika bisnis lainnya, dan animasi kembali ke layar utama akan tetap diputar. - 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 apakah
isRemoving
dalamonDestroy
bernilai benar dalam siklus proses tampilan Fragmen. Atau, catat menggunakan metodeonBackStackChangeStarted
atauonBackStackChangeCommitted
dalamFragmentManager.OnBackStackChangedListener
. - Untuk kasus Compose, catat log dalam callback
onCleared()
dariViewModel
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 operator. Callback ditambahkan ke tumpukan tempat callback yang terakhir ditambahkan dan diaktifkan akan menangani gestur kembali berikutnya dengan satu callback per gestur kembali.
Lebih mudah mengelola status aktif callback jika callback tersebut memiliki tanggung jawab tunggal. Contoh:

Gambar 2 menunjukkan cara Anda dapat 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 mencakup 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 juga, callback internal supportFragmentManager
berjalan jika callback di atas dinonaktifkan dan stack-nya tidak kosong. Perilaku ini konsisten
saat menggunakan FragmentManager
atau NavigationComponent
untuk navigasi,
karena NavigationComponent
bergantung pada FragmentManager
. Dalam contoh ini,
callback ini berjalan jika pengguna tidak memasukkan teks ke dalam formulir sehingga
callback "Apakah Anda yakin..." dinonaktifkan.
Terakhir, super.onBackPressed()
adalah callback tingkat sistem, yang akan berjalan lagi jika callback di atas dinonaktifkan. Untuk memicu animasi sistem seperti
kembali ke layar utama, lintas aktivitas, dan lintas tugas, stack
kembali 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.