Multi-resume

Di Android 9 (dan yang lebih rendah), aplikasi dimasukkan ke status PAUSED saat:

  • Aktivitas baru dan tembus cahaya diluncurkan di atas aplikasi, sementara 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 sentuh secara bersamaan.

Situasi ini berbeda dalam jumlah penjedaan yang harus dilakukan aplikasi, tetapi tidak dapat dibedakan di tingkat aplikasi.

Di Android 10, semua aktivitas yang dapat difokuskan teratas dalam tumpukan yang terlihat berada dalam status RESUMED. Hal ini meningkatkan kompatibilitas dengan Multi-Aplikasi dan mode MD untuk aplikasi yang menggunakan onPause() dan bukan onStop() untuk berhenti memuat ulang UI dan berinteraksi dengan pengguna. Artinya:

  • Kedua aktivitas dalam layar terpisah dilanjutkan.
  • Semua aktivitas yang terlihat teratas 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 jika tidak dapat difokuskan atau sebagian terhalang, seperti:

  • Dalam layar terpisah yang dikecilkan (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 ditutup oleh aktivitas transparan lainnya dalam tumpukan yang sama.

Pendekatan ini menunjukkan kepada aplikasi bahwa aktivitas hanya dapat menerima input dari pengguna 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 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 dalam sistem. Misalnya, dalam mode multi-aplikasi. Karena callback ini bersifat opsional, callback ini bukan bagian dari Siklus Proses Aktivitas dan 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 memerlukan 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 penjedaan aktivitas sebelum melanjutkan aktivitas lainnya. 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 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 serentak

  • Masalah. Masalah ini juga ada di Android 9 dan yang lebih rendah. Misalnya, aktivitas layar penuh dan 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 pemutusan kamera tanpa mengalami error. Saat terputus, aplikasi akan mendapatkan callback terputus dan semua panggilan ke API mulai menampilkan CameraAccessException.
    • resizeableActivity=false bukan jaminan 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 aplikasi 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 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 aktivitas, melanjutkan, atau perubahan urutan Z), ActivityStackSupervisor#updateTopResumedActivityIfNeeded() akan dipanggil. Metode ini memeriksa apakah aktivitas yang dilanjutkan teratas berubah dan melakukan pembaruan jika diperlukan. Jika aktivitas yang dilanjutkan teratas sebelumnya belum merilis status yang dilanjutkan teratas, pesan kehilangan status yang dilanjutkan teratas akan dikirimkan ke aktivitas tersebut dan waktu tunggu dijadwalkan di sisi server (ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()). Laporan status yang dilanjutkan teratas 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 teratas ke 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 tersebut juga memeriksa apakah callback onTopResumedActivityChanged() harus dipanggil. Hal ini memungkinkan pemisahan tertentu dalam komunikasi status siklus proses dan status yang dilanjutkan teratas antara sisi server dan klien.