Programowanie Urządzeń Mobilnych Laboratorium nr 9,10 Android Temat 2 działanie złożonych aplikacji zawierających więcej niż jedno Activity Krzysztof Bruniecki 1
Wstęp Podczas laboratorium poruszona zostanie tematyka działania aplikacji zawierających więcej niż jedno Activity. Omówione zostaną przypadki użycia licznych Activity we własnym pakiecie, jak również uruchamianie Activity dostępnych w systemie. Tworzenie nowego Activity Poza utworzeniem w bieżącym pakiecie nowej publicznej klasy przeciążającej klasę Activity należy uzupełnid plik AndroidManifest.xml dodając informację że aplikacja zawiera nowe Activity. <activity android:name="noweactivity" android:label="opcjonalna nazwa"> </activity> Po utworzeniu nowej klasy należy dodad nie zaimplementowane metody, które uruchamiane SA podczas cyklu życia Activity. W tym celu jak na rysunku poniżej wybrad Source->Override/Implement Methods. Przykładowo można zaimplementowad metodę oncreate jak na rysunku poniżej. 2
W szczególności w metodzie oncreate można utworzyd nowy layout zaprojektowany w osobnym pliku XML. @Override protected void oncreate(bundle savedinstancestate) { // TODO Auto-generated method stub super.oncreate(savedinstancestate); } setcontentview(r.layout.lay1); Wywoływanie Activity przy użyciu klasy Intent Abstrakcyjny opis akcji do wykonania. Wysyłany z jednego miejsca do innego. Przykładowo używany startując Activity. Może byd również przekazywany przez mechanizm Broadcastowy (sendbroadcast BroadcastReciever). Również do komunikacji z serwisami pracującymi w tle. Zawiera dwa podstawowe elementy niosące informację: action typ akcji o charakterze głównym, np.: ACTION_VIEW, ACTION_MAIN, ACTION_DIAL data dodatkowy opis akcji, np.: adres elementu mającego byd przedmiotem akcji (np.: w postaci Uri) Uruchamianie Activity zawartego explicite we własnym pakiecie Jeżeli wybrana klasa implementująca Activity jest widoczna w obrębie naszej aplikacji można uruchomid ją korzystając z mechanizmu nazwanego Intentu Intent addpoaact = new Intent(this,AddPoaActivity.class); 3
startactivity(addpoaact); Nowe Activity będzie uruchamiad się zgodnie z cyklem życia: Activity które uruchomiło nowe Activity zostanie wznowione po zakooczeniu nowego Activity. np.: na skutek zamknięcia metodą finish();, lub wciśnięciem przycisku back. Ponieważ poprzednie Activity zostało jedynie przysłonięte przez nowe nie ma potrzeby wznawiania go przy użyciu metody startactivity. Obsługa przycisku back Przycisk back może zostad przeciążony w obrębie Activity przeciążając odpowiednią metodę: @Override public void onbackpressed() { } Toast.makeText(this, "Napis", Toast.LENGTH_SHORT).show(); //super.onbackpressed(); nie propaguj przycisku back Wywoływanie systemowych Activity Aby wywoład systemową aplikację do robienia zdjęd należy skorzystad z akcji MediaStore.ACTION_IMAGE_CAPTURE Chcąc, aby systemowa aplikacja zapisała dodatkowo plik w określonej lokalizacji należy dostarczyd parametr dodatkowy MediaStore.EXTRA_OUTPUT: 4
Intent imagecaptureintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); imagecaptureintent.putextra(mediastore.extra_output, Uri.fromFile(photoFile)); Karta SD Aby sprawdzid gdzie zamontowana jest karta SD w urządzeniu można skorzystad z File Explorera w zakładce DDMS Eclipsa. Uprawnienia aplikacji Aby zapisywad pliki na zewnętrznym nośniku danych (np.: karta SD) we własnej aplikacji konieczne jest ustawienie w AndroidManifest.xml odpowiedniego Uses Permission: przy użyciu graficznego edytora w Eclipsie: Lub bezpośrednio w XML w węźle <manifest> podwęzła: <uses-permission android:name="android.permission.write_external_storage"></uses-permission> Podłączanie zdarzeń do przycisków na etapie projektowania Alternatywnie do podłączania listenera do zdarzenia w kodzie Javy wciśnięcia przycisku można obsłużyd na etapie projektowania XML. W tym celu w pliku z opisem wyglądu okna można wprowadzid parametr opisu przycisku 5
android:onclick. <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="button" android:onclick="onbtnclick" android:id="@+id/button1"> </Button> Wówczas w klasie która instancja lizuje dany przycisk należy zaimplementowad odpowiednią funkcję: public void onbtnclick(view btn) { Toast.makeText(this, "Wcisnieto przycisk", Toast.LENGTH_SHORT).show(); } Wyświetlanie obrazów Aby wyświetlid w oknie obraz z pliku można posłużyd się kontrolka klasy ImageView i metodą setimagebitmap: iv.setimagebitmap(bitmapa); Aby utworzyd bitmapę z pliku należy posłużyd się metodą statyczną klasy BitmapFactory: Bitmap bmp = BitmapFactory.decodeFile("ścieżka"); Zadania na zajęcia 1 Zadanie 1. Zbudowad aplikację z dwiema klasami Activity o różnych layoutach zawierających przyciski i umożliwiającą przełączanie się pomiędzy nimi przy użyciu Intenta. Jak również zademonstrowad przekazywanie informacji pomiędzy różnymi Activity. Zadanie 2. Nadpisad przycisk back aby na skutek jego naciśnięcia nie zamykad aktywnego Activity, zamiast tego wyświetlid komunikat debugowy korzystając z mechanizmu Toast. Zadania na zajęcia 2 Zadanie 1. Umożliwid własnej aplikacji uruchamianie systemowego Activity umożliwiającego rejestracje zdjęd. Zadanie 2. Przetestowad oba mechanizmy obsługi przycisków (znany z poprzednich zajęd listener oraz projektowanie w XML). Zadanie 3. Wyświetlid zdjęcie wykonane w systemowym Activity do robienia zdjęd we własnym Activity otwierając odpowiedni plik z karty SD. 6