Di Android 9 (dan lebih rendah), aplikasi dimasukkan ke status PAUSED
saat:
- Aktivitas baru yang transparan diluncurkan di atas aplikasi, saat aplikasi masih terlihat (dan, oleh karena itu, tidak dihentikan).
- Aktivitas kehilangan fokus, tetapi tidak tertutup dan dapat berinteraksi dengan pengguna. Misalnya, dalam mode multi-jendela, 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 yang paling dapat difokuskan di tumpukan yang terlihat berada dalam status RESUMED
. Ini meningkatkan kompatibilitas dengan mode Multi-Jendela dan MD untuk aplikasi yang menggunakan onPause()
alih-alih onStop()
untuk berhenti menyegarkan UI dan berinteraksi dengan pengguna. Ini berarti:
- Kedua aktivitas di layar terpisah dilanjutkan.
- Semua aktivitas yang terlihat paling atas dalam mode windowing bentuk bebas dilanjutkan.
- Aktivitas di beberapa layar dapat dilanjutkan secara bersamaan.
Gambar 1. Multi-resume pada perangkat yang dapat dilipat
Gambar 2. Multi-resume dalam mode desktop
Aktivitas dapat berada dalam status PAUSED
ketika aktivitas tersebut tidak dapat difokuskan atau ditutup sebagian, seperti:
- Dalam layar terbagi yang diperkecil (dengan peluncur di samping), aktivitas teratas tidak dilanjutkan karena tidak dapat difokuskan.
- Dalam mode gambar-dalam-gambar, aktivitas tidak dilanjutkan karena tidak dapat difokuskan.
- Ketika aktivitas dicakup oleh aktivitas transparan lainnya di tumpukan yang sama.
Pendekatan ini menunjukkan kepada aplikasi bahwa suatu 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 di layar terpisah secara bersamaan di perangkat yang menjalankan Android 9).
Untuk mempertahankan sinyal yang dilanjutkan dari rilis Android sebelumnya (dan untuk berkomunikasi kapan aplikasi harus mendapatkan akses ke akses eksklusif atau sumber daya tunggal), Android 10 menyertakan callback baru:
Activity#onTopResumedActivityChanged(boolean onTop)
Saat dipanggil, panggilan balik ini dipanggil antara Activity#onResume()
dan Activity#onPause()
. Callback ini opsional dan dapat dilewati, sehingga aktivitas dapat beralih dari status PAUSED
ke RESUMED
tanpa menjadi yang teratas dalam sistem. Misalnya, dalam mode multi-jendela. Karena panggilan balik ini opsional, ini bukan bagian dari Siklus Hidup Aktivitas dan harus jarang digunakan.
Aktivitas yang dilanjutkan teratas sebelumnya menerima dan menyelesaikan eksekusi onTopResumedActivity(false)
sebelum aktivitas yang dilanjutkan teratas berikutnya menerima onTopResumedActivity(true)
kecuali jika aktivitas sebelumnya membutuhkan terlalu banyak waktu untuk menangani panggilan metode dan mencapai batas waktu 500 md.
Kesesuaian
Untuk menjaga kompatibilitas saat menerapkan multi-resume, pertimbangkan solusi ini.
Beberapa aktivitas yang dilanjutkan dalam satu proses aplikasi
- Masalah. Di Android 9 dan yang lebih rendah, hanya satu aktivitas dalam sistem yang dilanjutkan pada satu waktu. Semua transisi antar aktivitas melibatkan penghentian aktivitas sebelum melanjutkan aktivitas lainnya. Beberapa aplikasi dan kerangka kerja (seperti Flutter, atau LocalActivityManager Android) menggunakan fakta ini, dan menyimpan status tentang aktivitas yang dilanjutkan di lajang.
- Larutan. Di Android 9 dan yang lebih rendah, jika dua aktivitas dari proses yang sama dilanjutkan, sistem hanya melanjutkan aktivitas yang lebih tinggi dalam urutan-Z. Aplikasi yang menargetkan Android 10 dapat mendukung beberapa aktivitas yang dilanjutkan secara bersamaan.
Akses kamera secara bersamaan
- Masalah . Masalah ini juga ada di Android 9 dan lebih rendah. Misalnya, layar penuh dan aktivitas yang dilanjutkan dapat kehilangan fokus kamera ke aktivitas yang dijeda di atas dalam mode gambar-dalam-gambar tetapi menjadi lebih terbuka dengan adopsi mode multi-jendela dan multi-tampilan yang lebih luas.
- Karena perubahan yang dilakukan pada status
RESUME
, aplikasi mungkin terputus dari kamera bahkan saat dilanjutkan . Untuk mengatasi ini, aplikasi harus menangani pemutusan kamera tanpa mogok. Saat terputus, aplikasi mendapatkan panggilan balik yang terputus dan semua panggilan ke API mulai melemparkanCameraAccessException
. -
resizeableActivity=false
bukan jaminan akses kamera eksklusif, karena aplikasi lain yang menggunakan kamera dapat dibuka di layar lain.
- Karena perubahan yang dilakukan pada status
- Solusi. Pengembang harus menyertakan logika saat aplikasi terputus dari kamera. Jika aplikasi terputus dari kamera, aplikasi harus melihat panggilan balik ketersediaan kamera untuk mencoba menyambungkan kembali dan melanjutkan penggunaan kamera. Selain
CameraManager#AvailabilityCallback#onCameraAvailable()
yang ada, Android 10 menambahkanCameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged()
, yang mencakup kasus ketika fokus (dan prioritas kamera) beralih di antara beberapa aktivitas yang dilanjutkan. Pengembang aplikasi harus menggunakan kedua panggilan balik ini untuk menentukan waktu yang tepat untuk mencoba mendapatkan akses ke kamera.
Multi-resume
Di Android 10, status siklus hidup aktivitas ditentukan oleh visibilitas dan urutan-Z. Untuk memastikan bahwa status yang benar setelah visibilitas diperbarui pada suatu aktivitas dan mengevaluasi status siklus hidup mana yang berlaku, aktifkan metode ActivityRecord#makeActiveIfNeeded()
dari lokasi yang berbeda. Di Android 10, aktif berarti PAUSED
atau RESUMED
dan hanya berfungsi dalam dua contoh ini.
Di Android 10, melanjutkan aktivitas dilacak secara terpisah di setiap tumpukan, bukan di satu lokasi di sistem. Ini karena beberapa transisi aktivitas dapat dilakukan secara bersamaan dalam mode multi-jendela. Untuk detailnya, lihat ActivityStack#mInResumeTopActivity
.
Panggilan balik aktivitas yang dilanjutkan teratas
Setelah tindakan yang dapat mengakibatkan perubahan aktivitas teratas (seperti peluncuran aktivitas, melanjutkan, atau perubahan urutan Z), ActivityStackSupervisor#updateTopResumedActivityIfNeeded()
dipanggil. Metode ini memeriksa apakah aktivitas yang dilanjutkan paling atas berubah dan melakukan pembaruan jika diperlukan. Jika aktivitas teratas yang dilanjutkan sebelumnya belum merilis status dilanjutkan teratas, maka pesan kehilangan status teratas akan dikirim ke sana dan batas waktu dijadwalkan di sisi server ( ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()
). Laporan status dilanjutkan teratas dikirim ke aktivitas berikutnya setelah aktivitas sebelumnya merilis status, atau saat batas waktu tercapai (lihat penggunaan:
ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()
Item transaksi TopResumedActivityChangeItem
baru telah ditambahkan untuk melaporkan perubahan status yang dilanjutkan teratas ke klien dan memanfaatkan arsitektur ActivityLifecycler
dari Android 9.
Status dilanjutkan teratas disimpan di sisi klien, dan setiap kali aktivitas bertransisi ke RESUMED
atau PAUSED
, ia juga memeriksa apakah callback onTopResumedActivityChanged()
harus dipanggil. Ini memungkinkan decoupling tertentu dalam komunikasi status siklus hidup dan status dilanjutkan teratas antara sisi server dan klien.