Di Android 9 (dan yang 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 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 penjedaan yang harus dilakukan aplikasi, tetapi tidak dapat dibedakan di tingkat aplikasi.
Di Android 10, semua aktivitas teratas yang dapat difokuskan dalam tumpukan yang terlihat berada dalam status RESUMED
. Hal ini meningkatkan kompatibilitas dengan mode
Multi-Window dan MD untuk aplikasi yang menggunakan
onPause()
, bukan onStop()
, untuk menghentikan pembaruan UI dan berinteraksi
dengan pengguna. Ini artinya:
- Kedua aktivitas dalam layar terpisah dilanjutkan.
- Semua aktivitas yang terlihat paling atas dalam mode jendela bentuk bebas 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
saat tidak dapat difokuskan atau tertutup sebagian, seperti:
- Dalam layar terpisah yang diminimalkan (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 mengomunikasikan kapan aplikasi harus mendapatkan akses ke resource akses eksklusif atau singleton), Android 10 menyertakan callback baru:
Activity#onTopResumedActivityChanged(boolean onTop)
Saat dipanggil, callback ini dipanggil di 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 dalam sistem. Misalnya, dalam mode multi-aplikasi.
Karena callback ini bersifat opsional, callback ini bukan bagian dari Activity
Lifecycle dan jarang digunakan.
Aktivitas yang sebelumnya dilanjutkan di bagian atas menerima dan menyelesaikan eksekusi
onTopResumedActivity(false)
sebelum aktivitas berikutnya yang dilanjutkan di bagian atas
menerima onTopResumedActivity(true)
, kecuali jika aktivitas sebelumnya
membutuhkan terlalu banyak waktu untuk menangani panggilan metode dan mencapai waktu tunggu 500 md.
Kompatibilitas
Untuk mempertahankan kompatibilitas saat menerapkan multi-resume, pertimbangkan solusi berikut.
Beberapa aktivitas 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 jeda 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 rendah. Misalnya, aktivitas layar penuh yang dilanjutkan dapat kehilangan fokus kamera ke aktivitas yang dijeda di atas dalam mode picture-in-picture, tetapi menjadi lebih terekspos 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 terputusnya koneksi kamera tanpa mengalami error. Saat koneksi terputus, aplikasi akan mendapatkan callback koneksi terputus dan semua panggilan ke API akan mulai memunculkanCameraAccessException
. resizeableActivity=false
bukan jaminan akses kamera eksklusif, karena aplikasi lain yang menggunakan kamera dapat dibuka di tampilan lain.
- Karena perubahan yang dilakukan pada status
- Solusi. Developer harus menyertakan logika saat aplikasi terputus dari kamera. Jika koneksi aplikasi terputus dari kamera, aplikasi tersebut harus memantau callback ketersediaan kamera untuk mencoba menghubungkan 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 pembaruan visibilitas pada aktivitas dan mengevaluasi status siklus proses mana 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 tumpukan, 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 dilanjutkan teratas
Setelah tindakan yang dapat menyebabkan perubahan aktivitas teratas (seperti peluncuran, melanjutkan, atau perubahan urutan Z aktivitas),
ActivityStackSupervisor#updateTopResumedActivityIfNeeded()
dipanggil. Metode
ini memeriksa apakah aktivitas yang dilanjutkan paling atas berubah dan melakukan update jika
diperlukan. Jika aktivitas utama yang dilanjutkan sebelumnya belum melepaskan status dilanjutkan utama, pesan kehilangan status dilanjutkan utama akan dikirim ke aktivitas tersebut dan waktu tunggu akan dijadwalkan di sisi server (ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()
). Laporan status dilanjutkan utama akan dikirim ke aktivitas berikutnya setelah aktivitas sebelumnya melepaskan status, atau saat waktu tunggu tercapai (lihat penggunaan:
ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()
Item transaksi TopResumedActivityChangeItem
baru ditambahkan
untuk melaporkan perubahan status dilanjutkan teratas kepada klien dan memanfaatkan
arsitektur ActivityLifecycler
dari Android 9.
Status yang dilanjutkan teratas disimpan di sisi klien, dan setiap kali aktivitas bertransisi ke RESUMED
atau PAUSED
, aktivitas juga memeriksa apakah callback onTopResumedActivityChanged()
harus dipanggil. Hal ini memungkinkan pelepasan tertentu dalam komunikasi status siklus proses
dan status dilanjutkan teratas antara sisi server dan klien.