Katedra Inżynierii Wiedzy Wykład 2
Tematyka zajęć Wprowadzenie do aplikacji mobilnych i platformy Android; Program a wersje systemu Android; Środowisko Android Studio; Wygląd aplikacji i podstawy GUI; Wysyłanie wiadomości SMS; Użycie aparatu fotograficznego; Odtwarzanie dźwięku; Odbiór sygnału GPS.
Gradle Narzędzie do budowy projektów; alternatywa dla Ant a i Maven a w Android Studio; w przypadku Android mamy pewną domyślną strukturę projektu; Rysunek: Gradle
Rysunek: Plik aktywności
Nowe Aktywności nie mamy żadnej funkcji main umożliwiającej start całej aplikacji; każda nowa aktywność ma metodę oncreate(...); nowa aktywność tworzona jest w domyślnej paczce, w której mamy pozostałe elementy kodu (na początku tylko MainActivity); każda nowa aktywność wpisywana jest do pliku manifestu; Rysunek: Plik manifestu
Rysunek: Przypisujemy akcję do naciśnięcia pola tekstowego
Rysunek: Wywołujemy nową intencję
Typy intencji Intencja bezwarunkowa (Implicit) - nie ma znaczenia, który komponent obsługuje intencję - np. aplikacja, która umożliwia zrobienie zdjęcia. Nie jest istotne, która to będzie aplikacja, o ile jest w stanie zrobić zdjęcie. Intencja warunkowa (Explicit) - dokładnie wskazujemy, który komponent obsłuży tę intencję. Typy intencji - przykład Intencja bezwarunkowa (Explicit) - aplikacja zbudowana na podstawie kilku intencji - wywołanie różnych okien aplikacji, ale mamy zdefiniowane, który przycisk wywołuje konkretną intencję. Intencja warunkowa (Implicit) - aplikacja, w której możliwe jest wysłanie e-maila, po naciśnięciu przycisku - nie ma znaczenia, jaka aplikacja do wysyłania maili obsłuży te intencję. Itencja typu Implicit (przykład 2) - uruchomienie strony internetowej po naciśnięciu przycisku - dowolna przeglądarka internetowa.
Jeszcze intencje Implicit - wymagana jest akcja oraz data URI (Uniform Resource Identifier). Opcjonalnie (kategoria, komponenty); Explicit - Kontekst i komponent (przeważnie klasa/ aktywność). Kontekst (Context) jest bazową klasą dla klas Activity, Service, Application - czyli ogólnie globalna informacja umożliwiająca dostęp do zasobów, wywoływania intencji. Zatem nasza przykładowa intencja była typu Explicit.
Event Listener akcja - kliknięcie, długie kliknięcie, przeciągnięcie po ekranie; nasłuchiwanie zdarzenia; właściwość onclick danego elementu powiązana z konkretną metodą; metoda umożliwiająca wykonanie określonej czynności (wyświetlenie tekstu, zmiana koloru tła, wypisanie tekstu na ekran, uruchomienie nowej aktywności); Metody Callback onclick(); onlongclick(); onfocuschange();
Klasa wszystkie metody są zaimplementowane. Interfejs wszystkie metody są abstrakcyjne. Klasa abstrakcyjna niektóre metody są zaimplementowane; niektóre metody są abstrakcyjne.
Interfejsy tworzony przy pomocy słowa kluczowego interface; dokładny opis czynności(metod), które dana klasa powinna robić; brak opisu, w jaki sposób ma zostać zrealizowane dane zadanie; np. metoda Sortuj(int[] tablica) - wymusza na nas zaimplementowanie metody sortowania dla tablicy typów int. Nie ma jednak informacji na temat tego, czy ma to być quicksort, czy też sortowanie bąbelkowe; klasa implementująca dany interfejs może posiadać dodatkowe metody charakterystyczne tylko dla niej; adnotacja @Override - a więc wskazanie w klasie implementującej metodę danego interfejsu, iż nadpisujemy tę metodę; interfejs może być używany jako ogólniejszy typ - nadklasa dla innych klas, np. interfejs Pojazd, a dalej: Rower jest implementacją interfejsu Pojazd.
Klasy abstrakcyjne mogą zawierać metody abstrakcyjne; mogą zawierać zwykłe metody posiadające określone funkcjonalności; mogą zawieać stałe; metod abstrakcyjnych nie można oznaczyć jako statycznych; nie można stworzyć konkretnej instancji klasy abstrakcyjnej;
Metody wirtualne w Javie wszystkie metody są wirtualne; w # użycie słowa kluczowego virtual - określenie metody jako wirtualnej. Rysunek: Metody wirtualne
onclick oraz onclicklistener onclicklister - interfejs z abstrakcyjną metodą onclick; możemy napisać klasę, która implementuje metodę interfejsu onclicklistener ustawienie nazwy metody w polu onclick (properties) umożliwia wywołanie metody tylko i wyłącznie z bieżącej aktywności; w przypadku podejścia z onclicklistener mamy możliwość kontroli zachowania przycisku spoza danej aktywności.
Rysunek: Klasa onclicklistener i przypisanie słuchacza do elementu interfejsu
Wracamy do Javy - kolekcje lista (java.util.list) - każdy element ma przyporządkowany numer kolejny(indeks). Możliwość dodawania nowych elementów oraz pobierania wartości elementu na danej pozycji; kolejka(java.util.queue) - lista umożliwiająca obsługę mechanizmu FIFO oraz LIFO; mapa (java.util.map) - przechowuje mapowania klucz-wartość, przy czym klucz jest unikalny.
Rysunek: Hierarchia Collections. Źródło: wazniak.mimuw.edu.pl
Nieco dokładniej - listy ArrayList - stosowana kiedy kluczowy jest czas dostępu do danych, ale liczba dodawanych elementów jest niewielka; LinkedList - wersja z powiązanymi elementami - stosowana, kiedy liczba operacji takich jak usuwanie, czy dodawanie będzie duża; ArrayList oraz LinkedList są implementacjami interfejsu List; kiedy używamy Array a kiedy Linked? - jeżeli nie jesteśmy pewni, to raczej mamy użyć ArrayList; w przypadku listy typu Linked pobranie elementu ma złożoność równą O(1).
Nieco dokładniej - kolejka kolejka LIFO - Last In First Out; kolejka FIFO - First In First Out; kolejka priorytetowa - kolejka z ustaloną strukturą relacji pomiędzy elementami; kolejki udostępniają mechanizm dodawania oraz pobierania elementu z głowy (języki funkcyjne np. Haskell i podział listy na głowę oraz ogon);
Nieco dokładniej - mapa mapa formalnie jest kolekcją; przechowują pary elementów klucz-wartość; wartości moga się powtarzać, natomiast obiekty-klucze muszą być unikalne w obrębie całej mapy; TreeMap - przechowuje elementy, które są posortowane według klucza; HashMap - funkcja HashCode, czyli zwrócenie liczby całkowitej dla obiektu swojego typu.
Wybrane operacje na kolekcjach boolean Add(Object o); boolean Remove(Object o); boolean Contains(Object o); boolean removeall(collection coll); int Size().
Rysunek: Klasa Object i zastosowanie
Wracając do Android - pamięć Wyświetlenie kilku elementów widocznych dla użytkownika na bieżącym ekranie zamiast tworzenia wszystkich obiektów (np. Scroll w kontaktach); Rysunek: Wykorzystanie pamięci
kontrolka - ImageView dodanie ImageView do dowolnego pojemnika w Activity; dodanie wybranego zasobu (rysunku) do resources; ustalenie w properties właściwości src; możliwość wykorzystania np @mipmap/iclauncher; Rysunek: Przykład ImageView
Rysunek: Zastosowanie margin w kodzie
Rysunek: Zastosowanie margin w kodzie
Rysunek: Rodzaje animacji na przykładzie przycisków
Animacje opis animacji przy pomocy pliku XML; ustalenie stanu początkowego i końcowego dla animacji; załadowanie pliku XML przy pomocy kodu Java. Animacje - przykłady Fade - poziom przezroczystości ustalony przy pomocy parametru Alpha, gdzie 1.0 to normalna widoczność obiektu, a 0.0 to obiekt całkowicie niewidoczny; Movement - poruszanie sie elementu ustalone przy pomocy fromxdelta oraz toxdelta; Scalling i stretching - skalowanie i rozciąganie elementu przy pomocy fromxscale oraz toxscale, gdzie 0.1 określa pomniejszenie obiektu docelowego w stosunku do obiektu bazowego o 10 razy, a 10.0 oznacza powiększenie obiektu docelowego w stosunku do obiektu bazowego.
Animacje - przykłady cd. duration - czas trwania animacji w milisekundach ustalony przy pomocy opcji startoffset i duration; obracanie animacji - rotation - wartość ustalana na podstawie okręgu: fromdegrees (w stopniach), todegrees; Repeat - powtarzanie animacji - licznik powtórzeń.
Rysunek: Katalog animacji
Definicja (wrócimy do tego) Refaktoryzacja, zwana także refaktoringiem (ang. Refactoring) jest to proces wprowadzania zmian do systemu w taki sposób, aby jednocześnie zachować jego oryginalną funkcjonalność. Rysunek: Refaktoryzacja
Rysunek: Tworzymy pliki animacji
Rysunek: Tworzymy pliki animacji
Rysunek: Tworzymy pliki animacji
Rysunek: Tworzymy pliki animacji
Rysunek: Modyfikacja pliku aktywności
Rysunek: Modyfikacja pliku aktywności
Rysunek: Modyfikacja pliku aktywności
Rysunek: Modyfikacja pliku aktywności
Rysunek: Modyfikacja pliku aktywności
Rysunek: Modyfikacja pliku aktywności
Dziękuję za uwagę