Obsługa edytora metod wprowadzania

Poniżej przedstawiono aktualizacje wprowadzone w tych obszarach specyficznych dla wyświetlacza:

Android 10 obsługuje klawiaturę programową dla 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, który wyświetlacz pokazuje klawiaturę programową edytora metody wprowadzania (IME), istnieją różne tryby. Klawiatura programowa jest pokazana na:

  • Ten sam ekran, na którym pojawia się wybrana aplikacja.
  • Domyślny wyświetlacz, gdy aktywna aplikacja działa na ekranie innym niż domyślny.
  • Brak wyświetlacza.

System określa, którego trybu użyć, na podstawie ustawień wyświetlacza, na którym pojawia się dana aplikacja. Więcej szczegółów znajdziesz w:

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

Rysunek 1. Klawiatura programowa IME wyświetlana na wyświetlaczu dodatkowym, łącznie z aplikacją docelową

System wykorzystuje pojedynczy edytor IME, ale może przełączać się między ekranami, dostosowując się do skupienia użytkownika. Android 10 automatycznie oczekuje, że po utworzeniu wszystkie edytory IME własne i innych firm poprawią układ i zmienią rozmiar zgodnie z nowym rozmiarem wyświetlacza.

Jeśli na wyświetlaczu A istnieje aktywne połączenie, a pole wejściowe żąda fokusu wprowadzania danych na wyświetlaczu B, następuje następujący przebieg:

  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. Wybrano wyświetlacz dla edytora IME. Jeśli wyświetlacz B obsługuje wyświetlanie edytora IME i może go wyświetlać, używany jest wyświetlacz B. W przeciwnym razie wybrany zostanie główny wyświetlacz urządzenia.
  4. Jeśli wybrany wyświetlacz nie pochodzi z wyświetlacza A, połączenie zostanie ponownie nawiązane. InputMethodService zostaje zniszczona, a następnie utworzona ponownie.

Ograniczenie bezpieczeństwa

System nie wyświetli edytora IME na wirtualnych wyświetlaczach, które nie są własnością systemu. Dzieje się tak ze względów bezpieczeństwa, ponieważ złośliwa aplikacja może utworzyć wirtualny wyświetlacz z włączoną obsługą dekoracji systemowych i odczytać z powierzchni informacje wrażliwe dla użytkownika, takie jak podpowiedzi dotyczące pisania i niestandardowe tła.

Realizacja

W systemie Android 9 (i starszych) edytor IME był dostępny tylko na ekranie domyślnym, zgodnie z opisem w sekcji Metody wprowadzania na ekranie . W systemie Android 10 (i nowszych) użytkownik może przełączać się między różnymi polami tekstu wejściowego na różnych wyświetlaczach, przełączając fokus, a okno edytora IME przenosi się na ekrany dodatkowe.

Implementacja w WindowManager śledzi okno metody wprowadzania (okno IME, w którym rysowana jest klawiatura programowalna) i cel metody wprowadzania (okno, do którego trafiają dane wejściowe IME) w celu zarządzania stanem IME.

W przypadku usługi InputMethodManagerService (IMMS) żaden inny wbudowany mechanizm nie może propagować zmiany wyświetlania do InputMethodService (IMS) ani rekonfigurować układu klawiatury w czasie wykonywania podczas przenoszenia fokusu na inny wyświetlacz.

Aby uzyskać możliwość przełączania okna IME między wyświetlaczami, w systemie Android 10 zastosowano następujące rozwiązania:

  • IME i okno docelowe wejściowe są teraz śledzone na każdym wyświetlaczu w DisplayContent#mInputMethodWindow i DisplayContent#mInputMethodTarget , dzięki czemu WindowManager (WM) może zarządzać stanem skupienia IME niezależnie od każdego wyświetlacza.
  • Po stronie IMMS, gdy żądanie skupienia klienta aplikacji z wyświetlacza zewnętrznego zostanie odebrane za pośrednictwem ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus , najpierw rozłącza bieżącą usługę metody wprowadzania, a następnie ponownie wiąże usługę, aby ponownie podłączyć nowy edytor IME token okna dla wyświetlacza zewnętrznego w onServiceConnected() .
  • Po stronie IMS po odebraniu IMS#attachToken następuje następujący przepływ:
    • ContextImpl#updateDisplay jest wywoływany w celu aktualizacji wyświetlania kontekstu usługi w InputMethodService#attachToken() . Wywołuje to funkcję ViewGroup#addView() w celu zmiany układu klawiatury i dostosowania jej do docelowego wyświetlacza, sprawdzając bieżący kontekst.
    • Po wywołaniu metody DisplayContent#setInputMethodWindowLocked() implementacja wysyła zmiany w konfiguracji wyświetlania na poziomie procesu za pomocą WindowProcessController do procesu IME w celu zastąpienia zasobów i metryk wyświetlania.
    • Klient InputMethodService uzyskuje poprawną konfigurację z poprawnymi metrykami wyświetlania po onConfigurationChanged() i ViewGroup#addView() w celu ponownego zainicjowania widoku wejściowego.