Połączone wyświetlacze rozszerzają tryb okien na pulpicie na standardowe telefony, dając użytkownikom dostęp do dużych ekranów na urządzeniach mobilnych. Ta funkcja otwiera nowe możliwości interakcji z aplikacją i zwiększania produktywności użytkowników.
Wszystkie unikalne funkcje trybu okien na pulpicie mają zastosowanie do podłączonych wyświetlaczy. Gdy podłączysz telefon do wyświetlacza, stan telefonu pozostanie niezmieniony, a na podłączonym wyświetlaczu rozpocznie się pusta sesja pulpitu. Urządzenie i wyświetlacz działają jako 2 osobne systemy z aplikacjami przeznaczonymi na każdy z nich.
Jeśli podłączysz urządzenie z włączonym trybem okien na pulpicie, np. tablet, do zewnętrznego monitora, sesja na pulpicie będzie obejmować oba wyświetlacze. Oba wyświetlacze działają wtedy jako jeden ciągły system. Ta konfiguracja umożliwia swobodne przenoszenie okien, treści i kursora między 2 wyświetlaczami.
Skuteczne obsługiwanie połączonych wyświetlaczy wymaga zwrócenia uwagi na kilka aspektów projektowania i wdrażania aplikacji. Poniższe sprawdzone metody zapewniają użytkownikom płynne i produktywne działanie.
Obsługa dynamicznych zmian wyświetlania
Wiele aplikacji jest tworzonych przy założeniu, że obiekt Display i jego właściwości nie zmienią się w trakcie cyklu życia aplikacji. Jednak gdy użytkownik podłącza lub odłącza zewnętrzny monitor, a nawet przenosi okno aplikacji między wyświetlaczami, powiązany 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ść, 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ą też mieć bardzo różne gęstości pikseli. Musisz upewnić się, że aplikacja prawidłowo reaguje na zmiany gęstości. Obejmuje to używanie pikseli niezależnych od gęstości (dp) w układach, 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 zostanie on odłączony, system przeniesie ją 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 dezorientacji użytkownika.
Użyj właściwego kontekstu
Używanie właściwego kontekstu ma kluczowe znaczenie w środowiskach z wieloma wyświetlaczami. 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 uzyskasz prawidłowe informacje o gęstości wyświetlania lub danych 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 systemowe interfejsy API, które korzystają z informacji z kontekstu.
W Jetpack Compose możesz uzyskać dostęp do informacji o wyświetlaczu za pomocą obiektów CompositionLocal, takich jak LocalConfiguration.current i LocalDensity.current. Gdy aktywność lub okno jest przenoszone między wyświetlaczami, konfiguracja urządzenia się zmienia, co powoduje ponowne tworzenie kompozycji z nowymi danymi wyświetlania. Obiekty CompositionLocal umożliwiają płynne dostosowywanie interfejsu.
Uzyskiwanie informacji o wyświetlaczu
Możesz użyć klasy Display, aby uzyskać informacje takie jak rozmiar wyświetlacza, gęstość czy flagi. Aby uzyskać dostępne wyświetlacze, użyj usługi systemowej DisplayManager. 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 konfiguracją aktywności
W przypadku połączonych wyświetlaczy aplikacje mogą określać, na którym wyświetlaczu mają działać po uruchomieniu lub utworzeniu kolejnej aktywności. To zachowanie zależy 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 dodatkowy wyświetlacz, aplikacja może doświadczyć aktualizacji kontekstu, zmiany rozmiaru okna oraz zmian konfiguracji i zasobów. Jeśli aktywność obsługuje zmianę konfiguracji, jest o tym powiadamiana w onConfigurationChanged(). W przeciwnym razie aktywność zostanie uruchomiona ponownie.
Jeśli wybrany tryb uruchamiania aktywności zezwala na wiele instancji, uruchomienie na ekranie dodatkowym może utworzyć nową instancję aktywności. Obie aktywności są wznawiane jednocześnie, co może być korzystne w niektórych scenariuszach wielozadaniowości.
Możesz uruchomić aktywność na konkretnym wyświetlaczu, używając 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 rozmiar wbudowanego wyświetlacza.
To podejście nie jest skuteczne w przypadku podłączonych wyświetlaczy, ponieważ praktycznie każde urządzenie można podłączyć do dużego ekranu, a model urządzenia nie zmienia się po podłączeniu zewnętrznego wyświetlacza.
Zamiast używać list dozwolonych lub sprawdzać BUILD.MODEL i wbudowany rozmiar wyświetlacza, sprawdzaj dane okna lub możliwości urządzenia w czasie działania, aby podejmować decyzje dotyczące interfejsu. Używaj interfejsów API Jetpack WindowManager lub klas rozmiaru okna, aby tworzyć elastyczne i adaptacyjne układy dla różnych rozmiarów i gęstości ekranu.
Obsługa zewnętrznych urządzeń peryferyjnych
Po podłączeniu do wyświetlacza zewnętrznego użytkownicy często tworzą środowisko bardziej przypominające komputer. 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. Obejmuje to obsługę skrótów klawiszowych, zarządzanie interakcjami ze wskaźnikiem myszy, prawidłową obsługę zewnętrznych kamer i mikrofonów oraz uwzględnianie routingu wyjścia audio. thought Więcej informacji znajdziesz w artykule o zgodności metod wprowadzania 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 komputerowymi. Rozważ wdrożenie tych funkcji, aby zwiększyć produktywność użytkowników:
- Zezwalaj użytkownikom na otwieranie wielu instancji tej samej aplikacji. Jest to bardzo przydatne w przypadku takich zadań jak porównywanie dokumentów, zarządzanie różnymi rozmowami czy wyświetlanie wielu plików jednocześnie.
- Umożliwiaj użytkownikom udostępnianie danych rozszerzonych w aplikacji i poza nią 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 płynnie dostosowują się do podłączonych wyświetlaczy, oferując użytkownikom bogatsze i bardziej produktywne wrażenia.