Di Android 9 (dan yang lebih rendah), aplikasi dimasukkan ke dalam status PAUSED
saat:
- Aktivitas baru yang transparan diluncurkan di atas aplikasi, saat aplikasi masih terlihat (dan, karenanya, tidak dihentikan).
- Aktivitas kehilangan fokus, tetapi tidak terhalang dan dapat berinteraksi dengan pengguna. Misalnya, dalam mode multi-aplikasi, sejumlah aktivitas dapat terlihat dan menerima input sentuhan secara bersamaan.
Situasi ini berbeda dalam jumlah jeda yang harus dilakukan aplikasi, tetapi tidak dapat dibedakan di tingkat aplikasi.
Di Android 10, semua aktivitas teratas yang dapat difokuskan dalam stack yang terlihat berada dalam
status RESUMED
. Hal ini meningkatkan kompatibilitas dengan
mode Multi-Aplikasi dan MD untuk aplikasi yang menggunakan
onPause()
, bukan onStop()
, untuk berhenti memuat ulang UI dan berinteraksi
dengan pengguna. Ini artinya:
- Kedua aktivitas dalam layar terpisah akan dilanjutkan.
- Semua aktivitas yang terlihat di bagian atas dalam mode jendela bentuk bebas akan dilanjutkan.
- Aktivitas di beberapa layar dapat dilanjutkan secara bersamaan.
Gambar 1. Multi-resume di perangkat foldable
Gambar 2. Multi-resume dalam mode desktop
Aktivitas dapat berada dalam status PAUSED
jika tidak dapat difokuskan atau
terhalang sebagian, seperti:
- Dalam layar terpisah yang diperkecil (dengan peluncur di samping), aktivitas teratas tidak dilanjutkan karena tidak dapat difokuskan.
- Dalam mode picture-in-picture, aktivitas tidak dilanjutkan karena tidak dapat difokuskan.
- Saat aktivitas tercakup oleh aktivitas transparan lainnya dalam tumpukan yang sama.
Pendekatan ini menunjukkan kepada aplikasi bahwa aktivitas dapat menerima input dari
pengguna hanya dalam status RESUMED
. Sebelum Android 10,
aktivitas juga dapat menerima input dalam status PAUSED
(misalnya, coba sentuh
kedua aktivitas dalam layar terpisah secara bersamaan di perangkat yang menjalankan Android 9).
Untuk mempertahankan sinyal dilanjutkan dari rilis Android sebelumnya (dan untuk berkomunikasi saat aplikasi harus mendapatkan akses ke resource akses eksklusif atau tunggal ), Android 10 menyertakan callback baru:
Activity#onTopResumedActivityChanged(boolean onTop)
Saat dipanggil, callback ini dipanggil antara Activity#onResume()
dan Activity#onPause()
. Callback ini bersifat opsional dan dapat dilewati,
sehingga aktivitas dapat beralih dari status RESUMED
ke PAUSED
tanpa menjadi yang teratas di sistem. Misalnya, dalam mode multi-aplikasi.
Karena bersifat opsional, callback ini bukan bagian dari Siklus Proses
Aktivitas dan harus jarang digunakan.
Aktivitas yang dilanjutkan di bagian atas sebelumnya menerima dan menyelesaikan eksekusi
onTopResumedActivity(false)
sebelum aktivitas yang dilanjutkan di bagian atas berikutnya
menerima onTopResumedActivity(true)
, kecuali jika aktivitas sebelumnya
memerlukan terlalu banyak waktu untuk menangani panggilan metode dan mencapai waktu tunggu 500 md.
Kompatibilitas
Untuk mempertahankan kompatibilitas saat mengimplementasikan multi-resume, pertimbangkan solusi ini.
Beberapa aktivitas yang dilanjutkan dalam satu proses aplikasi
- Masalah. Di Android 9 dan yang lebih lama, hanya satu aktivitas dalam sistem yang dilanjutkan pada satu waktu. Semua transisi antar-aktivitas melibatkan penjedaan aktivitas sebelum melanjutkan aktivitas lain. Beberapa aplikasi dan framework (seperti Flutter, atau LocalActivityManager Android) menggunakan fakta ini, dan menyimpan status tentang aktivitas yang dilanjutkan dalam singleton.
- Solusi. Di Android 9 dan yang lebih lama, jika dua aktivitas dari proses yang sama dilanjutkan, sistem hanya akan melanjutkan aktivitas yang lebih tinggi dalam urutan Z. Aplikasi yang menargetkan Android 10 dapat mendukung beberapa aktivitas yang dilanjutkan secara bersamaan.
Akses kamera serentak
- Masalah. Masalah ini juga ada di Android 9 dan
yang lebih lama. Misalnya, aktivitas layar penuh dan yang dilanjutkan dapat kehilangan fokus kamera ke
aktivitas yang dijeda di atas dalam mode picture-in-picture, tetapi menjadi lebih terbuka dengan
adopsi mode multi-aplikasi dan multi-tampilan yang lebih luas.
- Karena perubahan yang dilakukan pada status
RESUME
, aplikasi dapat terputus dari kamera bahkan saat dilanjutkan. Untuk mengatasi hal ini, aplikasi harus menangani pemutusan koneksi kamera tanpa error. Saat terputus, aplikasi akan mendapatkan callback terputus dan semua panggilan ke API mulai menampilkanCameraAccessException
. resizeableActivity=false
tidak menjamin akses kamera eksklusif, karena aplikasi lain yang menggunakan kamera dapat dibuka di layar lain.
- Karena perubahan yang dilakukan pada status
- Solusi. Developer harus menyertakan logika saat aplikasi
terputus dari kamera. Jika terputus dari kamera, aplikasi
harus memantau callback ketersediaan kamera untuk mencoba terhubung kembali dan melanjutkan
penggunaan kamera. Selain callback
CameraManager#AvailabilityCallback#onCameraAvailable()
yang ada, Android 10 menambahkanCameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged()
, yang mencakup kasus saat fokus (dan prioritas kamera) beralih di antara beberapa aktivitas yang dilanjutkan. Developer aplikasi harus menggunakan kedua callback ini untuk menentukan waktu yang tepat untuk mencoba mendapatkan akses ke kamera.
Multi-resume
Di Android 10, status siklus proses aktivitas ditentukan oleh visibilitas dan
urutan Z. Untuk memastikan status yang benar setelah visibilitas diperbarui pada
aktivitas dan mengevaluasi status siklus proses yang berlaku, panggil
metode ActivityRecord#makeActiveIfNeeded()
dari lokasi
yang berbeda. Di Android 10, aktif berarti RESUMED
atau
PAUSED
dan hanya berfungsi dalam dua instance ini.
Di Android 10, melanjutkan aktivitas dilacak secara terpisah di setiap stack,
bukan di satu lokasi dalam sistem. Hal ini karena beberapa
transisi aktivitas dapat dilakukan secara bersamaan dalam mode multi-aplikasi. Untuk
mengetahui detailnya, lihat ActivityStack#mInResumeTopActivity
.
Callback aktivitas yang paling sering dilanjutkan
Setelah tindakan yang dapat menyebabkan perubahan aktivitas teratas (seperti peluncuran
aktivitas, melanjutkan, atau perubahan urutan Z),
ActivityStackSupervisor#updateTopResumedActivityIfNeeded()
akan dipanggil. Metode
ini memeriksa apakah aktivitas teratas yang dilanjutkan berubah dan melakukan update jika
diperlukan. Jika aktivitas yang paling sering dilanjutkan sebelumnya belum merilis status teratas yang dilanjutkan,
pesan kehilangan status yang paling sering dilanjutkan, akan dikirim ke aktivitas tersebut dan waktu tunggu
dijadwalkan di sisi server
(ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()
).
Laporan status yang paling sering dilanjutkan
dikirim ke aktivitas berikutnya setelah aktivitas sebelumnya
merilis status, atau saat waktu tunggu tercapai (lihat penggunaan:
ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()
Item transaksi TopResumedActivityChangeItem
baru ditambahkan
untuk melaporkan perubahan status yang dilanjutkan ke klien dan memanfaatkan
arsitektur ActivityLifecycler
dari Android 9.
Status yang dilanjutkan di bagian atas disimpan di sisi klien, dan setiap kali
aktivitas bertransisi ke RESUMED
atau PAUSED
, status tersebut juga
memeriksa apakah callback onTopResumedActivityChanged()
harus
dipanggil. Hal ini memungkinkan pemisahan tertentu dalam komunikasi status siklus proses
dan status yang dilanjutkan di antara sisi server dan klien.