Poniżej przedstawiamy zmiany wprowadzone w tych obszarach dotyczących reklam displayowych:
- Aplikacje działające na ekranie innym niż domyślny
- Obsługa edytora metody wprowadzania danych w wielu sesjach
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:
- Nowe połączenie z polem wejściowym na wyświetlaczu B.
InputMethodManagerService
sprawdza, czy połączenie powinno zostać zatwierdzone.- 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.
- 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#mInputMethodWindow
iDisplayContent#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 wonServiceConnected()
. - 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 komponencieInputMethodService#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ą funkcjiWindowProcessController
do procesu IME, aby zastąpić zasoby i dane wyświetlania. - Po wywołaniu funkcji
onConfigurationChanged()
iViewGroup#addView()
klientInputMethodService
otrzymuje prawidłową konfigurację z prawidłowymi danymi wyświetlania.
- Funkcja