Android SDK Dominik Gätjens Thomas Maier
Dominik Gätjens Studiert Medieninformatik(B.Sc.) an der Hochschule der Medien Stuttgart seit 2007   Software-Entwicklung (insbesondere Java) seit 2004   Kontakt: dominik.gaetjens@googlemail.com
Thomas Maier Student der Medieninformatik (Bachelor of Science)   Softwareentwicklung in C/C++ und Java   Webentwicklung und manchmal auch hardwarenahe Softwareentwicklung    Kontakt: admin@derthomas.net
Agenda   Android Basics   Entwicklungswerkzeuge   Plattformarchitektur   API    Security  
Was ist Android? Ein Betriebssystem für mobile Endgeräte   Entwickelt von der Open Handset Alliance   Unter Apache und GPL Lizenz (Open Source)   Basiert auf Linux-Kernel und Java (Dalvik-VM)   Gute Integration in die Google-Cloud
Features   Multitasking   Vielfalt an unterstützter Hardware   Entwicklerfreundlich (Java)    Durchgängig durchdachte Security   Reichhaltiges Angebot an Apps   Internet-Optimiert (Social Networking)    Google-Integration   Open Source
Einschränkungen   Google-Integration     Taskverwaltung     Gerätevielfalt     VM (keine JIT-Kompilierung)
Development Tools SDK Emulator Eclipse
Development Tools - SDK dx (Dalvik Cross-Assembler)   apkbuilder (Android Package)      adb (Android Debug Bridge)   layoutopt (layout-optimizer)  
Development Tools - SDK SDK and AVD Manager
Development Tools - Emulator Virtual Device Configuration
Development Tools - Emulator Virtual Device
Development Tools - Eclipse Java Perspektive
Development Tools - Eclipse Device Chooser
Development Tools - Eclipse DDMS (Dalvik Debug Monitor Server) Perspektive
Development Tools - Eclipse Debug View
Development Tools - Eclipse GUI Builder
Development Tools - Eclipse Configuration Editor
Architektur
Architektur
Architektur - Components Activity   Service   Broadcast Receiver   Content Provider
Components - Activity Repräsentiert Logik, Kontrolle und Ansicht eines "Screens"   Erbt von Klasse  android.app.Activity   Durch überschreiben der Lifecycle-Methoden wird der eigene Code aufgerufen  
Components - Activity
Components - Service Läuft im Hintergrund   Kein User-Interface   Erbt von Klasse  android.app.Service  
Components - Service
Components - Broadcast Receiver Registriert sich für den Emfang von Broadcasts   Beispiel: SMS-Empfang   Erbt von Klasse  android.content.BroadcastReceiver  
Intents Der Leim, der die Applikationsblöcke verbindet   Explizite und implizite Intents   startActivity(Intent i)   startActitivtyForResult(Intent i) -> onActivityResult()
Explizite Intents Intent i = new Intent(context,NewAcitivity.class) Definiert anhand des Class-Objektes genau welche Acitivity ausgelöst werden soll
Implizite Intents Intent i = new Intent(Intent.ACTION_DIAL,                       Uri.parse("tel:12345");   Intent definiert eine Action und eine Data-URI Android überprüft ob es dafür passende Activitys gibt und ruft diese auf Es ist eine sehr lose Kopplung zwischen Komponenten möglich, jedoch muss mit Laufzeitfehlern gerechnet werden wenn keine passende Activity vorhanden ist.   
Intent Filter <activity android:name=&quot;.MyActivity&quot;>     <intent-filter>         <action android:name=&quot;android.intent.action.PICK&quot;/>         <data android:path=&quot;de/myPath&quot;                 android:scheme=&quot;content&quot;/>     </intent-filter> </activity>
Resources
Resources - Layout <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <LinearLayout xmlns:android=                  &quot;http://schemas.android.com/apk/res/android&quot;               android:layout_width=&quot;fill_parent&quot;                android:layout_height=&quot;fill_parent&quot;                android:orientation=&quot;vertical&quot; >     <TextView android:id=&quot;@+id/mytextview&quot;               android:layout_width=&quot;wrap_content&quot;               android:layout_height=&quot;wrap_content&quot;               android:text=&quot;Hello World&quot; /> </LinearLayout>
Resources - Layout
Resources - Values ...  <TextView android:id=&quot;@+id/mytextview&quot;               android:layout_width=&quot;wrap_content&quot;               android:layout_height=&quot;wrap_content&quot;               android:text=&quot;@string/hello&quot;                /> ...  <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <resources>     <string name=&quot;hello&quot;>Hello World</string>  </resources>
Resources - Values
Resources - Values ...  <TextView android:id=&quot;@+id/mytextview&quot;               android:layout_width=&quot;wrap_content&quot;               android:layout_height=&quot;wrap_content&quot;               android:text=&quot;@string/hello&quot;                android:textColor=&quot;@color/translucent_red&quot;                android:textSize=&quot;@dimen/hello_size&quot;                 /> ...  <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <resources>     <string name=&quot;hello&quot;>Hello <b>World</b></string>      <color name=&quot;translucent_red&quot;>#80ff0000</color>      <dimen name=&quot;hello_size&quot;>16px</dimen>    </resources>
Resources - Drawables Verwendung mit   Resources.getDrawable(R.drawable.example) Bilder Beispiel:   res/drawable/example.jpg Color Drawables (Rechteck, optional runde Ecken) <resources>     <drawable name=&quot;solid_red&quot;>#f00</drawable> </resources> <TextView android:layout_width=&quot;fill_parent&quot;           android:layout_height=&quot;wrap_content&quot;           android:textAlign=&quot;center&quot;           android:background=&quot;@drawable/solid_red&quot;/>
Resources - AndroidManifest.xml Manifest
Resources - AndroidManifest.xml Application
Resources - AndroidManifest.xml Permissions
GUI-Elemente
GUI-Elemente Frame-Layout   Element positioniert sich automatisch links-oben   Gut für Fullscreen-Anwendungen   Keine Positionierung möglich
GUI-Elemente Absolute-Layout   Element positioniert sich nach Angabe über die x- und y-Koordinaten   Koordinaten beziehen sich auf Elternelement  
GUI-Elemente Linear-Layout   Reiht die Elemente wahlweise horizontal oder vertikal hintereinander auf
GUI-Elemente Table-Layout Bildet eine Tabelle ab
GUI-Elemente Relative-Layout Elemente können in Abhängigkeit von der Position anderer Elemente positioniert werden
GUI-Elemente Relative-Layout ... <RelativeLayout...      <Button ...              android:id=&quot;@+id/myButton1&quot;              android:layout_centerInParent=&quot;true&quot;              ...       />      <Button ...               android:id=&quot;@+id/myButton2&quot;              android:layout_toRightOf=&quot;@+id/myButton1&quot;              android:layout_alignTop=&quot;@id/myButton1&quot;      /> </RelativeLayout> ...
GUI-Elemente GUI-Elemente sind hierarchisch angeordnet
GUI-Elemente TextView     Button     EditText   
GUI-Elemente CheckBox     RadioButton      DatePicker  
GUI-Elemente Properties         Access in Java Properties         Access in Java <Button ...      android:layout_width=&quot;wrap_content&quot;      android:layout_height=&quot;wrap_content&quot;      android:textColor=&quot;#ff0000&quot;        android:id=&quot;@+id/Button1&quot;      android:text=&quot;Button&quot;      ...  />      <TextView ...      android:layout_width=&quot;fill_parent&quot;      android:layout_height=&quot;wrap_content&quot;      android:text=&quot;@string/content&quot;      android:id=&quot;@+id/Text1&quot;      android:textSize=&quot;14dip&quot;      ...  /> private Button button1; ...   button1 = (Button) findViewById(R.id.Button1); ... button1.setOnClickListener(new OnClickListener() {      public void onClick(View v) {         doAction();     } }); ... private TextView text1; ...   text1 = (TextView) findViewById(R.id.Text1); ... text1.setText(newText); ...
GUI-Elemente Menus public boolean onCreateOptionsMenu(Menu menu) {     menu.add(0, 1, 0, &quot;Item1&quot;);     menu.add(0, 2, 0, &quot;Item2&quot;);     return true; } public boolean onOptionsItemSelected(MenuItem item) {     switch (item.getItemId()) {     case 1:         action1();         return true;     case 2:         action2();         return true;     }     return false; }
GUI-Elemente Maßeinheiten px (Pixels) in (Inches) mm (Millimeters) pt (Points) dip (Density-independent Pixels) Ein dip entspricht einem Pixel auf einem 160dpi Screen sp (Scale-independet Pixels) Wie dip-Einheit, allerdings zusätzlich abhängig von der Schriftgröße der Benutzereinstellung  
API SMS Location Map Sensors
SMS senden SmsManger.getDefault()   sendTextMessage( String dest,   //Empfänger-Nummer String serviceCenter,   //SMS-Service Center (null) String text,  //Text PendingIntent sentIntent,   //Gesendet Feedback PendingIntent deliveryIntent          //Angekommen Feedback       )
SMS empfangen erstellen eines  BroadcastReceivers   dieser erhält ein Intent mit einem Bundle &quot;pdus&quot; PDU-Rohdaten lassen sich mittels  SmsMessage.createFromPdu(byte[] pdu)  in ein SmsMessage Objekt umwandeln  Den erstellten BroadcastReceiver in der AndroidManifest.xml registrieren     <receiver android:name=&quot;SmsReceiver&quot;> <intent-filter> <action android:name=&quot;android.provider.Telephony.SMS_RECEIVED&quot; /> </intent-filter> </receiver>
Maps <LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;     android:id=&quot;@+id/main&quot;     android:layout_width=&quot;fill_parent&quot;      android:layout_height=&quot;fill_parent&quot;>     <com.google.android.maps.MapView          android:id=&quot;@+id/map&quot;          android:layout_width=&quot;fill_parent&quot;           android:layout_height=&quot;fill_parent&quot;         android:enabled=&quot;true&quot;         android:clickable=&quot;true&quot;         android:apiKey=&quot;0yPsX1Tb93ThKLOA1zT5GtfuzoSYOP9C9G1Ojzg&quot;         />             </LinearLayout> API-Key http://code.google.com/intl/de-DE/android/maps-api-signup.html $ keytool -list -keystore ~/.android/debug.keystore
Maps public class MyMapView extends MapActivity {      private MapView map;     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.maplayout);          map =(MapView) findViewById(R.id.map);          map.setBuiltInZoomControls(true);          MapController mapController = map.getController();         GeoPoint geoPoint = new GeoPoint(coordinates[0],coordinates[1]);         mapController.setCenter(geoPoint);         mapController.setZoom(14);        }     protected boolean isRouteDisplayed() {           return false;      } }
Location LocationManager lm = getSystemService(LOCATION_SERVICE) String provider = lm.getBestProvider(Criteria c,       boolean enabled) Location location = lm.getLastKnownLocation(      String provider)
Sensors SensorManager sm = getSystemService(SENSOR_SERVICE) sm.registerListener(sensorEventListener,           sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),           SensorManager.SENSOR_DELAY_NORMAL          ); Sensortypen: Orientation, Accelerometer, Light, Magnetic Field, Pressure, Proximity, Temperature, Gyroscope
Dateisystem Anwendungsverzeichnis im Telefonspeicher      File file = context.getDir(&quot;sms&quot;,Context.MODE_PRIVATE); /data/data/de.hdm.smssender/app_sms      Zugriff auf SD-Karte mit Java I/O im Pfad  /sdcard
SQLite Datenbank erstellen public class SmsDB extends SQLiteOpenHelper {      private static final String DATENBANK_NAME = &quot;sms.db&quot;;      private static final int DATENBANK_V = 1;         public SmsDB (Context context) {          super( context, DATENBANK_NAME , null, DATENBANK_V );      }       public void onCreate(SQLiteDatabase db) {          db.execSQL(&quot;CREATE TABLE ...&quot;);      }         public void onUpgrade (SQLiteDatabase db,int oldV ,int newV){          db.execSQL(&quot;DROP TABLE ...&quot;);          onCreate(db);      }  }
SQLite Abfrage Cursor cursor = db.query(      false, // distinct     DATABASE_TABLE, // TABLE     new String[] {KEY_SMS, KEY_NR}, // SELECT      KEY_NR+&quot; = ?&quot;, // WHERE-Bedingung      new String[] {&quot;0171 23456&quot;}, // Parameter für WHERE      null, // GROUP BY      null, // HAVING      null, // ORDER BY      null // LIMIT  );
SQLite Abfrage 2 Cursor bielefeldRouten = db.rawQuery(      &quot;SELECT &quot;+KEY_SMS+&quot;, &quot;+KEY_NR+&quot; &quot;+      &quot;FROM &quot;+DATABASE_TABLE+&quot; &quot;+      &quot;WHERE &quot;+KEY_NR+&quot; = ? &quot;,      new String[] { &quot;0171 23456&quot; }  );  Reines SQL (minimal schneller als OO-Variante)
SQLite Abfrage 3 startManagingCursor(cursor); if(cursor.moveToFirst()){       String foo = cursor.getString(0);      display(foo); } ContentValues initialValues = new ContentValues(); initialValues.put(KEY_SMS, &quot;Hallo, Welt&quot;); initialValues.put(KEY_NR, &quot;0171 123456&quot;); db.insert(DATABASE_TABLE, null, initialValues);
Security
Security   Linux-Security auf Prozessebene   Sandboxing   Application Signing
Security  - Permissions Standard-Applikation hat keine Permissions Überprüfung während Installation <uses-permission android:name=&quot;android.permission.RECEIVE_SMS&quot; />
Security  - Permissions android.permission.INTERNET   android.permission.BLUETOOTH   android.permission.READ_CONTACTS   android.permission.SEND_SMS   android.permission.VIBRATE
Literatur Android Application Development: Programming with the Google SDK - Rock Rogers, John de Lombardo, Ziquard Mednieks, Meike Blake (ISBN: 978-0596521479) Hello Android: Introducing Google's Mobile Development Platform - Ed Burnette, Susannah Davidson Pfalzer ( ISBN: 978-1934356494) Android: Grundlagen und Programmierung - Arno Becker, Marcus Pant (ISBN: 978-3898645744)   http://developer.android.com
Android SDK Dominik Gätjens Thomas Maier Fragen? Vielen Dank für die Aufmerksamkeit :-)

Android Development

  • 1.
    Android SDK DominikGätjens Thomas Maier
  • 2.
    Dominik Gätjens StudiertMedieninformatik(B.Sc.) an der Hochschule der Medien Stuttgart seit 2007   Software-Entwicklung (insbesondere Java) seit 2004   Kontakt: dominik.gaetjens@googlemail.com
  • 3.
    Thomas Maier Studentder Medieninformatik (Bachelor of Science)   Softwareentwicklung in C/C++ und Java   Webentwicklung und manchmal auch hardwarenahe Softwareentwicklung   Kontakt: admin@derthomas.net
  • 4.
    Agenda   AndroidBasics   Entwicklungswerkzeuge   Plattformarchitektur   API   Security  
  • 5.
    Was ist Android?Ein Betriebssystem für mobile Endgeräte   Entwickelt von der Open Handset Alliance   Unter Apache und GPL Lizenz (Open Source)   Basiert auf Linux-Kernel und Java (Dalvik-VM)   Gute Integration in die Google-Cloud
  • 6.
    Features   Multitasking  Vielfalt an unterstützter Hardware   Entwicklerfreundlich (Java)   Durchgängig durchdachte Security   Reichhaltiges Angebot an Apps   Internet-Optimiert (Social Networking)   Google-Integration   Open Source
  • 7.
    Einschränkungen   Google-Integration    Taskverwaltung     Gerätevielfalt     VM (keine JIT-Kompilierung)
  • 8.
    Development Tools SDKEmulator Eclipse
  • 9.
    Development Tools -SDK dx (Dalvik Cross-Assembler)   apkbuilder (Android Package)      adb (Android Debug Bridge)   layoutopt (layout-optimizer)  
  • 10.
    Development Tools -SDK SDK and AVD Manager
  • 11.
    Development Tools -Emulator Virtual Device Configuration
  • 12.
    Development Tools -Emulator Virtual Device
  • 13.
    Development Tools -Eclipse Java Perspektive
  • 14.
    Development Tools -Eclipse Device Chooser
  • 15.
    Development Tools -Eclipse DDMS (Dalvik Debug Monitor Server) Perspektive
  • 16.
    Development Tools -Eclipse Debug View
  • 17.
    Development Tools -Eclipse GUI Builder
  • 18.
    Development Tools -Eclipse Configuration Editor
  • 19.
  • 20.
  • 21.
    Architektur - ComponentsActivity   Service   Broadcast Receiver   Content Provider
  • 22.
    Components - ActivityRepräsentiert Logik, Kontrolle und Ansicht eines &quot;Screens&quot;   Erbt von Klasse android.app.Activity   Durch überschreiben der Lifecycle-Methoden wird der eigene Code aufgerufen  
  • 23.
  • 24.
    Components - ServiceLäuft im Hintergrund   Kein User-Interface   Erbt von Klasse android.app.Service  
  • 25.
  • 26.
    Components - BroadcastReceiver Registriert sich für den Emfang von Broadcasts   Beispiel: SMS-Empfang   Erbt von Klasse android.content.BroadcastReceiver  
  • 27.
    Intents Der Leim,der die Applikationsblöcke verbindet   Explizite und implizite Intents   startActivity(Intent i)   startActitivtyForResult(Intent i) -> onActivityResult()
  • 28.
    Explizite Intents Intenti = new Intent(context,NewAcitivity.class) Definiert anhand des Class-Objektes genau welche Acitivity ausgelöst werden soll
  • 29.
    Implizite Intents Intenti = new Intent(Intent.ACTION_DIAL,                      Uri.parse(&quot;tel:12345&quot;);   Intent definiert eine Action und eine Data-URI Android überprüft ob es dafür passende Activitys gibt und ruft diese auf Es ist eine sehr lose Kopplung zwischen Komponenten möglich, jedoch muss mit Laufzeitfehlern gerechnet werden wenn keine passende Activity vorhanden ist.  
  • 30.
    Intent Filter <activityandroid:name=&quot;.MyActivity&quot;>     <intent-filter>         <action android:name=&quot;android.intent.action.PICK&quot;/>         <data android:path=&quot;de/myPath&quot;                android:scheme=&quot;content&quot;/>     </intent-filter> </activity>
  • 31.
  • 32.
    Resources - Layout<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <LinearLayout xmlns:android=                  &quot;http://schemas.android.com/apk/res/android&quot;               android:layout_width=&quot;fill_parent&quot;               android:layout_height=&quot;fill_parent&quot;               android:orientation=&quot;vertical&quot; >     <TextView android:id=&quot;@+id/mytextview&quot;               android:layout_width=&quot;wrap_content&quot;               android:layout_height=&quot;wrap_content&quot;               android:text=&quot;Hello World&quot; /> </LinearLayout>
  • 33.
  • 34.
    Resources - Values... <TextView android:id=&quot;@+id/mytextview&quot;               android:layout_width=&quot;wrap_content&quot;               android:layout_height=&quot;wrap_content&quot;               android:text=&quot;@string/hello&quot;               /> ... <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <resources>     <string name=&quot;hello&quot;>Hello World</string> </resources>
  • 35.
  • 36.
    Resources - Values... <TextView android:id=&quot;@+id/mytextview&quot;               android:layout_width=&quot;wrap_content&quot;               android:layout_height=&quot;wrap_content&quot;               android:text=&quot;@string/hello&quot;               android:textColor=&quot;@color/translucent_red&quot;               android:textSize=&quot;@dimen/hello_size&quot;               /> ... <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <resources>     <string name=&quot;hello&quot;>Hello <b>World</b></string>      <color name=&quot;translucent_red&quot;>#80ff0000</color>      <dimen name=&quot;hello_size&quot;>16px</dimen>   </resources>
  • 37.
    Resources - DrawablesVerwendung mit  Resources.getDrawable(R.drawable.example) Bilder Beispiel: res/drawable/example.jpg Color Drawables (Rechteck, optional runde Ecken) <resources>     <drawable name=&quot;solid_red&quot;>#f00</drawable> </resources> <TextView android:layout_width=&quot;fill_parent&quot;           android:layout_height=&quot;wrap_content&quot;           android:textAlign=&quot;center&quot;           android:background=&quot;@drawable/solid_red&quot;/>
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
    GUI-Elemente Frame-Layout  Element positioniert sich automatisch links-oben   Gut für Fullscreen-Anwendungen   Keine Positionierung möglich
  • 43.
    GUI-Elemente Absolute-Layout  Element positioniert sich nach Angabe über die x- und y-Koordinaten   Koordinaten beziehen sich auf Elternelement  
  • 44.
    GUI-Elemente Linear-Layout  Reiht die Elemente wahlweise horizontal oder vertikal hintereinander auf
  • 45.
  • 46.
    GUI-Elemente Relative-Layout Elementekönnen in Abhängigkeit von der Position anderer Elemente positioniert werden
  • 47.
    GUI-Elemente Relative-Layout ...<RelativeLayout...      <Button ...              android:id=&quot;@+id/myButton1&quot;              android:layout_centerInParent=&quot;true&quot;             ...     />     <Button ...              android:id=&quot;@+id/myButton2&quot;             android:layout_toRightOf=&quot;@+id/myButton1&quot;              android:layout_alignTop=&quot;@id/myButton1&quot;     /> </RelativeLayout> ...
  • 48.
    GUI-Elemente GUI-Elemente sindhierarchisch angeordnet
  • 49.
    GUI-Elemente TextView    Button     EditText  
  • 50.
    GUI-Elemente CheckBox    RadioButton     DatePicker  
  • 51.
    GUI-Elemente Properties        Access in Java Properties         Access in Java <Button ...     android:layout_width=&quot;wrap_content&quot;     android:layout_height=&quot;wrap_content&quot;      android:textColor=&quot;#ff0000&quot;       android:id=&quot;@+id/Button1&quot;     android:text=&quot;Button&quot;     ... />    <TextView ...      android:layout_width=&quot;fill_parent&quot;      android:layout_height=&quot;wrap_content&quot;      android:text=&quot;@string/content&quot;      android:id=&quot;@+id/Text1&quot;      android:textSize=&quot;14dip&quot;     ... /> private Button button1; ...   button1 = (Button) findViewById(R.id.Button1); ... button1.setOnClickListener(new OnClickListener() {      public void onClick(View v) {         doAction();     } }); ... private TextView text1; ...   text1 = (TextView) findViewById(R.id.Text1); ... text1.setText(newText); ...
  • 52.
    GUI-Elemente Menus publicboolean onCreateOptionsMenu(Menu menu) {     menu.add(0, 1, 0, &quot;Item1&quot;);     menu.add(0, 2, 0, &quot;Item2&quot;);     return true; } public boolean onOptionsItemSelected(MenuItem item) {     switch (item.getItemId()) {     case 1:         action1();         return true;     case 2:         action2();         return true;     }     return false; }
  • 53.
    GUI-Elemente Maßeinheiten px(Pixels) in (Inches) mm (Millimeters) pt (Points) dip (Density-independent Pixels) Ein dip entspricht einem Pixel auf einem 160dpi Screen sp (Scale-independet Pixels) Wie dip-Einheit, allerdings zusätzlich abhängig von der Schriftgröße der Benutzereinstellung  
  • 54.
    API SMS LocationMap Sensors
  • 55.
    SMS senden SmsManger.getDefault()  sendTextMessage( String dest, //Empfänger-Nummer String serviceCenter, //SMS-Service Center (null) String text, //Text PendingIntent sentIntent, //Gesendet Feedback PendingIntent deliveryIntent         //Angekommen Feedback      )
  • 56.
    SMS empfangen erstelleneines BroadcastReceivers   dieser erhält ein Intent mit einem Bundle &quot;pdus&quot; PDU-Rohdaten lassen sich mittels SmsMessage.createFromPdu(byte[] pdu) in ein SmsMessage Objekt umwandeln Den erstellten BroadcastReceiver in der AndroidManifest.xml registrieren     <receiver android:name=&quot;SmsReceiver&quot;> <intent-filter> <action android:name=&quot;android.provider.Telephony.SMS_RECEIVED&quot; /> </intent-filter> </receiver>
  • 57.
    Maps <LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;    android:id=&quot;@+id/main&quot;     android:layout_width=&quot;fill_parent&quot;     android:layout_height=&quot;fill_parent&quot;>     <com.google.android.maps.MapView         android:id=&quot;@+id/map&quot;         android:layout_width=&quot;fill_parent&quot;          android:layout_height=&quot;fill_parent&quot;         android:enabled=&quot;true&quot;         android:clickable=&quot;true&quot;         android:apiKey=&quot;0yPsX1Tb93ThKLOA1zT5GtfuzoSYOP9C9G1Ojzg&quot;         />            </LinearLayout> API-Key http://code.google.com/intl/de-DE/android/maps-api-signup.html $ keytool -list -keystore ~/.android/debug.keystore
  • 58.
    Maps public classMyMapView extends MapActivity {      private MapView map;     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.maplayout);         map =(MapView) findViewById(R.id.map);          map.setBuiltInZoomControls(true);          MapController mapController = map.getController();         GeoPoint geoPoint = new GeoPoint(coordinates[0],coordinates[1]);         mapController.setCenter(geoPoint);         mapController.setZoom(14);       }     protected boolean isRouteDisplayed() {           return false;      } }
  • 59.
    Location LocationManager lm= getSystemService(LOCATION_SERVICE) String provider = lm.getBestProvider(Criteria c,       boolean enabled) Location location = lm.getLastKnownLocation(      String provider)
  • 60.
    Sensors SensorManager sm= getSystemService(SENSOR_SERVICE) sm.registerListener(sensorEventListener,           sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),           SensorManager.SENSOR_DELAY_NORMAL          ); Sensortypen: Orientation, Accelerometer, Light, Magnetic Field, Pressure, Proximity, Temperature, Gyroscope
  • 61.
    Dateisystem Anwendungsverzeichnis imTelefonspeicher      File file = context.getDir(&quot;sms&quot;,Context.MODE_PRIVATE); /data/data/de.hdm.smssender/app_sms      Zugriff auf SD-Karte mit Java I/O im Pfad  /sdcard
  • 62.
    SQLite Datenbank erstellenpublic class SmsDB extends SQLiteOpenHelper {     private static final String DATENBANK_NAME = &quot;sms.db&quot;;     private static final int DATENBANK_V = 1;        public SmsDB (Context context) {         super( context, DATENBANK_NAME , null, DATENBANK_V );     }      public void onCreate(SQLiteDatabase db) {         db.execSQL(&quot;CREATE TABLE ...&quot;);     }        public void onUpgrade (SQLiteDatabase db,int oldV ,int newV){         db.execSQL(&quot;DROP TABLE ...&quot;);         onCreate(db);     } }
  • 63.
    SQLite Abfrage Cursorcursor = db.query(     false, // distinct     DATABASE_TABLE, // TABLE     new String[] {KEY_SMS, KEY_NR}, // SELECT     KEY_NR+&quot; = ?&quot;, // WHERE-Bedingung     new String[] {&quot;0171 23456&quot;}, // Parameter für WHERE     null, // GROUP BY     null, // HAVING     null, // ORDER BY     null // LIMIT );
  • 64.
    SQLite Abfrage 2Cursor bielefeldRouten = db.rawQuery(     &quot;SELECT &quot;+KEY_SMS+&quot;, &quot;+KEY_NR+&quot; &quot;+     &quot;FROM &quot;+DATABASE_TABLE+&quot; &quot;+     &quot;WHERE &quot;+KEY_NR+&quot; = ? &quot;,     new String[] { &quot;0171 23456&quot; } ); Reines SQL (minimal schneller als OO-Variante)
  • 65.
    SQLite Abfrage 3startManagingCursor(cursor); if(cursor.moveToFirst()){     String foo = cursor.getString(0);     display(foo); } ContentValues initialValues = new ContentValues(); initialValues.put(KEY_SMS, &quot;Hallo, Welt&quot;); initialValues.put(KEY_NR, &quot;0171 123456&quot;); db.insert(DATABASE_TABLE, null, initialValues);
  • 66.
  • 67.
    Security   Linux-Securityauf Prozessebene   Sandboxing   Application Signing
  • 68.
    Security -Permissions Standard-Applikation hat keine Permissions Überprüfung während Installation <uses-permission android:name=&quot;android.permission.RECEIVE_SMS&quot; />
  • 69.
    Security -Permissions android.permission.INTERNET   android.permission.BLUETOOTH   android.permission.READ_CONTACTS   android.permission.SEND_SMS   android.permission.VIBRATE
  • 70.
    Literatur Android ApplicationDevelopment: Programming with the Google SDK - Rock Rogers, John de Lombardo, Ziquard Mednieks, Meike Blake (ISBN: 978-0596521479) Hello Android: Introducing Google's Mobile Development Platform - Ed Burnette, Susannah Davidson Pfalzer ( ISBN: 978-1934356494) Android: Grundlagen und Programmierung - Arno Becker, Marcus Pant (ISBN: 978-3898645744)   http://developer.android.com
  • 71.
    Android SDK DominikGätjens Thomas Maier Fragen? Vielen Dank für die Aufmerksamkeit :-)

Hinweis der Redaktion

  • #2 -&gt; Vorstellung 30 sek
  • #3 Thomas   -&gt; Agenda 30 sek
  • #4 Thomas   -&gt; Agenda 30 sek
  • #5 Thomas   -&gt; Agenda 30 sek
  • #6 Thomas   -&gt; Ein Betriebssystem für mobile Endgeräte       Beispielgeräte/hersteller.     Mehr als Betriebssystem... -&gt; Entwickelt von der Open Handset Alliance       65 Unternehmen, Netzbetreiber, Software-Firmen, Marketing-Firme, Geräte-Hersteller, unter Goole   -&gt; Unter Apache und GPL Lizenz (Open Source)        klar...    -&gt;  Basiert auf Linux-Kernel und Java       klar...+Dalvik -&gt; Gute Integration in die Google-Cloud       Kalender, Mail, Kontakte 1 min
  • #7 Thomas   -&gt; Multitasking       klar... -&gt; Vielfalt an unterstützter Hardware       Keine proprietäre Software, Abstraktionsschichten, Geräteverwaltung       Viel Aktorik: Beschleunigungssensor, Kompass, GPS, WiFi, Bluetooth, Beleuchtungssensor -&gt; Entwicklerfreundlich (Java)        Keine neue Sprache, Hochsprache, Gute Entwicklungsumgebung, gewohnte Werkzeuge   -&gt; Durchgängig durchdachte Security       sandboxing, jede app in eigener vm, permissions -&gt; Reichhaltiges Angebot an Apps       Fast 50.000 im offiziellen Google Market, Sekündärmärkte verfügbar      Bsp.: andappstore.com         slideme.org         handandgo.com     Anmeldung: 25$     nach Registration: upload vom Handy aus     -&gt; Internet-Optimiert (Social Networking        Mail, Messenger, Facebook und co., Browser, Telefon rückt in den Hintergrund (kleineres Netbook mit Telefon)   -&gt; Google-Integration       Synchronisation mit Kalender, Mail und Kontakte     -&gt; Open Source         ...klar   2 min
  • #8 Thomas -&gt; Google-Integration       Guter voller Funktionsumfang nur mit Google-Diensten   -&gt;  Taskverwaltung       Programme lassen sich oft nicht explizit beenden (ohne Taskkiller)     Sollte aber eigentlich nicht nötig sein...da android automatisch killt       Nur indirekte Wechsel über GUI.   -&gt; Gerätevielfalt         Muss Hardware vieler Hersteller unterstützen. HAL nötig. -&gt; Langsamer (theoretisch) -&gt; VM (keine JIT-Kompilierung)   JIT kompiliert teilstücke von class-files vor runtime, statt sie zu interpretieren 1 min
  • #9 Thomas -&gt; Development Tools 30 sek
  • #10 Thomas   -&gt;dx        *.dex executable für dalvik vm     dx baut aus class-bytecode bytecode für dalvik-vm  explizite nutzung   -&gt; apkbuilder     *.apk packages beihnhalten alle nötigen daten für app (quasi-installationsdatei) (resources+dex-classes) explizite nutzung -&gt;adb     Android Debug Bridge     Client auf development-pc     Server auf development-pc (daemon)     Client auf Target (real oder avd)(daemon) explizite nutzung +telefon komplett bedienen -&gt;layoutopt     optimiert, validiert layout commandline-tool   -&gt; Dominik jeztt Eclipse 3 min sum: 9 min     
  • #11 Thomas Bestandteil des SDK.   Java-Programm. Verwaltet API-Versionen.   Verwaltet Google-API&apos;s, nötig für Google Maps.   Verwaltet Virtual Devices (AVD-Android Virtual Device) Path für Eclipse (bzw. allgemein AVD-Manager und andere Tools) setze. 1 min
  • #12 Dominik AVD Anlegen 30 sek
  • #13 Dominik gestarter Emulator 30 sek
  • #14 Dominik  30sek Standard Eclipse ansicht kennt jeder Java Entwickler
  • #15 Dominik   30sek Applikation Starten  -&gt; Device Chooser
  • #16 Dominik DDMS View Device Ansicht mit Prozessen, Heap, Allocation Tracker, Threads, File Explorer Performance Löcher und Bugs finden LogCat kommt gleich 30 sek
  • #17 Dominik Debug View lässt sich auch ganz normal starten  Bekannt aus Java Entwicklung + LogCat LogCat gibt Android Logs aus, ähnlich einem consolen appender in Log4J 1 min
  • #18 Dominik Vollwertiger Gui Designer    Links Komponents  und Properties Rechts View-Hirachie     wird später im Detail drauf eingegangen 30 sek
  • #19 Dominik Android Manifest, Alle wichtigen Meta informationen für die Applikation. gehen wir später drauf ein 30 sek sum: 14,5 min
  • #20 Thomas -&gt; Architektur 0 sek
  • #21 Thomas -&gt; Linux-Kernel        Version 2.6        System-Dienste        security, memory management, process management, network stack, and driver model.       HAL für restlichen Softwarestack -&gt; Android Runtime       Für jede Applikation eigene Dalvik-VM  (Mehrere Instanzen pro Gerät)     Core-Libraries (nur teilmenge der, der Java-VM)     Es fehlt z.B. print, rmi, awt/swing     Anderer Release-Zyklus (hinterher, momentan java 1.5)       Java Vm basiert auf Kellerautomat, Dalvik VM auf Registermaschine (CPU auch). Dalvik in der Hinsicht besser     Umwandlung durch dx -&gt; Libraries (C/C++)     Surface Manager: Display I/O, Bringt 2d und 3d auf display zusammen     Media Framework: Media Codecs (Bilder, Video, Audio)     SQLite: Relationelle Datenbank, Zugriff für alle Applikationen     OpenGL: 3d Engine (Software, wahlweise hardware-beschleunigung)     FreeType: Bitmap und Vektor-Rendering (Schriften)     WebKit: HTML-Rendering Bibliothek     SGL: 2d engine     SSL: secure socket layer protocol...klar     libc: Standard C Lib       NDK: native development tools: für performance-kritische anwendungen zugriff auf c-libs    -&gt; Applikation Framework     Activity-Manager: Verwaltet Activities     Window-Manager: Verwaltet Windows       Content-Providers: Stellen Daten zur Verfügung     View-System: Verwaltet Views     Package-Manager: Verwaltet installierte Apps     Telephony-Manager: Zugriff auf Telefonie-status und service      Resource-Manager: Verwaltet Zugriff auf nicht-code resourcen     Location-Manager: Verwaltet Zugriff auf Positions-Daten     Notification-Manager: events im hintergrund, led, statusleiste. 5 min     
  • #22 Thomas -&gt; Components: Bausteine für Applikation, unabhängig. Andere Apps können Bausteine benutzen (mit permission).       gleichzeitig auch immer eine klasse 30 sek sum: 20 min
  • #23 Dominik   Logik, Kontrolle und Ansicht eines Screens (App-View) erbt von Acitivity Life-Cycle Methoden werden überschrieben um code einzubringen 30 sek
  • #24 Dominik   onCreate() initalisierungen onStart() weitere reInitialisierung onResume() Animationen und Musik starten. onPause( Animation und Musik stoppen   onPause()  Activity wurde teilweise überlagert. onStop() Avitivty wurde vollständig überlagert. onDestroy() wird nur durch aufruf von finish! 4 min
  • #25 Dominik laufen im Hintergrund  z.B. Mp3 Spieler kein UI erben von Service 30 sek
  • #26 Dominik 2 Life-Cycles 1. Service läuft immer und muss sich selbst beenden 2. Service wird beenden wenn keine bins mehr da sind. 2 min
  • #27 Dominik Regestrieren sich für Broadcasts Broadcasts werden vom System bei Ereignissen geschickt (SMS,Akku, Boot) erbt von BroadcastReceiver 1 min
  • #28 Dominik Leim zwischen den App-Blöcken Explizite und Impliizite Intents explizite geben Klasse an implizite nur eine Action 2. methoden zum starten ohne und mit Result 2 min
  • #29 Dominik     geben Context an jede Activity ist ein Context da Activitiy von Context erbt, darum meist &amp;quot;this&amp;quot; und aufzurufende Acitivity-Klasse 30 sek
  • #30 Dominik Intent gibt eine Action und eine Data-URI an Android sucht die passende Acitivity anhand von definierten Filtern sehr Lose kopplung aber Laufzeitfehler möglich 2 min
  • #31 Dominik   action  PICK schema content:// path de/myPath content://de/myPath   30 sek sum: 32,5 min
  • #32 Thomas -&gt; Resources: Nicht-code daten, sind auch in android selbst noch in der form da, verwaltung durch resource-manager -&gt;projekt anlegen/öffnen   -&gt; R.java   30 sek
  • #33 Thomas   Ein Layout File pro View   Filename: [a-z0-9_.] res/layout   namespace 1 min
  • #34 Thomas 30 sek
  • #35 Thomas   Filename: [a-z0-9_.] res/values   einafchster fall: verwendung als text direkt in layout    &amp;quot;This&apos;ll work&amp;quot;This&apos;ll also work   3 min  
  • #36 Thomas   30 sek
  • #37 Thomas   Filename: [a-z0-9_.] res/values   einafchster fall: verwendung als text direkt in layout    &amp;quot;This&apos;ll work&amp;quot;This&apos;ll also work   weitere möglichkeiten: farbe,dimensionen html-formatierung 3 min
  • #38 Thomas   Filename: [a-z0-9_.] res/drawables-hdpi,ldpi,mdpi   +nine-patch       4 min  
  • #39 Thomas ....liber im Editor   Liegt in applikations-root-verzeichnis   was alles dazu?   3 min -&gt; Demo Resources (5 min) sum 52,5 min
  • #40 Thomas ....liber im Editor   Liegt in applikations-root-verzeichnis   was alles dazu?   3 min -&gt; Demo Resources (5 min) sum 52,5 min
  • #41 Thomas ....liber im Editor   Liegt in applikations-root-verzeichnis   was alles dazu?   3 min -&gt; Demo Resources (5 min) sum 52,5 min
  • #42 Thomas   -&gt; 10 min
  • #43 Thomas   -&gt; 10 min
  • #44 Thomas   -&gt; 10 min
  • #45 Thomas   -&gt; 10 min
  • #46 Thomas   -&gt; 10 min
  • #47 Thomas   -&gt; 10 min
  • #48 Thomas   -&gt; 10 min
  • #49 Thomas   sum 65,5 min -&gt; demo über elemnt id&apos;s + findViews()
  • #50 Thomas   sum 65,5 min -&gt; demo über elemnt id&apos;s + findViews()
  • #51 Thomas   sum 65,5 min -&gt; demo über elemnt id&apos;s + findViews()
  • #52 Thomas   sum 65,5 min -&gt; demo über elemnt id&apos;s + findViews()
  • #53 Thomas   sum 65,5 min -&gt; demo über elemnt id&apos;s + findViews()
  • #54 Thomas   sum 65,5 min -&gt; demo über elemnt id&apos;s + findViews()
  • #55 onStop()??? 30 sek Ein Paar Ausschnitte aus der API immer wieder Beispiel
  • #56 Dominik 3 min
  • #57 Dominik PDU = Packet Data Unit BEISPIEL 2 min + demo 3 min -&gt; 5 min
  • #58 Thomas  API-Key   7 min 97 min
  • #59 Thomas  API-Key   7 min 97 min
  • #60 Dominik http://code.google.com/intl/de-DE/android/maps-api-signup.html DEMO APPLIKATION STARTN 2 min + demo 3 min   +app-demo 2 min 10 min sum: 85 min
  • #61 Dominik                 2 min folie 3 min demo   5 min  
  • #62 Thomas  API-Key   7 min 97 min
  • #63 Thomas  API-Key   7 min 97 min
  • #64 public Cursor query (boolean distinct, String table, String[] columns,  String selection, String[] selectionArgs,   String groupBy,  String having, String orderBy,  String limit)
  • #65 db : public synchronized SQLiteDatabase getReadableDatabase () 
  • #66 public long insert ( String table, String nullColumnHack, ContentValues values)  nullColumnHack SQL doesn&apos;t allow inserting a completely empty row, so if initialValues is empty this column will explicitly be assigned a NULL value
  • #67 Thomas   5 min
  • #68 Thomas   -&gt;Linux-Security auf Prozessebene       User/Groups - Permissions   -&gt; Sanboxing     Jede App eigene VM     security-safety -&gt; Application Signing       Jede App hat Zertifikat     Private Key von Developer     Keine Authority     Nur um App zu  identifizieren
  • #69 Thomas     -&gt;Standard-Applikation hat keine Permissions        klar...   -&gt; Überprüfung während der installation.         User muss permissions geben. -&gt; Beispiel     Permissions in AndroidManifest.xml
  • #70 Thomas      
  • #71 content://
  • #72 -&gt; Vorstellung 103 min!?