Multi-resume

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 menampilkan CameraAccessException.
    • resizeableActivity=false tidak menjamin akses kamera eksklusif, karena aplikasi lain yang menggunakan kamera dapat dibuka di layar lain.
  • 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 menambahkan CameraManager#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.