35
Einführung in Android 22. Oktober 2014

Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Einführung in Android

22. Oktober 2014

Page 2: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 39

Was ist Android?

Software für mobile Geräte: Betriebssystem Middleware Kernanwendungen

Android SDK: Tools und APIs zur Entwicklung von Anwendungen auf der

Android-Plattform URL für Entwickler: developer.android.com

Open Source Software

Page 3: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 40

Android Architektur

developer.android.com

Page 4: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41

Bibliotheken, Runtime und Kernel

Android enthält eine Reihe von C/C++-Bibliotheken. z.B. SGL und 3D Librairies für 2D und 3D-Darstellungen z.B. SQLite als leichtgewichtiges relationales Datenbank-

system Android Runtime

Jede Android-Anwendung läuft in einem eigenen Prozess mit der sogenannten Dalvik Virtual Machine.

Die Dalvik VM basiert auf einem Linux Kernel. Linux Kernel

Android basiert auf der Linux Kernel Version 3.0.1 Der Kernel fungiert als Abstraktionsebene zwischen

Hardware und dem Rest des Software Stack.

Page 5: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 42

Android Anwendungen Android enthält eine Reihe

von Kernanwendungen. Email -Client, SMS-

Programm, Kalender, Karten, Web-Browser, Kontakte, etc.

Alle Anwendungen sind in Java geschrieben.

Jede Anwendung hat ihre eigene Umgebung: eigener Linux-Prozess eigene Java-VM eindeutige Linux User Id

(kann auch von anderen Anwendungen genutzt werden)

developer.android.com

Page 6: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Der Android SDK Manager

Nach der Installation einer Eclipse-Version mit ADT (Android Developer Tools).

Zur Konfiguration von Android-Versionen, die zur Entwicklung benutzt werden. Start: Windows-> Android SDK

Manager Es können mehrere Versionen

ausgewählt werden.

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 43

Page 7: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Starten einer App im Emulator

Android Virtual Device (AVD) anlegen AVD Manager aufrufen mit Create ein neues

AVD anlegen

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 44

Page 8: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 45

Application Framework

Views: graphische Komponenten zum Aufbau einer Anwendung, z.B. Listen, Textfelder, Knöpfe und auch ein einbettbarer Web-Browser

Content Providers: ermöglichen den Zugriff auf Daten, auch aus anderen Anwendungen

Resource Manager: Zugriff auch Resourcen, die nicht Code sind, z.B. Graphiken

Notification Manager: zur Benachrichtigung des Nutzers über Ereignisse

Activity Manager: organisiert den Lebenszyklus einer Anwendung

Page 9: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 46

Application ComponentsAusführbare Anwendungsteile: Activities: visuelle Komponente

Beispiel: Liste von textuellen Kommentaren Eine Anwendung kann mehrere Activities haben, die sich

gegenseitig benutzen. Eine Activity ist als Start-Activity markiert. Jede Activity hat ein eigenes Fenster, in das sie zeichnet.

Services: nicht sichtbare Komponenten Beispiel: Ein Service, der Musik abspielt

Broadcast Receiver: hört auf Broadcast-Nachrichten Beispiel: Wechsel der Zeitzone, geringer Batteriestand, Aufnahme

eines Fotos, etc. Content Providers: veröffentlicht eine Menge von Daten für

andere Anwendungen Daten sind meist in einer SQLite-Datenbank gespeichert.

Page 10: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 47

Die Android Manifest-DateiAndroidManifest.xml informiert Android über die Komponenten der Anwendung:

Start-Activity

Page 11: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 48

Aktivieren von Komponenten durch Intents

Activities, Services und Broadcast Receivers werden durch asynchrone Nachrichten, sogenannte Intents, aktiviert.

Start einer Activity: Intent erzeugen:

Intent intent = new Intent(this, MyActivity.class)this – Kontextkomponente, von der der Intent erzeugt wird.MyActivity.class – Activity, die aktiviert werden soll

Start der Activity: c.startActivity(intent)c - Kontextkomponente

In der gestarteten Activity:getIntent() liefert den initialen Intent zurück.

Beenden einer Activity: selten, da in andauernder Kommunikation mit dem Nutzer finish() oder finishActivity()

Page 12: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 49

Lebenszyklus einer Activity Eine Activity hat drei mögliche Zustände:

active oder running: auf dem Display zu sehen, Fokus der Ausführung

paused: sichtbar, aber hat nicht den Fokus. Eine andere Activity liegt darüber.

stopped: nicht sichtbar und ohne Fokus, der Zustand und die Daten werden solange gehalten, wie Speicher vorhanden

Zustandswechsel werden durch Methodenaufrufe mitgeteilt: void onCreate(Bundle savedInstanceState)

void onStart() void onRestart() void onResume() void onPause() void onStop() void onDestroy()

Alle Activities müssen onCreate() implementieren.

Diese Methoden sollten zuerst die entsprechende Supermethode aufrufen.

Page 13: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 50

Lebenszyklus einer Activity onCreate(): das normale Setup, Bundle-Objekt übergibt den bisherigen

Zustand, danach direkt onStart() und onResume() onPause(): eine andere Activity wird aktiv, ungesicherte Daten werden

gespeichert onStop(): eine andere Activity wird sichtbar oder Activity wird zerstört,

onPause() wird immer vorher aufgerufen

developer.android.com

Page 14: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 51

Benutzung von Activities

Activities können andere starten, auch wenn sie zu anderen Anwendungen gehören. Beispiel: Eine Activity, die einen Kartenausschnitt anzeigt,

kann in verschiedenen Anwendungen genutzt werden. Zur Nutzung einer Activity einer anderen Anwendung muss

nur ein passender Intent an diese Activity geschickt werden.

Page 15: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 52

Layout graphischer Komponenten Layout-Definition durch

eine XML-Layout Datei. Jedes XML-Element ist

entweder ein View oder ein ViewGroup-Objekt.

Vordefinierte ViewGroup-Objekte: LinearLayout RelativeLayout AbsoluteLayout TableLayout etc.

Layout-Parameter: height, width vordefinierte Werte:

fillParent: füllt Platz des ParentView aus

wrap_content: umhüllt den Inhalt minimal

@+id/… verweist auf ids in der Datei R.java

create_counter.xml

Page 16: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 53

Die Datei R.java

R.java wird aus den Inhalten im Ordner /res generiert und liegt unter /gen.

R.java soll nicht geändert werden. Sie enthält einen Index für alle Ressourcen der

Anwendung. Ressourcen sind z.B. Namen und Ids von graphischen

Elementen.

Diese Klasse kann als Abkürzung für die Referenzierung von Ressourcen genutzt werden.

Page 17: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Debuggen von Android Apps App in Emulator starten Breakpoints im Code setzen In DDMS Perspektive gehen App auf Debug setzen App im Emulator ausführen Zur Debug Perspektive

wechseln Schrittweise ausführen

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 54

Page 18: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 55

Zusammenfassung

Android bietet einen Software-Stack für mobile Geräte, bestehend aus Betriebssystem, Middleware und Kernanwendungen

Android SDK bietet Tools und APIs zur Entwicklung von Anwendungen auf der Android-Plattform

Die graphischen Komponenten folgen einem vorgegebenen Zustandsautomaten. Dadurch behält der Benutzer die maximale Kontrolle über die Anwendungen.

Jede Anwendung läuft in einem eigenen Prozess mit eigener Virtual Machine.

Page 19: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Android-Vertiefung

22.Oktober 2014

Page 20: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 57

Überblick Entwicklung der Benutzeroberfläche

Views Layouts Events Menüs Adapter

Entwicklung einer Zwei-Schichten-Architektur Entwicklungsrichtlinien

Best Practices: generelle und spezielle Richtlinien für mobile Geräte

Page 21: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 58

Views

Views: graphische Komponenten in einer Activity, z.B. Listen, Textfelder, Knöpfe und auch ein einbettbarer Web-Browser

Definition der View-Hierarchie in der Layout-Datei der Activity

aus „android.com“

View-Hierarchie:

Page 22: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Zeichnen einer View

Zeichnen einer View durch Aufruf von setContentView() der enthaltenden Activity Parameter: Wurzel der View-Hierarchie

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 59

CreateCounter.java:

Verweis auf XML-Datei

Page 23: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 60

Layout graphischer Komponentencreate_counter.xml

Layout-Definition durch eine XML-Layout Datei.

Jedes XML-Element ist entweder ein View oder ein ViewGroup-Objekt.

Layouts für ViewGroup-Objekte: LinearLayout RelativeLayout AbsoluteLayout TableLayout GridLayout etc.

Widget: View-Objekt für Benutzerinteraktion Z.B. Button, Checkbox,

Texteingabefeld, Uhr Interaktion über Events

Page 24: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Layout-Gruppen

Gruppieren mehrere Views zu einer ViewGroup. FrameLayout definiert einen leeren Rahmen, der

später durch ein Objekt gefüllt werden kann. LinearLayout bringt alle Kinder in eine Reihe. TableLayout positioniert seine Kinder in Zeilen und

Spalten. Die Tabelle wird durch eine Liste von TableRows aufgebaut. Einzelne Zellen können frei bleiben, aber nicht kombiniert werden.

RelativeLayout überlässt seinen Kinder das Layout. Sie positionieren sich relativ zueinander (links, rechts, über, unter).

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 61

Page 25: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 62

Der Event-Mechanismus

Prinzipielle Idee: Views interagieren über Events miteinander und mit dem Benutzer.

Wenn ein View auf einen Typ von Events hören möchte, meldet er sich als Listener an.

Wenn das Event eintrifft, werden alle Listener benach-richtigt und jeweils eine Callback-Methode ausgeführt.

Views können bereits auf viele Typen von Events hören: z.B. View.onClickListener() View.onTouchListener() View.onKeyListener() Anmeldung des akt. View:

z.B. setOnClickListener() Überschreiben einer

Callback-Methode bei eigenen Views möglich, z.B.: onClick() onKeyDown()

Page 26: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 63

Beispiel: Event HandlingCreateCounter.java:

Page 27: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer 64

Definition eines Menüs Drei Arten von Menüs:

OptionsMenu – durch Drücken von MENU

ContextMenu – ein Kontextmenü

PopupMenu – zum Anzeigen von Daten

Zur Definition von Menüs werden Callback-Methoden überschrieben: onCreateOptionsMenu() onOptionsItemSelected()

Menüeinträge können in einer Layout-Datei definiert werden.

Weitere View-Komponenten werden im Emulator unter ApiDemos erklärt.

Menü mit Icons

Modellgetriebene Entwicklung von mobilen Anwendungen

Page 28: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Weitere Menü-KonzepteCallback-Methoden:

onCreateOptionsMenu() – wird beim Erzeugen einer Activity aufgebaut

onPrepareOptionsMenu() – wird nach dem Drücken des Menu-Knopfs aufgerufen

onOptionsItemSelected() – wird bei Auswahl eines Menüeintrags aufgerufen und behandelt die möglichen Menüaktionen

onCreateContextMenu() - wird zum Erzeugen eines Kontextmenüs aufgerufen (anders als bei onCreatOptionsMenu)

onContextItemSelected() () – wird bei Auswahl eines Menüeintrags aufgerufen und behandelt die möglichen Menüaktionen

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 65

Page 29: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 66

ListView als spezieller AdapterView

Ein ListView ist eine ViewGroup zur Darstellung von Aufzählungen

Die ListView ist ein AdapterView und braucht einen Adapter, um die Daten darzustellen.

Ein AdapterView ist an eine externe Datenquelle gebunden. Zwischen der ListView und der

Datenquelle fließt ein Adapter-Objekt.

Mit einem spezialisierten Array Adapter kann die Darstellung der Listeneinträge angepasst werden.

Page 30: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Beispiel: Ein ListView mit angepasstem Array-Adapter

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 67

Darzustellender Inhalt: Liste mit

ClickCounts

Darstellung eines Eintrags: Darstellung eines ClickCounts

Context: umgebene Activity: ClickConfig

ClickConfig.java:

Erstellung des ListView:

Page 31: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Beispiel: Benutzerauswahl behandeln

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 68

ClickConfig.onCreate():

Ausgewählter Eintrag

Callback-Methode, die nach einem Klick ausgeführt wird

view – der View, der geklickt wurdei - die Position des geklickten Eintragsl – die Id des geklickten Eintrags

Page 32: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 69

Entwicklungsrichtlinien für effizienten Code

Performanz: Schreib keinen unnötigen

Programmcode! kein Code für alle

Eventualitäten Best Practices:

generelle Empfehlungen spezielle Empfehlungen für

mobile Anwendungen

Generelle Best Practices: Benutze Klassen und

Methoden, die schon im SDK vorhanden sind!

Deklariere Methoden, die keine Objektinformation brauchen, als statisch!

Deklariere Felder und Methoden als final, wenn sie nicht überschrieben werden!

Page 33: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 70

Beispiele: Best Practices

Konstanten werden nicht überschrieben und sind von Objekten unabhängig:// Menu item ids

public static final int MENU_ITEM_DELETE = Menu.FIRST;public static final int MENU_ITEM_INSERT = Menu.FIRST + 1;

Methode zur Berechnung des Durchschnitts ist von Objekten unabhängig.public static double mean(int[] p) {

int sum = 0; // sum of all the elements for (int i=0; i<p.length; i++) {

sum += p[i]; } return ((double)sum) / p.length;

}

Aufruf:double averageAttendance =

MyUtils.mean(attendance);

Page 34: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 71

Entwicklungsrichtlinien für effizienten Code (2)

Spezielle Best Practices für mobile Anwendungen: Erzeuge nicht mehr Objekte als

nötig! Verlier keine Daten!

onSaveInstanceState() onPause()

Überlade einzelne Seiten nicht! Entwirf die Benutzeroberfläche

so, dass die Anwendung auf verschiedenartigen Geräten laufen kann.

Nutze Netz und Strom wenig!

Generelle Best Practices: Vermeide doppelten Code!

keine Copy-and-Paste-Programmierung

Vermeide Spaghetti-Code! Vermeide temporäre Felder!

keine Zwischenergebnisse in Objektfeldern

Vermeide Klassen, die ihr Erbe verweigern! Alle geerbten Felder und

Methoden sollen auch in den Unterklassen sinnvoll sein.

Page 35: Einführung in Android - uni-marburg.de · Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 41 Bibliotheken, Runtime und Kernel Android enthält eine Reihe von C/C++-Bibliotheken

Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 72

Zusammenfassung Activities enthalten Views.

Layout in XML-Datei möglichst relatives Layout Views hören auf Events vom Benutzer (Listener-Konzept)

AdapterViews: Sind an Datenquellen angeschlossen Können Daten durch spezielle Adapter speziell darstellen.

Zwei-Schichten-Architektur: Datenhaltung und Oberfläche: Die obere Schicht benutzt die

untere. Die untere Schicht schickt Notifications an die obere. Entwicklungsrichtlinien

generelle für guten Programmierstil spezielle für mobile Geräte, um Zeit und Platz zu sparen