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:
- Nowe połączenie wejściowe pochodzi z pola wejściowego na wyświetlaczu B.
-
InputMethodManagerService
sprawdza, czy połączenie powinno zostać zatwierdzone. - 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.
- 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
iDisplayContent#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 wonServiceConnected()
. - 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 wInputMethodService#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 poonConfigurationChanged()
iViewGroup#addView()
w celu ponownego zainicjowania widoku wejściowego.
-