Obsługa edytora metody wprowadzania

Poniżej przedstawiamy zmiany wprowadzone w tych obszarach dotyczących reklam displayowych:

Android 10 obsługuje klawiaturę programową w aplikacjach działających na ekranie innym niż domyślny.

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

Jeśli chodzi o to, który wyświetlacz pokazuje klawiaturę oprogramowania w edytorze metody wprowadzania (IME), dostępne są różne tryby. Klawiatura programowa jest wyświetlana na:

  • Ten sam ekran, na którym pojawia się aplikacja, na której się skupiasz.
  • Domyślny, gdy zaznaczona aplikacja działa na wyświetlaczu innym niż domyślny.
  • Brak wyświetlania.

System określa odpowiedni tryb na podstawie ustawień wyświetlacza, na którym ma się wyświetlać dana aplikacja. Więcej informacji znajdziesz w tych artykułach:

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

Rysunek 1. klawiaturę IME, tak jak jest widoczna na wyświetlaczu dodatkowym, w tym aplikację docelową.

System używa jednego IME, ale może przełączać się między wyświetlaczami, aby śledzić punkt zainteresowania użytkownika. Android 10 automatycznie oczekuje, że wszystkie własne i zewnętrzne edytory IME poprawią układ i zmienią rozmiar strony zgodnie z nowym rozmiarem wyświetlacza po utworzeniu.

Jeśli na wyświetlaczu A jest aktywne połączenie, a pole wprowadzania prosi o skupienie się na wyświetlaczu B, następuje taka sekwencja:

  1. Nowe połączenie z polem wejściowym na wyświetlaczu B.
  2. InputMethodManagerService sprawdza, czy połączenie powinno zostać zatwierdzone.
  3. Wybrano wyświetlanie dla IME. Jeśli wyświetlacz B obsługuje wyświetlanie IME i może to robić, jest używany wyświetlacz B. W przeciwnym razie będzie wybrany 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 zniszczony, a następnie utworzony ponownie.

Ograniczenie związane z bezpieczeństwem

System nie wyświetla IME na wyświetlaczach wirtualnych, które nie należą do systemu. Wynika to z zagrożenia dla bezpieczeństwa polegającego na tym, że szkodliwa aplikacja może utworzyć wirtualny wyświetlacz z włączoną obsługą dekoracji systemowych i odczytywać z powierzchni danych poufne informacje, takie jak podpowiedzi podczas wpisywania i niestandardowe tła.

Implementacja

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

Implementacja w WindowManager śledzi okno metody wprowadzania (okno IME, w którym wyświetla się klawiatura ekranowa) i docelnik metody wprowadzania (okno, do którego trafia dane wejściowe IME), aby zarządzać stanem IME.

W przypadku InputMethodManagerService (IMMS) żaden inny wbudowany mechanizm nie może zastosować zmiany sposobu wyświetlania na InputMethodService (IMS) ani ponownie skonfigurować układu klawiatury w czasie działania podczas przenoszenia fokusu na inny wyświetlacz.

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

  • Okno docelowe IME i okno docelowe wprowadzania danych są teraz śledzone na każdym wyświetlaczu w DisplayContent#mInputMethodWindowDisplayContent#mInputMethodTarget, aby menedżer okien (WM) mógł zarządzać stanem fokusu IME niezależnie od każdego wyświetlacza.
  • Po stronie IMMS, gdy przez ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus zostanie odebrana prośba o skupienie się klienta aplikacji z zewnętrznego wyświetlacza, najpierw odłącza bieżącą usługę metody wprowadzania danych, a następnie ponownie łączy usługę, aby ponownie dołączyć nowy token okna IME dla zewnętrznego wyświetlacza w onServiceConnected().
  • Po otrzymaniu IMS#attachToken po stronie IMS następuje ten proces:
    • Funkcja ContextImpl#updateDisplay jest wywoływana, aby zaktualizować wyświetlanie kontekstu usługi w komponencie InputMethodService#attachToken(). Wywołuje to funkcję ViewGroup#addView(), aby zmienić układ klawiatury i dostosować 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 dane wyświetlania.
    • Po wywołaniu funkcji onConfigurationChanged()ViewGroup#addView() klient InputMethodService otrzymuje prawidłową konfigurację z prawidłowymi danymi wyświetlania.