Multi-Window w Androidzie

Wspomniałem już o pływających okienkachpicture in picture. W celu uzupełnienie tematu dziś omówię o Multi-Window w androidzie. Multi-Window (tryb wielu okien) został wprowadzony w Android Nougat (API 24) Polega to na tym, że ekran jest podzielony na pół i na każdej części możemy wyświetlić inna aplikację.
Tryb MULTI-WINDOW w androidzie

1. Wsparcie dla Multi-Window.

Domyślnie system Android pozwala na tą funkcję, natomiast gdybyś chciał wyłączyć tą opcję, w pliku AndroidManifest.xml musisz dodać wpis w sekcji <application>:

android:resizeableActivity="false"

Jeśli atrybut jest ustawione na false i użytkownik aplikacji będzie chciał podzielić ekran na pół dostanie powiadomienie typu Toast – aplikacja nie wspiera podziało ekranu. System Android N wprowadził również ustawienia atrybutów dla wyglądu w trybie wielu okien.

<activity android:name=".MyActivity">
    <layout android:defaultHeight="400dp"
          android:defaultWidth="500dp"
          android:gravity="end"
          android:minHeight="300dp"
          android:minWidth="200dp" />
</activity>
Running

Wartości:

  • android:defaultWidth / android:defaultHeight – domyślna wartość szerokości i wysokości aktywności, która jest uruchomiona w trybie swobodnym (freeform) – dotyczy to głównie tabletów lub TV,
  • android:gravity – początkowe umieszczenie aktywności po uruchomieniu w trybie freeform,
  • android:minHeight, android:minWidth – minimalna wysokość i szerokość dla aktywności w trybach podzielonego ekranu i swobodnym. Uwaga, jeśli użytkownik przesunie linię, która oddziela aplikację w taki sposób aby rozmiar aktywności był mniejszy niż wartość, którą ustawiliśmy to system to wykona to działanie, niezależenie od tego jakie wartości są wpisane 

2. Cykl życia aktywności.

Tryb wielu okien nie wpływa na cykl życia aktywności. Jeżeli dana aktywność była w kontakcie z użytkownikiem to ona jest oznaczona jako aktywna (metoda onResume() jest wykonywana), a inne aktywności są widoczne, ale nieaktywne (metoda onPause()). Czasami nieaktywne aplikacje wymagają dalszego działania, na przykład aktywność wyświetlająca wideo nie powinna wstrzymywać wyświetlanego filmu podczas wykonywania metody onPause(), zamiast tego działanie powinno wstrzymać wideo w onStop() i wznowić odtwarzanie w onStart().

3. Reagowanie na zmianę okna.

Gdy aplikacja wchodzi w tryb wielu okien, system powiadamia o zmianie konfiguracji. System wywołuje metodę onMultiWindowModeChanged() za każdym razem, gdy działanie przechodzi w tryb wielu okien. Ponadto, gdy użytkownik zmieni rozmiar aplikacji na podzielonym ekranie lub włączy ją z powrotem w tryb pełnoekranowy, aktywność zostanie powiadomiona o zmianach. Jeżeli chcesz dowiedzieć się czy aktywność jest w trybie Multi-Window korzystaj z metody isInMultiWindowMode().

4. Uruchomienie kolejnych aplikacji w Multi-Window.

Jeżeli chciałbyś uruchomić inną aplikację/aktywność w trybie wielu okien możesz skorzystać z poniższej metody:

@TargetApi(Build.VERSION_CODES.N)
public void launchNextActivity(View view) {
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://myenv.net"));
    intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT |
                    Intent.FLAG_ACTIVITY_NEW_TASK |
                    Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}

Jeśli urządzenie nie jest w trybie podzielonego ekranu, ta metoda nie ma żadnego efektu. Możesz też określić parametry wielkości nowego okna:

Rect rect = new Rect(200,200,200,200);
ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchBounds(rect);
startActivity(intent, options.toBundle() );

5. Ograniczenia.

  • Niektóre opcje interfejsu są wyłączone, na przykład aplikacje nie mogą ukrywać paska stanu, jeśli nie działają w trybie pełnoekranowym,
  • System ignoruje zmiany w atrybucie android:screenOrientation,
  • Jeśli Twoja aplikacja jest projektowana głownie na API 23 lub niższy (targetAPI), a użytkownik próbuje korzystać z aplikacji w trybie wielu okien (na nowszym systemie), system wymusza zmianę rozmiaru aplikacji, chyba że aplikacja deklaruje stałą orientację.

6. Włączenie trybu freeform.

Tryb swobodny niestety nie jest domyślnie aktywny i niestety ten tryb trzeba ręcznie włączyć. Możesz to zrobić za pomocą adb:

adb shell settings put global enable_freeform_support 1

Po wykonaniu tej komendy musisz uruchomić ponownie urządzenie. Tryb swobodny to nic innego jak pływające okna, w których możesz zmieniać rozmiar itp.
Tryb freeform w androidzie

7. Podsumowanie.

Jako programista jesteś zmuszony do testowania aplikacji w prawie każdej konfiguracji. Nawet w tym trybie o którym dziś przeczytałeś. Musisz zwrócić uwagę przy projektowaniu UI, w jak sposób poszczególne elementy zmieniają się przy zmianie rozmiaru okna. Może będziesz musiał ukryć pewne elementy interfejsu lub zwiększyć wielkość czcionki. Funkcja wielu okien ma pewne zalety, a także pewne wady. Dobrą rzeczą jest to, że użytkownik może wykonywać wiele zadań jednocześnie w wielu aplikacjach, może przeciągać i upuszczać dane z jednej aktywności do drugiej. Ale jeśli uważasz, że twoja aplikacja może nie zachowywać się poprawnie, ponieważ na podzielonym ekranie byłoby mniej obszaru roboczego, możesz wyłączyć tryb Multi-Window, np.: w grach.

Co dalej?

  • Polub stronę MYENV na Facebooku oraz śledź mnie na Twitterze
  • Zachęcam do komentowania i pisania propozycji tematów, o których chcesz przeczytać
  • Poleć ten wpis za pomocą poniższych przycisków. Będę Ci za to bardzo wdzięczny 🙂
  • Życzę Ci miłego dnia i miłego kodowania 🙂