Einführung in die Android App-Entwicklung Patrick Treyer und Jannis Pinter
Agenda Was ist Android? Android Versionen Layout, Strings und das Android Manifest Activities, Intents und Services Entwicklungsumgebung Übungsaufgaben 2
Was ist Android? Android ist ein von Google entwickeltes Smartphone Betriebssystem mit Linux-Basis Android ist freie Software und steht unter der Apache-Lizenz Marktanteil im Smartphone-Markt: 81% (3/2013) Täglich >1,5 Mio Geräteaktivierungen (April 2013) 3
Was ist Android? 4
Agenda Was ist Android? Android Versionen Layout, Strings und das Android Manifest Activities, Intents und Services Entwicklungsumgebung Übungsaufgaben 5
Android Versionen (die wichtigsten Versionen) Version 1.0 Base (09.2008) Version 1.6 Donut (09.2009) Version 2.1 Eclair (01.2010) Version 2.3 Gingerbread (12.2010) Version 3 Honeycomb (02.2011) Version 4 Ice Cream Sandwich (10.2011) Version 4.1 4.3 Jelly Bean (06.2012) Version 4.4 KitKat (10.2013) 6
Agenda Was ist Android? Android Versionen Layout, Strings und das Android Manifest Activities, Intents und Services Entwicklungsumgebung Übungsaufgaben 7
Layout, Strings und das AndroidManifest Das Layout einer Activity wird mittels XML definiert Verwendete Strings in der App sollten in einer XML definiert werden Bessere Wartbarkeit Einfache Übersetzung Jede App besitzt eine AndroidManifest.xml Enthält Metainformationen (Name, Version, Services, Intents, Activities) Enthält Berechtigungsinformationen 8
Beispiel strings.xml res/values/strings.xml <?xml version= 1.0 encoding= utf-8?> <resources> <string name= app_name >Soundex-Converter</string> <string name= btn_soundex_calculate >Soundex berechnen</string> <string name= tv_soundex_calculate >Name zum Berechnen:</string> <string name= tv_ergebnis_error >FEHLER</string> <string name= title_activity_ergebis >Ergebnis</string> </resources> 9
Beispiel strings.xml res/values/strings.xml <?xml version= 1.0 encoding= utf-8?> <resources> <string name= app_name >Soundex-Converter</string> <string name= btn_soundex_calculate >Soundex berechnen</string> <string name= tv_soundex_calculate >Name zum Berechnen:</string> <string name= tv_ergebnis_error >FEHLER</string> <string name= title_activity_ergebis >Ergebnis</string> </resources> Android wählt strings.xml automatisch anhand Nutzersprache Englische Übersetzung in: res/values-en/strings.xml Französische Übersetzung in: res/values-fr/strings.xml 10
Beispiel eines Layouts <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context=".soundexconverter" > <TextView android:id="@+id/tv_et_soundex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_alignparenttop="true" android:text="name zum berechnen:" /> <EditText android:id="@+id/et_soundex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/tv_et_soundex" android:layout_below="@+id/tv_et_soundex" android:ems="10" > <requestfocus /> </EditText> <Button android:id="@+id/btn_soundex_calculate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/et_soundex" android:layout_below="@+id/et_soundex" android:layout_margintop="40dp" android:text="@string/btn_soundex_calculate" /> </RelativeLayout> 11
Beispiel eines Layouts <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context=".soundexconverter" > <TextView android:id="@+id/tv_et_soundex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_alignparenttop="true" android:text="name zum berechnen:" /> <EditText android:id="@+id/et_soundex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/tv_et_soundex" android:layout_below="@+id/tv_et_soundex" android:ems="10" > <requestfocus /> </EditText> <Button android:id="@+id/btn_soundex_calculate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/et_soundex" android:layout_below="@+id/et_soundex" android:layout_margintop="40dp" android:text="@string/btn_soundex_calculate" /> </RelativeLayout> 12
Beispiel eines Layouts <TextView android:id="@+id/tv_et_soundex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_alignparenttop="true" android:text="name zum berechnen:" /> 13
Beispiel eines Layouts <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context=".soundexconverter" > <TextView android:id="@+id/tv_et_soundex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_alignparenttop="true" android:text="name zum berechnen:" /> <EditText android:id="@+id/et_soundex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/tv_et_soundex" android:layout_below="@+id/tv_et_soundex" android:ems="10" > <requestfocus /> </EditText> <Button android:id="@+id/btn_soundex_calculate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/et_soundex" android:layout_below="@+id/et_soundex" android:layout_margintop="40dp" android:text="@string/btn_soundex_calculate" /> </RelativeLayout> 14
Beispiel eines Layouts <EditText android:id="@+id/et_soundex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/tv_et_soundex" android:layout_below="@+id/tv_et_soundex" android:ems="10" > <requestfocus /> </EditText> 15
Beispiel eines Layouts <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context=".soundexconverter" > <TextView android:id="@+id/tv_et_soundex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_alignparenttop="true" android:text="name zum berechnen:" /> <EditText android:id="@+id/et_soundex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/tv_et_soundex" android:layout_below="@+id/tv_et_soundex" android:ems="10" > <requestfocus /> </EditText> <Button android:id="@+id/btn_soundex_calculate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/et_soundex" android:layout_below="@+id/et_soundex" android:layout_margintop="40dp" android:text="@string/btn_soundex_calculate" /> </RelativeLayout> 16
Beispiel eines Layouts <Button android:id="@+id/btn_soundex_calculate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/et_soundex" android:layout_below="@+id/et_soundex" android:layout_margintop="40dp" android:text="@string/btn_soundex_calculate" /> 17
Beispiel AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.app.soundexconverter" android:versioncode="1" android:versionname="1.0" > <uses-sdk android:minsdkversion="8" android:targetsdkversion="18" /> <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <activity android:name="my.app.soundexconverter.soundexconverter" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <activity android:name="my.app.soundexconverter.ergebnisactivity" android:label="@string/title_activity_ergebnis" > </activity> <activity android:name="my.app.soundexconverter.ergebisactivity" android:label="@string/title_activity_ergebis" > </activity> </application> </manifest> 18
Beispiel AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.app.soundexconverter" android:versioncode="1" android:versionname="1.0" > Versionsnummer und Versionsname 19
Beispiel AndroidManifest.xml <activity android:name="my.app.soundexconverter.soundexconverter" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> Activities und Intents werden im AndroidManifest deklariert Die Entwicklungsumgebung kümmert sich automatisch darum! 20
Agenda Was ist Android? Android Versionen Layout, Strings und das Android Manifest Activities, Intents und Services Entwicklungsumgebung Übungsaufgaben 21
Activities Entspricht einer Ansicht auf dem Display Implementiert die Logik (Java) Erbt von Klasse Activity Referenziert und interagiert mit UIElementen aus dem Layout-XML 22
Activity Beispiel package my.app.random; import android.app.activity; import android.os.bundle; public class RandomActivity extends Activity { @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_random); } } 23
Activity Beispiel package my.app.random; import android.app.activity; import android.os.bundle; public class RandomActivity extends Activity { @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_random); } } 24
Auf Layout Elemente zugreifen Zugriff auf Layout Elemente erfolgt über findviewbyid() und der Klasse R. Da findviewbyid() ein Objekt des Typs Object zurückliefert ist ein Cast notwendig! /* TextView aus Layout holen */ TextView rndtextview = (TextView) findviewbyid(r.id.tv_random_number); /* Zufallszahl auf TextView schreiben */ rndtextview.settext("13"); tv.settext("13"); 25
Beispiel OnClickListener randombutton.setonclicklistener(new View.OnClickListener() { public void onclick(view v) { // randombutton wurde gedrückt // Hier kann man z.b. eine Berechnung auslösen, ein // Textfeld auslesen oder einen Intent starten. } }); 26
27
Intents Asyncrone Nachricht um mit anderen Komponenten zu kommunizieren Kann eine Activity einer anderen App aufrufen (z.b. die Kamera) Kann eine Activity innerhalb der App aufrufen Kann zusätzliche Daten enthalten (z.b. Strings, Integers, Booleans oder serialisierte Objekte) 28
Intents 29
Intent Beispiel Intent intent = new Intent(this, WisdomActivity.class); Der Konstruktor der Klasse Intent erwartet zwei Parameter: Context (Activity erbt von Context) Eine aufzurufende Klasse, welche von Activity, BroadcastReceiver oder Service erbt. 30
Intent Beispiel Intent intent = new Intent(this, WisdomActivity.class); intent.putextra("wisdom", "The cake is a lie!"); Dem Intent lassen sich mit der Methode putextra() Daten übergeben. Die Methode erwartet zwei Parameter: Einen eindeutigen Key (vom Typ String), unter welchem die Daten abgelegt werden. Daten, in Form von einem String, einem Integer, einem Double oder einem Objekt, dessen Klasse das Interface Serializable implementiert. 31
Intent Beispiel Intent intent = new Intent(this, WisdomActivity.class); intent.putextra("wisdom", "The cake is a lie!"); startactivity(intent); Mit der Methode startactivity() lässt sich eine weitere Activity mit der Angabe des Intents starten. 32
Intent Beispiel Bundle extras = getintent().getextras(); String wisdom = extras.getstring("wisdom"); In der aufgerufenen Activity lassen sich die mitgegebenen Daten wieder aus dem Bundle holen und verwenden. 33
Services Services laufen im Hintergrund Erbt von Klasse Service Kann beim Systemstart gestartet werden Beispiel: Messenger App, welche im Hintergrund Nachrichten empfängt. 34
Agenda Was ist Android? Android Versionen Layout, Strings und das Android Manifest Activities, Intents und Services Entwicklungsumgebung Übungsaufgaben 35
Entwicklungsumgebungen Ursprünglich war Eclipse mit einem Plugin und dem Android SDK die StandardEntwicklungsumgebung Mitlerweile bietet Google eine angepasste Eclipse Version speziell für AndroidEntwickler mit SDK und Plugin an Google entwickelt an einer neuen IDE Android Studio basierend auf IntelliJ IDEA 36
Agenda Was ist Android? Android Versionen Layout, Strings und das Android Manifest Activities, Intents und Services Entwicklungsumgebung Übungsaufgaben 37
Übungsaufgaben Der Soundex-Converter Berechnet den Soundex-Wert eines Namens und gibt dem Anwender das Ergebnis aus. 38
Vielen Dank für Ihre Aufmerksamkeit 39 PatrickTreyerundJannisPinter