Połączone wyświetlacze rozszerzają funkcję trybu okien na pulpicie na standardowe telefony, dzięki czemu użytkownicy mogą korzystać z dużych ekranów na urządzeniach mobilnych. Ta funkcja otwiera nowe możliwości interakcji z aplikacjami i zwiększa produktywność użytkowników.
Do podłączonych wyświetlaczy mają zastosowanie wszystkie unikalne funkcje trybu okien na pulpicie. Po podłączeniu telefonu do wyświetlacza stan telefonu pozostaje bez zmian, a na podłączonym wyświetlaczu rozpoczyna się pusta sesja pulpitu. Urządzenie i wyświetlacz działają jako 2 osobne systemy, a aplikacje są specyficzne dla każdego wyświetlacza.
Jeśli podłączysz urządzenie z trybem okien na pulpicie, np. tablet, do monitora zewnętrznego, sesja na pulpicie będzie obejmować oba wyświetlacze. Dwa wyświetlacze działają wtedy jako jeden ciągły system. Taka konfiguracja umożliwia swobodne przenoszenie okien, treści i kursora między dwoma wyświetlaczami.
Skuteczne obsługiwanie połączonych wyświetlaczy wymaga zwrócenia uwagi na kilka aspektów projektu i wdrożenia aplikacji. Poniższe sprawdzone metody zapewniają płynne i wydajne korzystanie z usługi.
Obsługa dynamicznych zmian wyświetlania
Wiele aplikacji jest tworzonych z założeniem, że obiekt Display i jego cechy nie zmienią się w trakcie cyklu życia aplikacji. Gdy jednak użytkownik podłączy lub odłączy monitor zewnętrzny albo przeniesie okno aplikacji między wyświetlaczami, bazowy obiekt Display powiązany z kontekstem lub oknem aplikacji może się zmienić. Właściwości wyświetlacza, takie jak rozmiar, rozdzielczość, częstotliwość odświeżania, obsługa HDR i gęstość pikseli, mogą się różnić. Jeśli na przykład zakodujesz na stałe wartości na podstawie ekranu telefonu, układy prawdopodobnie nie będą działać na wyświetlaczu zewnętrznym.
Wyświetlacze zewnętrzne mogą mieć też bardzo różną gęstość pikseli. Musisz zadbać o to, aby aplikacja prawidłowo reagowała na zmiany gęstości. Obejmuje to używanie pikseli niezależnych od gęstości (dp) w przypadku układów, udostępnianie zasobów dostosowanych do gęstości i zapewnianie odpowiedniego skalowania interfejsu.
Jeśli aktywność jest uruchomiona na wyświetlaczu zewnętrznym, gdy ten wyświetlacz zostanie odłączony, system przeniesie aktywność na wyświetlacz główny. Przeniesienie powoduje zmiany konfiguracji, takie jak zmiana rozmiaru i gęstości ekranu, co może spowodować ponowne utworzenie aktywności. Aplikacja musi obsługiwać zmianę konfiguracji przez zapisywanie i przywracanie stanu interfejsu, aby zapobiec utracie danych lub wprowadzeniu użytkownika w błąd.
Używaj odpowiedniego kontekstu
W środowiskach z wieloma wyświetlaczami kluczowe jest używanie odpowiedniego kontekstu. Podczas uzyskiwania dostępu do zasobów kontekst aktywności (który jest wyświetlany) różni się od kontekstu aplikacji (który nie jest wyświetlany).
Kontekst aktywności zawiera informacje o wyświetlaczu i jest zawsze dostosowywany do obszaru wyświetlania, w którym pojawia się aktywność. Dzięki temu możesz uzyskać prawidłowe informacje o gęstości wyświetlania lub wymiarach okna aplikacji. Aby uzyskać informacje o bieżącym oknie lub wyświetlaczu, zawsze używaj kontekstu aktywności (lub innego kontekstu opartego na interfejsie). Ma to też wpływ na niektóre interfejsy API systemu, które korzystają z informacji z kontekstu.
W Jetpack Compose możesz uzyskać dostęp do informacji dotyczących wyświetlacza za pomocą obiektów CompositionLocal, takich jak LocalConfiguration.current i LocalDensity.current. Gdy aktywność lub okno przenosi się między ekranami, zmienia się konfiguracja urządzenia, co powoduje ponowne komponowanie z użyciem nowych danych ekranu. CompositionLocal obiektów umożliwia płynne dostosowywanie interfejsu.
Pobieranie informacji o wyświetlaczu
Możesz użyć klasy Display, aby uzyskać informacje takie jak rozmiar wyświetlacza, gęstość pikseli czy flagi. Użyj usługi systemowej DisplayManager, aby uzyskać dostępne wyświetlacze. Aby zidentyfikować wyświetlacze zewnętrzne, odfiltruj Display.DEFAULT_DISPLAY, który jest zwykle wbudowanym ekranem telefonu lub tabletu:
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = displayManager.getDisplays()
// The default display is 0. External displays have other IDs.
val externalDisplays = displays.filter { it.displayId != Display.DEFAULT_DISPLAY }
Zarządzanie uruchamianiem i konfigurowaniem aktywności
W przypadku podłączonych wyświetlaczy aplikacje mogą określać, na którym wyświetlaczu ma działać aplikacja po uruchomieniu lub utworzeniu kolejnej aktywności. Zależy to od trybu uruchamiania aktywności zdefiniowanego w pliku manifestu oraz od flag i opcji intencji ustawionych przez podmiot uruchamiający aktywność.
Gdy aktywność zostanie przeniesiona na wyświetlacz dodatkowy, aplikacja może zostać zaktualizowana, a jej okno może zostać zmienione. Mogą też nastąpić zmiany w konfiguracji i zasobach. Jeśli aktywność obsługuje zmianę konfiguracji, jest o niej powiadamiana w metodzie onConfigurationChanged(). W przeciwnym razie aktywność zostanie uruchomiona ponownie.
Jeśli wybrany tryb uruchamiania aktywności umożliwia wiele instancji, uruchomienie na ekranie dodatkowym może utworzyć nową instancję aktywności. Obie aktywności są wznawiane w tym samym czasie, co może być korzystne w niektórych scenariuszach wielozadaniowości.
Możesz uruchomić aktywność na konkretnym wyświetlaczu za pomocą ActivityOptions. Pamiętaj, że launchDisplayId wymaga Androida 8 (API na poziomie 26) lub nowszego.
// Get DisplayManager and find the first external display.
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val externalDisplayId = displayManager.displays
.firstOrNull { it.displayId != Display.DEFAULT_DISPLAY }
?.displayId
// If an external display is found, launch the activity on it.
if (externalDisplayId != null) {
val intent = Intent(this, MySecondaryActivity::class.java)
val options = ActivityOptions.makeBasic()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
options.launchDisplayId = externalDisplayId
}
startActivity(intent, options.toBundle())
} else {
// Optionally, handle the case where no external display is connected.
}
Unikaj list dozwolonych urządzeń
Aplikacje czasami ograniczają interfejs i funkcje na dużym ekranie do wybranych urządzeń za pomocą listy dozwolonych lub sprawdzając BUILD.MODEL i wbudowany rozmiar wyświetlacza. To podejście nie sprawdza się w przypadku podłączonych wyświetlaczy, ponieważ do dużego ekranu można podłączyć praktycznie każde urządzenie, a model urządzenia nie zmienia się po podłączeniu wyświetlacza zewnętrznego.
Zamiast korzystać z list dozwolonych lub sprawdzać BUILD.MODEL i wbudowany rozmiar ekranu, sprawdzaj w czasie działania dane okna lub możliwości urządzenia, aby podejmować decyzje dotyczące interfejsu. Używaj interfejsów API Jetpack WindowManager lub klas rozmiaru okna, aby tworzyć elastyczne układy dostosowujące się do różnych rozmiarów i gęstości ekranu.
Obsługa urządzeń peryferyjnych
Gdy użytkownicy podłączają urządzenie do wyświetlacza zewnętrznego, często tworzą środowisko podobne do komputera. Często wiąże się to z używaniem zewnętrznych klawiatur, myszy, trackpadów, kamer internetowych, mikrofonów i głośników. Musisz zadbać o to, aby aplikacja działała bezproblemowo z tymi urządzeniami peryferyjnymi. Obejmuje to obsługę skrótów klawiszowych, zarządzanie interakcjami wskaźnika myszy, prawidłową obsługę zewnętrznych kamer lub mikrofonów oraz uwzględnianie routingu wyjścia audio. Więcej informacji znajdziesz w artykule Zgodność danych wejściowych na dużych ekranach.
Zwiększanie produktywności użytkowników
Połączone wyświetlacze dają duże możliwości zwiększenia produktywności użytkowników. Masz teraz narzędzia do tworzenia aplikacji mobilnych, które mogą oferować funkcje porównywalne z aplikacjami na komputery. Aby zwiększyć produktywność użytkowników, rozważ wdrożenie tych funkcji:
- Umożliwia użytkownikom otwieranie wielu instancji tej samej aplikacji. Jest to nieocenione w przypadku zadań takich jak porównywanie dokumentów, zarządzanie różnymi rozmowami czy jednoczesne wyświetlanie wielu plików.
- Umożliwiaj użytkownikom udostępnianie w aplikacji i poza nią danych rozszerzonych za pomocą funkcji przeciągnij i upuść.
- Pomóż użytkownikom zachować ciągłość pracy podczas zmian konfiguracji, wdrażając solidny system zarządzania stanem.
Postępując zgodnie z tymi wytycznymi i korzystając z podanych przykładów kodu, możesz tworzyć aplikacje, które bezproblemowo dostosowują się do podłączonych wyświetlaczy, zapewniając użytkownikom bogatsze i bardziej produktywne doświadczenie.