Obsługa edytora metody wprowadzania

Poniżej znajdziesz informacje o zmianach wprowadzonych w tych obszarach związanych z reklamami displayowymi:

Android 10 obsługuje klawiaturę programową w przypadku aplikacji działających na wyświetlaczu innym niż domyślny.

Aplikacje działające na ekranie innym niż domyślny

W zależności od tego, na którym wyświetlaczu ma się pojawiać klawiatura ekranowa edytora IME, dostępne są różne tryby. Klawiatura ekranowa jest wyświetlana na:

  • Ten sam wyświetlacz, na którym pojawia się aplikacja, na której się skupiasz.
  • Domyślny wyświetlacz, gdy aktywna aplikacja jest uruchomiona na wyświetlaczu innym niż domyślny.
  • Brak wyświetlania.

System określa, którego trybu użyć, na podstawie ustawień wyświetlacza, na którym pojawia się aplikacja w trybie skupienia. Więcej informacji znajdziesz w tych artykułach:

  • WindowManager#setDisplayImePolicy()
  • WindowManager#getDisplayImePolicy()

Rysunek 1. Klawiatura programowa IME wyświetlana na ekranie dodatkowym, w tym aplikacja docelowa

System używa jednego edytora IME, ale może przełączać się między wyświetlaczami, aby śledzić aktywność użytkownika. Android 10 automatycznie oczekuje, że wszystkie klawiatury IME (zarówno własne, jak i zewnętrzne) będą dostosowywać układ i rozmiar do nowego rozmiaru wyświetlacza.

Jeśli na wyświetlaczu A jest aktywne połączenie, a pole wprowadzania na wyświetlaczu B wymaga fokusu, następuje ten proces:

  1. Nowe połączenie wejściowe pochodzi z pola wejściowego na wyświetlaczu B.
  2. InputMethodManagerService sprawdza, czy połączenie powinno zostać zatwierdzone.
  3. Dla edytora IME wybrano wyświetlacz. Jeśli wyświetlacz B obsługuje wyświetlanie IME i może je wyświetlać, używany jest wyświetlacz B. W przeciwnym razie wybierany jest wyświetlacz urządzenia głównego.
  4. Jeśli wybrany wyświetlacz nie jest wyświetlaczem A, połączenie zostanie przywrócone. InputMethodService jest niszczony, a następnie tworzony ponownie.

Ograniczenie zabezpieczeń

System nie będzie wyświetlać edytora IME na wyświetlaczach wirtualnych, które nie należą do systemu. Jest to związane z zagrożeniem bezpieczeństwa, ponieważ złośliwa aplikacja może utworzyć wirtualny wyświetlacz z włączoną obsługą dekoracji systemowych i odczytywać z niego poufne informacje użytkownika, takie jak prognozy pisania i niestandardowe tła.

Implementacja

W Androidzie 9 (i starszych wersjach) IME był dostępny tylko na ekranie domyślnym, jak opisano w sekcji Metody wprowadzania na ekranie. Na Androidzie 10 (i nowszych) użytkownik może przełączać się między różnymi polami tekstowymi na różnych wyświetlaczach, zmieniając fokus, a okno IME przenosi się na wyświetlacze dodatkowe.

Implementacja w WindowManager śledzi okno metody wprowadzania (okno IME, w którym rysowana jest klawiatura ekranowa) i miejsce docelowe metody wprowadzania (okno, do którego trafiają dane wejściowe IME), aby zarządzać stanem IME.

W przypadku InputMethodManagerService (IMMS) nie ma innego wbudowanego mechanizmu, który mógłby przekazywać zmianę wyświetlania do InputMethodService (IMS) i ponownie konfigurować układ klawiatury w czasie działania, gdy fokus jest przenoszony na inny wyświetlacz.

Aby umożliwić przełączanie okna IME między wyświetlaczami, Android 10 implementuje te funkcje:

  • IME i okno docelowe wprowadzania są teraz śledzone na poszczególnych wyświetlaczach w DisplayContent#mInputMethodWindowDisplayContent#mInputMethodTarget, dzięki czemu menedżer okien (WM) może zarządzać stanem fokusu IME niezależnie od każdego wyświetlacza.
  • Po stronie IMMS, gdy żądanie fokusu klienta aplikacji z wyświetlacza zewnętrznego zostanie odebrane przez ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus, najpierw odłącza bieżącą usługę metody wprowadzania, a następnie ponownie ją łączy, aby ponownie dołączyć nowy token okna IME dla wyświetlacza zewnętrznego w onServiceConnected().
  • Po stronie IMS po otrzymaniu IMS#attachToken następuje ten proces:
    • ContextImpl#updateDisplay jest wywoływana w celu zaktualizowania wyświetlania kontekstu usługi w InputMethodService#attachToken(). W tym celu ViewGroup#addView()zmienia układ klawiatury i dostosowuje go do wyświetlacza docelowego, sprawdzając bieżący kontekst.
    • Po wywołaniu funkcji DisplayContent#setInputMethodWindowLocked() implementacja wysyła zmiany konfiguracji wyświetlania na poziomie procesu za pomocą funkcji WindowProcessController do procesu IME, aby zastąpić zasoby i wyświetlić dane.
    • InputMethodService klient otrzymuje prawidłową konfigurację z prawidłowymi danymi wyświetlania po wywołaniu funkcji onConfigurationChanged()ViewGroup#addView() w celu ponownej inicjalizacji widoku wejściowego.