Sensorki – widget – #5

This entry is part [part not set] of 10 in the series Sensorki

Przebijanie się przez kilka ekranów żeby znaleźć aplikacje, a potem jeszcze trzeba uruchomić, no i poczekać aż się załaduje, nie jest fajne, jak chce się na szybko sprawdzić jaka jest temperatura. Jest na to jedna rada – zrobię widget 🙂

Wykorzystałam Android Studio do tego, żeby wykonało za mnie część niezbędnej pracy i tutorial do tworzenia i obsługi widgetów z Udacity (link). Klikam prawym na projekcie -> New -> Widget -> App Widget. Android studio wygenerowało mi 5 plików i zmieniło 3. 

Praktycznie od tego momentu widget jest już gotowy do użycia. Wprawdzie nie wyświetla nic poza nazwą 'EXAMPLE’, ale już można go testować 😉

A co zmieniło się w plikach? Pomińmy dimens.xml i strings.xml i skupmy się na tym co naprawdę ma znaczenie.

AndroidManifest – zarejstrowanie widgetu: 

https://gist.github.com/jezinka/bbbb679b61642dc53834b8d953e0e272
AndroidManifest.xml

sensor_widget_provider_info.xml – domyślne ustawienia dla widgetu takie jak minimalna wysokość i szerokość, domyślny layout i domyślny czas odświeżania widgetu (niestety nie można w ten sposób odświeżać częściej niż raz na 30 minut). Tak wygląda u mnie po modyfikacjach.

https://gist.github.com/jezinka/2cab9a4e5d732f3123b05a4ea483972a
sensor_widget_provider_info.xml

sensor_widget_provider.xml – zawiera layout dla widgetu. Chcę żeby wyświetlała się tam temperatura i godzina odczytu. Do tego chciałabym zachować kolorystykę z aplikacji. Dorzucę też ikonkę odświeżenia żebym mogła w dowolnym momencie pobrać dane. Ostatecznie ląduję z RelativeLayoutem zawierającym kilka textView i klikalny obrazek do odświeżenia temperatury.

https://gist.github.com/jezinka/ff1fef5d3926f6f6a6837f3ba1cb9527
widget layout

Jest jeszcze plik SensorWidgetProvider, który ma w sobie metody, do obsługi widgetu. Tu nie będzie tak prosto, bo do odświeżenia danych tutorial kazał mi użyć serwisu, więc tworzę SensorIntentService. No i teraz trzeba trochę pochodzić w tę i nazad pomiędzy servicem i providerem w celu odświeżenia i ustawienia danych na widgecie. Tak mniej więcej wygląda to w praktyce 😉

Interaction between provider and service

No i teraz można po kolei 😉

OnUpdate jest wywoływany w momencie dodania widgetu do ekranu, a także przy odświeżaniu widgetu. W moim kodzie to przekazanie sterowania do service’u:

https://gist.github.com/jezinka/e5bd5dc3f869f65dc2e4c10fc0d8431f
onUpdate

Uruchamian service’u w tle z akcją 'UPDATE_WIDGET’. 

https://gist.github.com/520923016649f187ff9899eef52febbd
startActionUpdateWidgets

Później w metodzie onHandleIntent odpalam odpowiednią akcję z service’u. U mnie w tym wypadku obie są takie same 😉

https://gist.github.com/jezinka/f58fbcf935dd8b3f2e6b2caa94c63a7d
onHandleIntent

No i najważniejsza akcja: refreshWidget. Metoda, która pobiera dane z serwera i przekazuje z powrotem do providera. Jest prawie, że identyczna z metodą, która wypełnia dane w kafelkach recyclerView. 

https://gist.github.com/jezinka/065ae22e7fa377e5bb85b987836e920c
refreshWidget

Prawie – tutaj przekazujemy dane z powrotem do providera, który trzyma informację o polach tekstowych. Zdecydowałam się na przekazywanie do metody całego obiektu sensora zamiast dwóch pól z niego. Wygląda to lepiej niż przekazywanie dwóch stringów, a w przyszłości może i większej ilości parametrów. 

https://gist.github.com/3147be9fb2e86841f2e5773c9972ccad

Pętla po utworzonych widgetach, żeby wszystkie zostały odświeżone.

A teraz najważniejsza metoda, która jest odpowiedzialna za wszystko co dzieje się w widgecie updateAppWidget. Dzieją się tam 4 rzeczy:

Tworzę remoteView na podstawie layoutu zawierającego wygląd layoutu. Przypisuję do każego z textView wartości z obiektu sensora.

https://gist.github.com/jezinka/f3b9182f04bc328bed36fc8f564611a6

Kolejne linijki odpowiadają za otworzenie aplikacji po kliknięciu na widget.

https://gist.github.com/jezinka/61736f33f7ac2d6902263657177e7165

Podpinam też odpalenie odświeżania z service’u po kliknięciu na obrazek ze strzałką:

https://gist.github.com/jezinka/20af4924e2233332c0ad17f7866ff1ff

I na koniec powiadomienie widget managera, że trzeba odświeżyć widget.

https://gist.github.com/jezinka/afb3a6ff6602bb27ff1707291bb548ea

A tak wygląda efekt końcowy:

emulator
Series Navigation

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.