Görüntülü reklamlara özgü bu alanlarda yapılan güncellemeler aşağıda verilmiştir:
Android 10, varsayılan olmayan bir ekranda çalışan uygulamalar için yazılım klavyesini destekler.
Varsayılan olmayan bir ekranda çalışan uygulamalar
Giriş Yöntemi Düzenleyici'nin (IME) yazılım klavyesini hangi ekranın gösterdiğine göre farklı modlar vardır. Yazılım klavyesi şuralarda gösterilir:
- Odaklanmış uygulamanın gösterildiği aynı ekran.
- Odaklanan uygulama varsayılan olmayan bir ekranda çalışırken varsayılan ekran.
- Hiç gösterilmez.
Sistem, hangi modun kullanılacağını odaklanan uygulamanın göründüğü ekranın ayarlarına göre belirler. Ayrıntılı bilgi için:
WindowManager#setDisplayImePolicy()
WindowManager#getDisplayImePolicy()
Şekil 1. IME yazılım klavyesi (hedef uygulama dahil) ve ikincil ekranda göründüğü gibi
Sistem tek bir IME kullanır ancak kullanıcının odağını takip etmek için ekranlar arasında geçiş yapabilir. Android 10, tüm birinci ve üçüncü taraf IME'lerin oluşturulurken düzeni düzeltmesini ve yeni ekran boyutuna göre yeniden boyutlandırmasını otomatik olarak bekler.
A ekranında etkin bir bağlantı varsa ve bir giriş alanı B ekranında giriş odağını isterse aşağıdaki akış gerçekleşir:
- B ekranındaki giriş alanından yeni bir giriş bağlantısı gelir.
InputMethodManagerService
, bağlantının onaylanıp onaylanmayacağını kontrol eder.- IME için bir ekran seçilir. B ekranı, IME'nin gösterilmesini destekliyorsa ve gösterilmesine izin veriliyorsa B kullanılır. Aksi takdirde birincil cihaz ekranı seçilir.
- Seçilen ekran A ekranından değilse bağlantı yeniden kurulur.
InputMethodService
yok edilir ve tekrar oluşturulur.
Güvenlik kısıtlaması
Sistem, kendisine ait olmayan sanal ekranlarda IME göstermez. Bunun nedeni, kötü amaçlı bir uygulamanın sistem süsleme desteği etkinleştirilmiş bir sanal ekran oluşturarak kullanıcının hassas bilgilerini (ör. yazma tahminleri ve özel arka planlar) ekrandan okuyabileceğiyle ilgili güvenlik endişesidir.
Uygulama
Ekranda Giriş yöntemleri bölümünde açıklandığı gibi, Android 9 ve önceki sürümlerde IME yalnızca varsayılan ekranda kullanılabiliyordu. Android 10 (ve sonraki sürümler) kullanıcıları, odak noktasını değiştirerek farklı ekranlardaki farklı giriş metin alanları arasında geçiş yapabilir. Bu durumda IME penceresi ikincil ekranlara taşınır.
WindowManager
uygulamasındaki uygulama, IME durumunu yönetmek için giriş yöntemi penceresini (yumuşak klavyenin çizildiği IME penceresi) ve giriş yöntemi hedefini (IME girişinin gittiği pencere) izler.
InputMethodManagerService
(IMMS) için başka hiçbir yerleşik mekanizma, görüntü değişikliğini InputMethodService
'e (IMS) iletemez ve odak başka bir ekrana taşınırken klavye düzenini çalışma zamanında yeniden yapılandıramaz.
Ekranlar arasında IME penceresi geçişini sağlamak için Android 10 aşağıdakileri uygular:
- IME ve giriş hedef penceresi artık
DisplayContent#mInputMethodWindow
veDisplayContent#mInputMethodTarget
'te ekran başına izlenir. Böylece, WindowManager (WM) IME odak durumunu her ekrandan bağımsız olarak yönetebilir. - IMMS tarafında, bir uygulama istemcisinin harici ekrandan odaklanma isteği
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus
aracılığıyla alındığında, önce mevcut giriş yöntemi hizmetinin bağlantısını kaldırır ve ardındanonServiceConnected()
içindeki harici ekran için yeni IME pencere jetonunu yeniden eklemek üzere hizmeti yeniden bağlar. - IMS tarafında,
IMS#attachToken
alındıktan sonra aşağıdaki akış gerçekleşir:ContextImpl#updateDisplay
,InputMethodService#attachToken()
içindeki hizmet bağlamının görüntüsünü güncellemek için çağrılır. Bu,ViewGroup#addView()
'ü çağırır ve klavyenin düzenini gözden geçirip mevcut bağlamı kontrol ederek hedef ekrana uyarlar.DisplayContent#setInputMethodWindowLocked()
çağrıldıktan sonra uygulama, kaynakları ve görüntüleme metriklerini geçersiz kılmak içinWindowProcessController
'ü kullanarak işlem düzeyinde görüntüleme yapılandırması değişikliklerini IME işlemine gönderir.InputMethodService
istemcisi,onConfigurationChanged()
ve giriş görünümünü yeniden başlatmak içinViewGroup#addView()
çağrısından sonra doğru görüntüleme metrikleriyle doğru yapılandırmayı alır.