Poniżej znajdziesz informacje o zmianach wprowadzonych w tych obszarach związanych z reklamami displayowymi:
- Aplikacje działające na wyświetlaczu innym niż domyślny
- Obsługa edytora metod wprowadzania w wielu sesjach
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:
- Nowe połączenie wejściowe pochodzi z pola wejściowego na wyświetlaczu B.
InputMethodManagerService
sprawdza, czy połączenie powinno zostać zatwierdzone.- 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.
- 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#mInputMethodWindow
iDisplayContent#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 wonServiceConnected()
. - Po stronie IMS po otrzymaniu
IMS#attachToken
następuje ten proces:ContextImpl#updateDisplay
jest wywoływana w celu zaktualizowania wyświetlania kontekstu usługi wInputMethodService#attachToken()
. W tym celuViewGroup#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ą funkcjiWindowProcessController
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 funkcjionConfigurationChanged()
iViewGroup#addView()
w celu ponownej inicjalizacji widoku wejściowego.