niedziela, 10 listopada 2013

Android: Runda druga[Broadcast Receivers]

Broadcast Receivers to element który umożliwia nam nadawanie wiadomości wewnątrz naszej aplikacji bądź poza nią - np: system może powiadomić nas o nadchodzącej rozmowie czy też rozładowanej baterii.
Żeby poprawnie stworzyć nasz Broadcast Receivers(łatwiej będzie po prostu receiver), musimy wykonać dwie czynności:
  •  Rozszerzyć przez naszego receiver'a klasę BroadcastReceiver która implementuje metodę onReceive(). 
  • Zarejestrować receiver'a, możemy to zrobić na dwa sposoby:
    • W kodzie - tak zarejestrowany  BroadcastReceiverer będzie nasłuchiwał tylko wtedy, gdy komponent w którym jest zarejestrowany działa. Dobrą praktyką jest rejestrowanie go w metodzie onResume(). Taki sposób jest przydatny kiedy receiver używany jest do aktualizacji komponentów UI(User interface).
    • W pliku Manifest naszej aplikacji, w tym przypadku, w przeciwieństwie do rejestracji w kodzie, nasza aplikacja będzie nasłuchiwać ciągle(np: kiedy przyjdzie sms'a, nasza aplikacja może się odpalić sama, i zapisać tego sms do bazy danych).

Przykład osadzenia rejestracji w kodzie: Osadzenie w manifeście: Mając już jakieś podstawy, spróbujmy stworzyć jakąś prostą aplikacje, aplikacje która będzie nasłuchiwać nadejścia wiadomości SMS, w przypadku nadejścia takiej wiadomości stworzymy sobie powiadomienie(Toast).
Najpierw tworzymy klasę rozszerzającą BroadcastReceiver oraz implementującą metodę onReceive(): Dane które otrzymuje nasz receiver dostarczane są w Intencie(wrzucamy je sobie potem do obiektu typu Bundle). Dalej, co to PDU ? "protocol data unit" - format dla ... teraz nie ważne, ważne że możemy sobie teraz stworzyć wiadomość sms(na której dalej będziemy pracować) z surowego obiektu PDU.
Na właśnie stworzonym obiekcie klasy SmsMessage możemy wywołać metody: getOriginatingAddress() oraz getMessageBody(), co robią - jedna jest odpowiedzialna za numer nadawcy(000-000-000) a druga to po prostu treść wiadomości.
Toast to małe okno typu popup, wypełnia tylko tyle miejsca ile musi, po pewnym czasie gaśnie. Tutaj mamy manifest, dodajemy do niego filtr dla naszego receiver'a(w tym przypadku nazwą jest BroadCast - czyli nazwa klasy). Dodałem także uses-permission - to deklaracja pozwolenia do odczytywania wiadomości SMS.

Dodatkowo, jeżeli chcieli byśmy odpalić nasz Broadcast Receivers z kodu(przyjmując że robi coś innego niż odbiera sms'a), możemy stworzyć sobie button'a, np: nazwa metody odpowiedzialnej za akcje to broadcastIntent, text który wypełnia button powinien być zapisany jako zasób(resource) np: @string/broadcast_intent. Tu mamy metodę która zostaje wywołana po wciśnięciu buttona - żądanie wysyłamy po przez metodę sendBroadcast(); jako parametr przekazujemy wcześniej stworzoną intencję. Do intencji możemy wsadzić jakieś dane przy pomocy metody putExtra("name", "value"); - w przypadku bardziej skomplikowanych klas, musimy zaimplementować interface serializable.

Jeżeli ktoś szuka czegoś więcej, może czegoś lepszego, to może znaleźć dobry tutorial tu:android4devs

sobota, 9 listopada 2013

Android: Runda pierwsza[Screen orientation]

Ostatnio na tapecie mam Androida, przy braku czasu(co spowodowane jest maturą) to fajna alternatywa do "zabawy"(oczywiście w żadnym wypadku nie umniejszając tej technologi) - tak więc, kilka następnych wpisów będzie właśnie ów platformie poświęcone.

Jeżeli ktoś szuka fajnego wprowadzenia(po polsku), to znajdzie je tutaj(javastart)

A teraz do rzeczy, w tym poście zajmiemy się orientacją, urządzenia z Androidem przyjmują dwie pozycje:
Landscape:

Portrait:


Taką właściwość w telefonie - przepraszam - w smartphonie osiągamy oczywiście przechylając go, natomiast w emulatorze Eclipsa(ADT Plugin) używamy kombinacji ctrl+f11.

Do obsłużenia obu przypadków, potrzebujemy dwóch wersji naszego layoutu, Android jest na tyle inteligenty(w końcu jądro linuxa ;D ) że wystarczy stworzyć dodatkowy folder o nazwie "layout-land" który odpowiada za orientację "landscape" - System sam wybierze który layout jest potrzebny.

Teoretycznie na tym można zakończyć, ale razem z tematem orientacji wiążę się pytanie, jak obsłużyć sobie taką zmianę w kodzie ?
A no nie jest to nic trudnego, wywołujemy metodę getConfiguration() która należy do klasy Resources - aktualny zasób możemy natomiast zdobyć przy pomocy metody getResources(), czyli np: Przykład jak można zastosować takie sprawdzenie: