Pembaruan yang dilakukan pada area khusus tampilan ini diberikan di bawah:
Android 10 mendukung keyboard software untuk aplikasi yang berjalan di tampilan non-default.
Aplikasi yang berjalan di layar non-default
Dalam hal tampilan yang menampilkan keyboard software Input Method Editor (IME), ada berbagai mode. Keyboard software ditampilkan di:
- Tampilan Sama tempat aplikasi yang difokuskan muncul.
- Tampilan default saat aplikasi yang difokuskan berjalan di layar non-default.
- Tidak ada tampilan sama sekali.
Sistem akan menentukan mode yang akan digunakan berdasarkan setelan layar tempat aplikasi yang difokuskan muncul. Untuk mengetahui detail selengkapnya, lihat:
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
Gambar 1. Keyboard software IME seperti yang muncul di tampilan sekunder, termasuk aplikasi target
Sistem menggunakan satu IME, tetapi dapat berpindah antar-tampilan untuk mengikuti fokus pengguna. Android 10 secara otomatis mengharapkan semua IME pihak pertama dan ketiga merevisi tata letak dan mengubah ukuran sesuai dengan ukuran layar baru saat dibuat.
Jika ada koneksi aktif di layar A, dan kolom input meminta fokus input di layar B, maka alur berikut akan terjadi:
- Koneksi input baru berasal dari kolom input di tampilan B.
InputMethodManagerService
memeriksa apakah koneksi harus disetujui.- Tampilan dipilih untuk IME. Jika layar B mendukung tampilan IME dan diizinkan untuk menampilkannya, maka B akan digunakan. Jika tidak, layar perangkat utama akan dipilih.
- Jika layar yang dipilih bukan dari layar A, koneksi akan dibuat ulang.
InputMethodService
dihancurkan lalu dibuat lagi.
Pembatasan keamanan
Sistem tidak akan menampilkan IME di layar virtual yang tidak dimiliki oleh sistem. Hal ini disebabkan oleh masalah keamanan bahwa aplikasi berbahaya dapat membuat tampilan virtual dengan dukungan dekorasi sistem yang diaktifkan dan membaca informasi sensitif pengguna dari platform, seperti prediksi pengetikan dan latar belakang kustom.
Implementasi
Di Android 9 (dan yang lebih rendah), IME hanya tersedia di layar default, seperti yang dijelaskan dalam Metode input di layar. Di Android 10 (dan yang lebih tinggi), pengguna dapat beralih di antara kolom teks input yang berbeda di layar yang berbeda dengan beralih fokus, dan jendela IME berpindah ke layar sekunder.
Implementasi di WindowManager
melacak jendela metode input (jendela IME tempat keyboard virtual digambar) dan target metode input (jendela tempat input IME masuk) untuk mengelola status IME.
Untuk InputMethodManagerService
(IMMS), tidak ada mekanisme bawaan lain yang dapat
menyebarkan perubahan tampilan ke InputMethodService
(IMS) dan
mengonfigurasi ulang tata letak keyboard saat runtime ketika memindahkan fokus ke tampilan lain.
Untuk mencapai peralihan jendela IME antar-layar, Android 10 mengimplementasikan hal berikut:
- IME dan jendela target input kini dilacak per tampilan di
DisplayContent#mInputMethodWindow
danDisplayContent#mInputMethodTarget
, sehingga WindowManager (WM) dapat mengelola status fokus IME secara independen dari setiap tampilan. - Di sisi IMMS, saat permintaan fokus klien aplikasi dari layar eksternal
diterima melalui
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
, IMMS akan terlebih dahulu melepaskan layanan metode input saat ini, lalu mengikat kembali layanan untuk melampirkan kembali token jendela IME baru untuk layar eksternal dionServiceConnected()
. - Di sisi IMS, setelah
IMS#attachToken
diterima, alur berikut terjadi:ContextImpl#updateDisplay
dipanggil untuk memperbarui tampilan konteks layanan diInputMethodService#attachToken()
. Hal ini memanggilViewGroup#addView()
untuk merevisi tata letak keyboard dan menyesuaikan dengan target tampilan yang memeriksa konteks saat ini.- Setelah
DisplayContent#setInputMethodWindowLocked()
dipanggil, implementasi mengirim perubahan konfigurasi tampilan tingkat proses menggunakanWindowProcessController
ke proses IME untuk mengganti resource dan metrik tampilan. - Klien
InputMethodService
mendapatkan konfigurasi yang benar dengan metrik tampilan yang benar setelahonConfigurationChanged()
dan panggilanViewGroup#addView()
untuk menginisialisasi ulang tampilan input.