Doze, Now on tap, FingerprintManager – 6.0 Marshmallow dla programistów

Bartosz Żmija

13-11-2015
Doze, Now on tap, FingerprintManager – 6.0 Marshmallow dla programistów

5. października Google oficjalnie wydało wersję systemu Android oznaczoną numerem 6.0, znaną szerzej pod nazwą kodową Marshmallow. W porównaniu do Androida Lollipop, który wprowadził dość rewolucyjne i widoczne na pierwszy rzut oka zmiany w designie, można odnieść mylne wrażenie, że Android M nie ma do zaoferowania zbyt wiele. To mylące – pomimo tego, że w najnowszej wersji systemu nie uświadczymy graficznych wodotrysków – jednak wprowadza ona sporo usprawnień i nowości w kwestii wydajności oraz UX.

Jedną z najważniejszych funkcjonalności wprowadzonych w Androidzie M jest tzw. tryb Doze, który w teorii ma znacząco wydłużyć pracę urządzenia na baterii. Doze opiera się na założeniu, że jeśli urządzenie odpowiednio długo pozostaje w stanie bezczynności z wyłączonym ekranem, to prawdopodobnie nie potrzebuje wykorzystywać zasobów poza absolutne minimum. Po wejściu w stan takiego „uśpienia” aplikacje nie mają dostępu do sieci i nie mogą uzyskiwać wake locka, a wszystkie zaplanowane w AlarmManagerze/JobSchedulerze zdarzenia oraz cała synchronizacja z SyncAdapterów zostają wstrzymane aż do najbliższego „maintenance window” – krótkiego okresu aktywności, po którym urządzenie wraca do trybu Doze.

Takie zachowanie urządzenia generuje spore problemy w aplikacjach, które swoje działanie uzależniają od alarmów i długofalowego, na przykład działającego na socketach, połączenia z internetem. W pierwszym wypadku możliwe jest „obejście” trybu Doze poprzez ustawienie alarmu metodą setAndAllowWhileIdle()/setExactAndAllowWhileIdle(), która w założeniu wywoła go niezależnie od stanu urządzenia. Niestety, w przypadku połączenia z siecią działającego w tle, sytuacja trochę się komplikuje. Oficjalnym zaleceniem Google w takim wypadku jest wykorzystanie GCM, które utrzymuje jedno połączenie dla wszystkich aplikacji i pozwala na dostarczanie wiadomości priorytetowych, które omijają tryb Doze. Jeśli jednak takie rozwiązanie z jakiegoś powodu nie jest możliwe, to jedynym wyjściem na zachowanie danej funkcjonalności zostaje nakłonienie użytkownika, aby ręcznie dodał aplikację do whitelisty, dzięki czemu ograniczenia związane z Doze zostają częściowo zniesione.

Oprócz poważnych zmian w zarządzaniu baterią, Android M wprowadza również kilka nowych funkcjonalności poprawiających UX. Do najważniejszych zaliczyć można na pewno Now on tap, czyli wirtualnego asystenta biorącego pod uwagę kontekst tego, co dzieje się na ekranie. Dla przykładu, jeśli w otrzymanej wiadomości tekstowej padnie nazwa ulicy, po wywołaniu przez przytrzymanie przycisku home, Now on tap z dużym prawdopodobieństwem wyświetli informacje o jej lokalizacji i danych dojazdowych. Now on tap umożliwia również dodanie własnych informacji do menu kontekstowego poprzez zaimplementowanie interfejsu Application.OnProvideAssistDataListener we własnej podklasie Application. Chociaż wizja inteligentnego asystenta prezentuje się bardzo ciekawie, to dużo czasu upłynie, zanim taka funkcja będzie dostępna w Polsce. Głównie z uwagi na ciężki język oraz mniejszą ilość zaindeksowanych treści.

Z uwagi na rosnącą popularność czytników odcisków palców, Android M wprowadza również nowe API pozwalające na wykorzystywanie takiego mechanizmu uwierzytelniania we własnych aplikacjach. Aby z niego skorzystać, należy zaimplementować własne flow z wykorzystaniem FingerprintManagera, który udostępnia metodę authenticate. Po jej wywołaniu, czytnik odcisków palców zaczyna skanowanie, a otrzymane w ten sposób dane wraz z informacją, czy odcisk został rozpoznany, przekazywane są do podanego w argumencie callbacku. Przed użyciem, FingerprintManager wymaga dodania do aplikacji pozwolenia „android.permission.USE_FINGERPRINT”.

Przy okazji, sam system “permissionów” również uległ w Androidzie M fundamentalnym zmianom – użytkownik nie akceptuje już wszystkich dodatkowych funkcjonalności używanych przez aplikacje podczas instalacji, ale wtedy, kiedy aplikacja sama o nie poprosi w trakcie działania. Służą do tego nowe metody checkSelfPermissions, która sprawdza, czy aplikacja posiada dane pozwolenie, oraz requestPermissions, która wyświetla dialog w sytuacji, gdy tego pozwolenia jeszcze nie ma. Przy powrocie z dialogu wywoływany jest callback onRequestPermissionsResult z informacją, czy dany permission został przydzielony.

Poza funkcjami widocznymi dla użytkownika, najnowszy Android wprowadza także nową bibliotekę o nazwie Data Binding, pozwalającą na łatwiejszą implementację wzorca Model – View – ViewModel. Dla przykładu, umieszczenie w pliku xml z layoutem:

<data>
<variable name=”user” type=”com.example.User”/>
</data>

Pozwala na korzystanie z klasy User, która jest zwyczajnym POJO, w sposób:

<TextView android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”@{user.firstName}”/>

Następnie, po wywołaniu DataBindingUtils.setContentView (lub inflate) otrzymujemy obiekt <nazwa_layoutu_w_pascal_case>Binding, który pozwala na przypisanie obiektu klasy User, dzięki czemu jego pole firstName zostanie odzwierciedlone w atrybucie text w zadeklarowanym wcześniej TextView. Biblioteka pozwala również na bindowanie eventów, bindowanie z mechanizmem observable i inne – dokładniejszy opis można znaleźć na stronie deweloperów Andoroida.

Podsumowując, mimo że Android M raczej nie zostanie zapamiętany jako wersja rewolucyjna, to wprowadza całkiem sporo zmian w funkcjonowaniu samego systemu i choć na razie ciężko określić ich przydatność, to warto mieć je na uwadze podczas projektowania kolejnej aplikacji.

Więcej na temat Android 6.0 Marshmallow tutaj.

Autor

Bartosz Żmija, Andoid/iOS Developer w Ready4S – mobile apps for business

Komentarze:

Comments

comments