Multi-resume

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

  • Aktivitas baru yang transparan diluncurkan di atas aplikasi, saat aplikasi masih terlihat (dan karenanya, tidak dihentikan).
  • Aktivitas kehilangan fokus, namun tidak terhalang dan dapat berinteraksi dengan pengguna. Misalnya, dalam mode multi-jendela, sejumlah aktivitas dapat dilihat dan menerima input sentuhan secara bersamaan.

Situasi ini berbeda dalam jumlah jeda yang harus dilakukan aplikasi, namun tidak dapat dibedakan pada tingkat aplikasi.

Di Android 10, semua aktivitas dengan fokus teratas di tumpukan yang terlihat berada dalam status RESUMED . Hal ini meningkatkan kompatibilitas dengan mode Multi-Jendela dan MD untuk aplikasi yang menggunakan onPause() dan bukan onStop() untuk berhenti menyegarkan UI dan berinteraksi dengan pengguna. Ini berarti:

  • Kedua aktivitas di layar terpisah dilanjutkan.
  • Semua aktivitas yang paling terlihat 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 jika aktivitas tersebut tidak dapat difokuskan atau ditutup sebagian, seperti:

  • Dalam layar terpisah 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 dalam tumpukan yang sama.

Pendekatan ini menunjukkan kepada aplikasi bahwa suatu aktivitas hanya dapat menerima masukan dari pengguna dalam keadaan RESUMED . Sebelum Android 10, aktivitas juga dapat menerima masukan 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, callback ini dipanggil antara Activity#onResume() dan Activity#onPause() . Callback ini bersifat opsional dan dapat dilewati, sehingga suatu aktivitas dapat beralih dari status RESUMED ke status PAUSED tanpa menjadi yang teratas dalam sistem. Misalnya dalam mode multi-jendela. Karena callback ini bersifat opsional, maka callback ini bukan bagian dari Siklus Hidup Aktivitas dan sebaiknya jarang digunakan.

Aktivitas yang paling banyak dilanjutkan sebelumnya menerima dan menyelesaikan eksekusi onTopResumedActivity(false) sebelum aktivitas yang paling banyak dilanjutkan berikutnya menerima onTopResumedActivity(true) kecuali aktivitas sebelumnya memerlukan terlalu banyak waktu untuk menangani pemanggilan metode dan mencapai batas waktu 500 ms.

Kesesuaian

Untuk menjaga kompatibilitas saat menerapkan multi-resume, pertimbangkan solusi berikut.

Beberapa aktivitas yang dilanjutkan dalam satu proses aplikasi

  • Masalah. Di Android 9 dan yang lebih rendah, hanya satu aktivitas di sistem yang dilanjutkan dalam satu waktu. Semua transisi antar aktivitas melibatkan jeda 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 dalam satuan.
  • Larutan. Di Android 9 dan yang lebih rendah, jika dua aktivitas dari proses yang sama dilanjutkan, sistem hanya melanjutkan aktivitas yang urutan Z-nya lebih tinggi. Aplikasi yang menargetkan Android 10 dapat mendukung beberapa aktivitas untuk dilanjutkan secara bersamaan.

Akses kamera secara bersamaan

  • Masalah . Masalah ini juga terjadi di Android 9 dan lebih rendah. Misalnya, aktivitas layar penuh dan aktivitas yang dilanjutkan dapat kehilangan fokus kamera karena aktivitas yang dijeda di bagian atas dalam mode gambar-dalam-gambar, namun menjadi lebih terekspos dengan penerapan 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 hal ini, aplikasi harus menangani pemutusan sambungan kamera tanpa mengalami error. Saat sambungan terputus, aplikasi mendapatkan panggilan balik 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 tampilan lain.
  • Solusi. Pengembang harus menyertakan logika ketika aplikasi terputus dari kamera. Jika suatu aplikasi terputus dari kamera, aplikasi tersebut harus memantau callback ketersediaan kamera untuk mencoba menyambung kembali dan melanjutkan penggunaan kamera. Selain callback CameraManager#AvailabilityCallback#onCameraAvailable() yang sudah ada, Android 10 menambahkan CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged() , yang mencakup kasus ketika fokus (dan prioritas kamera) beralih di antara beberapa aktivitas yang dilanjutkan. Pengembang aplikasi harus menggunakan kedua callback 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 status yang benar setelah visibilitas diperbarui pada suatu aktivitas dan mengevaluasi status siklus hidup mana yang berlaku, aktifkan metode ActivityRecord#makeActiveIfNeeded() dari lokasi berbeda. Di Android 10, aktif berarti RESUMED atau PAUSED dan hanya berfungsi dalam dua contoh ini.

Di Android 10, melanjutkan aktivitas dilacak secara terpisah di setiap tumpukan, bukan di satu lokasi di sistem. Hal ini karena beberapa transisi aktivitas dapat dilakukan secara bersamaan dalam mode multi-jendela. Untuk detailnya, lihat ActivityStack#mInResumeTopActivity .

Callback aktivitas yang paling banyak dilanjutkan

Setelah tindakan yang dapat mengakibatkan perubahan aktivitas teratas (seperti peluncuran aktivitas, melanjutkan, atau perubahan urutan Z), ActivityStackSupervisor#updateTopResumedActivityIfNeeded() dipanggil. Metode ini memeriksa apakah aktivitas paling atas yang dilanjutkan kembali berubah dan melakukan pembaruan jika diperlukan. Jika aktivitas yang paling banyak dilanjutkan sebelumnya belum melepaskan status yang paling banyak dilanjutkan, maka pesan yang paling banyak dilanjutkan-kerugian akan dikirim ke aktivitas tersebut dan batas waktu dijadwalkan di sisi server ( ActivityStackSupervisor#scheduleTopResumedStateLossTimeout() ). Laporan status yang paling banyak dilanjutkan dikirim ke aktivitas berikutnya setelah aktivitas sebelumnya melepaskan status tersebut, atau ketika batas waktu tercapai (lihat penggunaan:

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

Item transaksi TopResumedActivityChangeItem baru telah ditambahkan untuk melaporkan perubahan status yang paling banyak dilanjutkan kepada klien dan memanfaatkan arsitektur ActivityLifecycler dari Android 9.

Status yang paling banyak dilanjutkan 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 hidup dan status dilanjutkan kembali antara sisi server dan klien.