Giriş Yöntemi Düzenleyici Desteği

Bu ekrana özel 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üzenleyicisi'nin (IME) yazılım klavyesinin hangi ekranda gösterildiğine göre, iki farklı mod vardır. Yazılım klavyesi şurada gösterilir:

  • Odaklanılan uygulamanın göründüğü ekranla aynı .
  • Odaklanmış uygulama varsayılan olmayan bir ekranda çalışırken varsayılan ekran.

Sistem, odaklanılan uygulamanın göründüğü ekranın ayarlarına göre hangi modun kullanılacağını belirler. Daha fazla ayrıntı için bkz.

  • DisplayWindowSettings#shouldShowImeLocked()
  • DisplayWindowSettings#setShouldShowImeLocked()

Şekil 1. Hedef uygulama dahil olmak üzere ikincil ekranda göründüğü şekliyle IME yazılım klavyesi

Sistem tek bir IME kullanır, ancak kullanıcı odağını takip etmek için ekranlar arasında geçiş yapabilir. Android 10, tüm birinci ve üçüncü taraf IME'lerin düzeni yeniden gözden geçirmesini ve oluşturulduğunda yeni ekran boyutuna göre yeniden boyutlandırmasını otomatik olarak bekler.

A ekranında aktif bir bağlantı varsa ve bir giriş alanı, B ekranına giriş odağını talep ederse, aşağıdaki akış gerçekleşir:

  1. B ekranındaki giriş alanından yeni bir giriş bağlantısı gelir.
  2. InputMethodManagerService , bağlantının onaylanıp onaylanmayacağını kontrol eder.
  3. IME için bir ekran seçilir. B ekranı IME'nin gösterilmesini destekliyorsa ve göstermesine izin veriliyorsa, B kullanılır. Aksi takdirde, birincil cihaz ekranı seçilir.
  4. Seçilen ekran A ekranından değilse, bağlantı yeniden kurulur. InputMethodService yok edilir ve ardından yeniden oluşturulur.

Güvenlik kısıtlaması

Sistem, sisteme ait olmayan sanal ekranlarda bir IME göstermez. Bunun nedeni, kötü amaçlı bir uygulamanın Sistem Süslemeleri Desteği etkinleştirilmiş bir sanal ekran oluşturabilmesi ve yüzeyden yazma tahminleri ve özel arka planlar gibi kullanıcıya duyarlı bilgileri okuyabilmesi gibi bir güvenlik endişesidir.

uygulama

Android 9'da (ve daha düşük sürümlerde), IME, Ekrandan Giriş yöntemleri bölümünde açıklandığı gibi yalnızca varsayılan ekranda mevcuttu. Android 10'da (ve sonraki sürümlerde), bir kullanıcı odağı değiştirerek farklı ekranlardaki farklı giriş metin alanları arasında geçiş yapabilir ve IME penceresi ikincil ekranlara geçer.

WindowManager uygulama, IME durumunu yönetmek için giriş yöntemi penceresini (yazılım klavyesinin ç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, ekran değişikliğini InputMethodService (IMS) yayamaz ve odağı başka bir ekrana taşırken çalışma zamanında klavye düzenini 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ş hedefi penceresi artık DisplayContent#mInputMethodWindow ve DisplayContent#mInputMethodTarget içinde ekran başına izlenir, böylece WindowManager (WM) her ekrandan bağımsız olarak IME odak durumunu yönetebilir.
  • IMMS tarafında, bir uygulama istemcisinin harici ekrandan odak isteği ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus aracılığıyla alındığında, önce mevcut giriş yöntemi hizmetini çözer ve ardından yeni IME hizmetini yeniden bağlar onServiceConnected() içindeki harici ekran için pencere belirteci.
  • IMS tarafında, IMS#attachToken alındıktan sonra aşağıdaki akış gerçekleşir:
    • ContextImpl#updateDisplay , hizmet bağlamının InputMethodService#attachToken() içindeki görüntüsünü güncellemek için çağrılır. Bu, klavye düzenini gözden geçirmek ve mevcut bağlamı kontrol eden hedef ekrana uyum sağlamak için ViewGroup#addView() 'i çağırır.
    • DisplayContent#setInputMethodWindowLocked() çağrıldıktan sonra, uygulama, kaynakları geçersiz kılmak ve ölçümleri görüntülemek için WindowProcessController kullanarak süreç düzeyinde görüntü yapılandırma değişikliklerini IME işlemine gönderir.
    • InputMethodService istemcisi, giriş görünümünü yeniden başlatmak için onConfigurationChanged() ve ViewGroup#addView() çağrısından sonra doğru görüntüleme ölçümleriyle doğru yapılandırmayı alır.

Çok oturumlu Giriş Yöntemi Düzenleyici desteği

Uygun giriş kaynakları sağlamak için birden çok kullanıcı tarafından aynı anda kullanılması beklenen birden çok ekrana sahip cihaz uygulamaları, ekran başına en fazla bir tane olmak üzere birden çok giriş yöntemi düzenleyicisini (IME) aynı anda görüntüleyecek şekilde yapılandırılabilir. Aşağıdaki iki şekil, iki ekranda örnek bir çok oturumlu IME gösterir:

Şekil 2. Örnek çok oturumlu IME

Şekil 3. Örnek çok oturumlu IME

Ekran başına odak desteği, bu özellik için bir ön koşuldur. Değilse, bu özellik etkinleştirilemez. Güvenlik kısıtlamaları nedeniyle, ekran başına odak sınırlaması bu özelliği küçük bir cihaz alt kümesiyle sınırladı.

Android 10'da, çok oturumlu IME'ler için destek, farklı bir API kümesi ve azaltılmış işlevsellik ile ayrı sistem hizmetleriyle uygulanır. Çok oturumlu IME, mevcut IME'lerle uyumlu değildir. Ya çok oturumlu ya da tek oturumlu hizmet kullanılabilir, ancak ikisi birden kullanılamaz.

Tek bir IME istemcisinin aynı anda odaklanabileceği varsayımı, Android 1.5'te Android IME API'leri kullanıma sunulmadan ve InputMethodService birçok genel API'nin kullanıma sunulmasından önce yapıldığından, InputMethodService sınıfının üzerine inşa edilmiş mevcut Android IME'lerini kullanmak mümkün değildir. zaten bu varsayıma büyük ölçüde güveniyordu. Ancak, çok istemcili bir senaryoyu desteklemek için InputMethodService sınıfını güncellemek zordur çünkü:

  1. Bunu yapmak, InputMethodService içine zaten bakımı zor olan kabul edilemez bir karmaşıklık getirecektir.
  2. IME geliştiricilerinin, birden fazla odaklanmış IME istemcisinden gelen paralel istekleri destekleyebilmek için uygulamalarını güncellemeleri gerekir; bu, kendi taraflarında önemsiz olmayan bir yeniden tasarım gerektirebilir (giriş kod çözücü ve yazma geçmişi veritabanı gibi).
  3. Çoklu IME istemcileri için gerçek kullanım senaryolarının hızla gelişmesi bekleniyor, bu nedenle yeni protokol kararlı değil ve genel API'ler olarak kullanıma hazır değil.

Tek oturumlu (normal) IME'de olduğu gibi, IME'yi ayrı ekranlarda gösterme kontrolü DisplayWindowSettings kullanılarak gerçekleştirilir.

development/samples/MultiClientInputMethod bulunan bir örnek çok oturumlu IME vardır.

Çok oturumlu IME'yi test etmek için:

  1. config_perDisplayFocusEnabled öğesini true olarak ayarlayın.
  2. Bu komutları çalıştırın:
    1. $ make -j MultiClientInputMethod
    2. $ adb install -r $OUT/system/priv-app/MultiClientInputMethod/MultiClientInputMethod.apk
    3. $ adb root
    4. $ adb shell setprop persist.debug.multi_client_ime \
      com.example.android.multiclientinputmethod/.MultiClientInputMethod
    5. $ adb reboot
  3. Birden çok metin girişi senaryosu deneyin.

uygulama

Uygulama ayrıntıları için MultiClientInputMethodManagerService bakın.

,

Bu ekrana özel 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üzenleyicisi'nin (IME) yazılım klavyesinin hangi ekranda gösterildiğine göre, iki farklı mod vardır. Yazılım klavyesi şurada gösterilir:

  • Odaklanılan uygulamanın göründüğü ekranla aynı .
  • Odaklanmış uygulama varsayılan olmayan bir ekranda çalışırken varsayılan ekran.

Sistem, odaklanılan uygulamanın göründüğü ekranın ayarlarına göre hangi modun kullanılacağını belirler. Daha fazla ayrıntı için bkz.

  • DisplayWindowSettings#shouldShowImeLocked()
  • DisplayWindowSettings#setShouldShowImeLocked()

Şekil 1. Hedef uygulama dahil olmak üzere ikincil ekranda göründüğü şekliyle IME yazılım klavyesi

Sistem tek bir IME kullanır, ancak kullanıcı odağını takip etmek için ekranlar arasında geçiş yapabilir. Android 10, tüm birinci ve üçüncü taraf IME'lerin düzeni yeniden gözden geçirmesini ve oluşturulduğunda yeni ekran boyutuna göre yeniden boyutlandırmasını otomatik olarak bekler.

A ekranında aktif bir bağlantı varsa ve bir giriş alanı, B ekranına giriş odağını talep ederse, aşağıdaki akış gerçekleşir:

  1. B ekranındaki giriş alanından yeni bir giriş bağlantısı gelir.
  2. InputMethodManagerService , bağlantının onaylanıp onaylanmayacağını kontrol eder.
  3. IME için bir ekran seçilir. B ekranı IME'nin gösterilmesini destekliyorsa ve göstermesine izin veriliyorsa, B kullanılır. Aksi takdirde, birincil cihaz ekranı seçilir.
  4. Seçilen ekran A ekranından değilse, bağlantı yeniden kurulur. InputMethodService yok edilir ve ardından yeniden oluşturulur.

Güvenlik kısıtlaması

Sistem, sisteme ait olmayan sanal ekranlarda bir IME göstermez. Bunun nedeni, kötü amaçlı bir uygulamanın Sistem Süslemeleri Desteği etkinleştirilmiş bir sanal ekran oluşturabilmesi ve yüzeyden yazma tahminleri ve özel arka planlar gibi kullanıcıya duyarlı bilgileri okuyabilmesi gibi bir güvenlik endişesidir.

uygulama

Android 9'da (ve daha düşük sürümlerde), IME, Ekrandan Giriş yöntemleri bölümünde açıklandığı gibi yalnızca varsayılan ekranda mevcuttu. Android 10'da (ve sonraki sürümlerde), bir kullanıcı odağı değiştirerek farklı ekranlardaki farklı giriş metin alanları arasında geçiş yapabilir ve IME penceresi ikincil ekranlara geçer.

WindowManager uygulama, IME durumunu yönetmek için giriş yöntemi penceresini (yazılım klavyesinin ç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, ekran değişikliğini InputMethodService (IMS) yayamaz ve odağı başka bir ekrana taşırken çalışma zamanında klavye düzenini 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ş hedefi penceresi artık DisplayContent#mInputMethodWindow ve DisplayContent#mInputMethodTarget içinde ekran başına izlenir, böylece WindowManager (WM) her ekrandan bağımsız olarak IME odak durumunu yönetebilir.
  • IMMS tarafında, bir uygulama istemcisinin harici ekrandan odak isteği ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus aracılığıyla alındığında, önce mevcut giriş yöntemi hizmetini çözer ve ardından yeni IME hizmetini yeniden bağlar onServiceConnected() içindeki harici ekran için pencere belirteci.
  • IMS tarafında, IMS#attachToken alındıktan sonra aşağıdaki akış gerçekleşir:
    • ContextImpl#updateDisplay , hizmet bağlamının InputMethodService#attachToken() içindeki görüntüsünü güncellemek için çağrılır. Bu, klavye düzenini gözden geçirmek ve mevcut bağlamı kontrol eden hedef ekrana uyum sağlamak için ViewGroup#addView() 'i çağırır.
    • DisplayContent#setInputMethodWindowLocked() çağrıldıktan sonra, uygulama, kaynakları geçersiz kılmak ve ölçümleri görüntülemek için WindowProcessController kullanarak süreç düzeyinde görüntü yapılandırma değişikliklerini IME işlemine gönderir.
    • InputMethodService istemcisi, giriş görünümünü yeniden başlatmak için onConfigurationChanged() ve ViewGroup#addView() çağrısından sonra doğru görüntüleme ölçümleriyle doğru yapılandırmayı alır.

Çok oturumlu Giriş Yöntemi Düzenleyici desteği

Uygun giriş kaynakları sağlamak için birden çok kullanıcı tarafından aynı anda kullanılması beklenen birden çok ekrana sahip cihaz uygulamaları, ekran başına en fazla bir tane olmak üzere birden çok giriş yöntemi düzenleyicisini (IME) aynı anda görüntüleyecek şekilde yapılandırılabilir. Aşağıdaki iki şekil, iki ekranda örnek bir çok oturumlu IME gösterir:

Şekil 2. Örnek çok oturumlu IME

Şekil 3. Örnek çok oturumlu IME

Ekran başına odak desteği, bu özellik için bir ön koşuldur. Değilse, bu özellik etkinleştirilemez. Güvenlik kısıtlamaları nedeniyle, ekran başına odak sınırlaması bu özelliği küçük bir cihaz alt kümesiyle sınırladı.

Android 10'da, çok oturumlu IME'ler için destek, farklı bir API kümesi ve azaltılmış işlevsellik ile ayrı sistem hizmetleriyle uygulanır. Çok oturumlu IME, mevcut IME'lerle uyumlu değildir. Ya çok oturumlu ya da tek oturumlu hizmet kullanılabilir, ancak ikisi birden kullanılamaz.

Tek bir IME istemcisinin aynı anda odaklanabileceği varsayımı, Android 1.5'te Android IME API'leri kullanıma sunulmadan ve InputMethodService birçok genel API'nin kullanıma sunulmasından önce yapıldığından, InputMethodService sınıfının üzerine inşa edilmiş mevcut Android IME'lerini kullanmak mümkün değildir. zaten bu varsayıma büyük ölçüde güveniyordu. Ancak, çok istemcili bir senaryoyu desteklemek için InputMethodService sınıfını güncellemek zordur çünkü:

  1. Bunu yapmak, InputMethodService içine zaten bakımı zor olan kabul edilemez bir karmaşıklık getirecektir.
  2. IME geliştiricilerinin, birden fazla odaklanmış IME istemcisinden gelen paralel istekleri destekleyebilmek için uygulamalarını güncellemeleri gerekir; bu, kendi taraflarında önemsiz olmayan bir yeniden tasarım gerektirebilir (giriş kod çözücü ve yazma geçmişi veritabanı gibi).
  3. Çoklu IME istemcileri için gerçek kullanım senaryolarının hızla gelişmesi bekleniyor, bu nedenle yeni protokol kararlı değil ve genel API'ler olarak kullanıma hazır değil.

Tek oturumlu (normal) IME'de olduğu gibi, IME'yi ayrı ekranlarda gösterme kontrolü DisplayWindowSettings kullanılarak gerçekleştirilir.

development/samples/MultiClientInputMethod bulunan bir örnek çok oturumlu IME vardır.

Çok oturumlu IME'yi test etmek için:

  1. config_perDisplayFocusEnabled öğesini true olarak ayarlayın.
  2. Bu komutları çalıştırın:
    1. $ make -j MultiClientInputMethod
    2. $ adb install -r $OUT/system/priv-app/MultiClientInputMethod/MultiClientInputMethod.apk
    3. $ adb root
    4. $ adb shell setprop persist.debug.multi_client_ime \
      com.example.android.multiclientinputmethod/.MultiClientInputMethod
    5. $ adb reboot
  3. Birden çok metin girişi senaryosu deneyin.

uygulama

Uygulama ayrıntıları için MultiClientInputMethodManagerService bakın.