APIs unter Android 3.0

API-Level: 11

Für Entwickler steht die Android 3.0-Plattform (HONEYCOMB) als herunterladbare Komponente für das Android SDK zur Verfügung. Die herunterladbare Plattform umfasst eine Android-Bibliothek, ein System-Image, eine Reihe von Emulator-Skins und mehr. Die herunterladbare Plattform enthält keine externen Bibliotheken.

Für Entwickler steht die Android 3.0-Plattform als herunterladbare Komponente für das Android SDK zur Verfügung. Die herunterladbare Plattform umfasst eine Android-Bibliothek, ein System-Image, eine Reihe von Emulator-Skins und mehr. Wenn du mit der Entwicklung oder dem Testen für Android 3.0 beginnen möchtest, verwende den Android SDK Manager, um die Plattform in dein SDK herunterzuladen.

API-Übersicht

Die folgenden Abschnitte bieten einen technischen Überblick darüber, was für Entwickler in Android 3.0 neu ist, einschließlich der neuen Funktionen und Änderungen der Framework API seit der vorherigen Version.

Fragmente

Ein Fragment ist eine neue Framework-Komponente, mit der Sie verschiedene Elemente einer Aktivität in eigenständige Module aufteilen können, die ihre eigene UI und ihren eigenen Lebenszyklus definieren. Zum Erstellen eines Fragments müssen Sie die Fragment-Klasse erweitern und mehrere Lebenszyklus-Callback-Methoden implementieren, ähnlich wie ein Activity-Objekt. Sie können dann mehrere Fragmente in einer einzigen Aktivität kombinieren, um eine UI mit mehreren Bereichen zu erstellen, in der jeder Bereich seinen eigenen Lebenszyklus und seine Nutzereingaben verwaltet.

Sie können ein Fragment auch ohne Angabe einer UI verwenden. Stattdessen dient es als Worker für die Aktivität, z. B. um den Fortschritt eines Downloads zu verwalten, der nur während der Ausführung der Aktivität erfolgt.

Weitere Anforderungen:

  • Fragmente sind in sich geschlossen und Sie können sie in mehreren Aktivitäten wiederverwenden
  • Sie können Fragmente innerhalb der Aktivität hinzufügen, entfernen, ersetzen und animieren.
  • Sie können einem von der Aktivität verwalteten Back-Stack Fragmente hinzufügen, wobei der Status der Fragmente beibehalten wird, wenn sie sich ändern, und der Nutzer kann rückwärts durch die verschiedenen Status navigieren
  • Wenn Sie alternative Layouts bereitstellen, können Sie Fragmente je nach Bildschirmgröße und -ausrichtung mischen und anpassen.
  • Fragmente haben direkten Zugriff auf ihre Containeraktivität und können Elemente zur Aktionsleiste der Aktivität hinzufügen (siehe nächster Abschnitt).

Um die Fragmente in Ihrer Aktivität zu verwalten, müssen Sie FragmentManager verwenden, das mehrere APIs für die Interaktion mit Fragmenten bietet, z. B. das Suchen von Fragmenten in der Aktivität und das Entfernen von Fragmenten aus dem Back-Stack, um ihren vorherigen Zustand wiederherzustellen.

Wenn du eine Transaktion ausführen möchtest, z. B. ein Fragment hinzufügen oder entfernen, musst du ein FragmentTransaction erstellen. Anschließend können Sie Methoden wie add(), remove() oder replace() aufrufen. Nachdem Sie alle Änderungen angewendet haben, die Sie für die Transaktion vornehmen möchten, müssen Sie commit() aufrufen. Das System wendet die Fragmenttransaktion auf die Aktivität an.

Weitere Informationen zur Verwendung von Fragmenten finden Sie in der Dokumentation zu Fragmenten. In der Anwendung API Demos sind mehrere Beispiele verfügbar.

Aktionsleiste

Die Aktionsleiste ersetzt die herkömmliche Titelleiste oben im Aktivitätsfenster. Sie enthält das Anwendungslogo in der linken Ecke und eine neue Oberfläche für Elemente im Optionsmenü. Darüber hinaus bietet die Aktionsleiste:

  • Fügen Sie Menüelemente direkt in der Aktionsleiste als „Aktionselemente“ hinzu.

    Füge in deiner XML-Deklaration für den Menüpunkt das Attribut android:showAsAction mit dem Wert "ifRoom" hinzu. Wenn genug Platz ist, erscheint der Menüpunkt direkt in der Aktionsleiste. Andernfalls wird das Element im Dreipunkt-Menü platziert, das über das Menüsymbol auf der rechten Seite der Aktionsleiste sichtbar ist.

  • Eine Aufgabe durch ein Widget (z. B. ein Suchfeld) ersetzen und so eine Aktionsansicht erstellen.

    Füge in der XML-Deklaration für den Menüpunkt das Attribut android:actionViewLayout mit einer Layoutressource oder das Attribut android:actionViewClass mit dem Klassennamen eines Widgets hinzu. Außerdem müssen Sie das Attribut android:showAsAction deklarieren, damit das Element in der Aktionsleiste angezeigt wird. Wenn in der Aktionsleiste nicht genügend Platz ist und das Element im Dreipunkt-Menü angezeigt wird, verhält es sich wie ein normaler Menüpunkt. Das Widget wird nicht angezeigt.

  • Dem Anwendungslogo eine Aktion hinzufügen und durch ein benutzerdefiniertes Logo ersetzen

    Dem Anwendungslogo wird automatisch die android.R.id.home-ID zugewiesen, die das System beim Berühren an den onOptionsItemSelected()-Callback Ihrer Aktivität sendet. Antworten Sie einfach auf diese ID in Ihrer Callback-Methode, um eine Aktion auszuführen, z. B. die Startaktivität Ihrer Anwendung aufzurufen.

    Wenn du das Symbol durch ein Logo ersetzen möchtest, gib in der Manifestdatei das App-Logo mit dem Attribut android:logo an und rufe dann setDisplayUseLogoEnabled(true) in deiner Aktivität auf.

  • Navigationspfade hinzufügen, um rückwärts durch den Back-Stack von Fragmenten zu navigieren
  • Fügen Sie Tabs oder eine Drop-down-Liste hinzu, um durch Fragmente zu navigieren
  • Aktionsleiste mit Designs und Hintergründen anpassen

Die Aktionsleiste wird standardmäßig für alle Anwendungen verwendet, die das neue holografische Design verwenden. Dies gilt auch dann als Standard, wenn Sie für android:minSdkVersion oder android:targetSdkVersion den Wert "11" festlegen.

Weitere Informationen zur Aktionsleiste finden Sie in der Dokumentation zur Aktionsleiste. In der Anwendung API Demos sind mehrere Beispiele verfügbar.

Systemzwischenablage

Anwendungen können jetzt Daten (über reinen Text) in die und aus der systemweiten Zwischenablage kopieren und einfügen. Beschnittene Daten können Nur-Text, ein URI oder ein Intent sein.

Durch die Bereitstellung des Systemzugriffs auf die Daten, die der Nutzer über einen Contentanbieter kopieren soll, kann der Nutzer komplexe Inhalte (z. B. ein Bild oder eine Datenstruktur) aus Ihrer Anwendung kopieren und in eine andere Anwendung einfügen, die diesen Inhaltstyp unterstützt.

Um die Zwischenablage zu verwenden, rufen Sie das globale ClipboardManager-Objekt ab. Dazu rufen Sie getSystemService(CLIPBOARD_SERVICE) auf.

Um ein Element in die Zwischenablage zu kopieren, müssen Sie ein neues ClipData-Objekt erstellen, das ein oder mehrere ClipData.Item-Objekte enthält, die jeweils eine einzelne Entität beschreiben. Zum Erstellen eines ClipData-Objekts, das nur ein ClipData.Item enthält, können Sie eine der Hilfsmethoden verwenden, z. B. newPlainText(), newUri() und newIntent(), die jeweils ein ClipData-Objekt zurückgeben, in dem das von Ihnen bereitgestellte ClipData.Item-Objekt vorab geladen ist.

Übergeben Sie das ClipData-Element an setPrimaryClip() für Ihre Instanz von ClipboardManager, um es der Zwischenablage hinzuzufügen.

Anschließend kannst du eine Datei aus der Zwischenablage lesen (um sie einzufügen), indem du getPrimaryClip() im ClipboardManager aufrufst. Der Umgang mit ClipData kann kompliziert sein. Bevor Sie versuchen, den Datentyp einzufügen, sollten Sie sich daher sicher sein, dass Sie den Datentyp in der Zwischenablage wirklich verarbeiten können.

Die Zwischenablage enthält jeweils nur ein abgeschnittenes Datenelement (ein ClipData-Objekt), aber eine ClipData kann mehrere ClipData.Items enthalten.

Weitere Informationen finden Sie in der Dokumentation zum Kopieren und Einfügen. Eine einfache Implementierung von Kopieren und Einfügen finden Sie auch im API Demos-Beispiel und eine vollständigere Implementierung im Note Pad-Beispiel.

Drag-and-Drop

Neue APIs vereinfachen Drag-and-drop-Vorgänge in der Benutzeroberfläche Ihrer Anwendung. Ein Drag-Vorgang ist die Übertragung einer Art von Daten, die in einem ClipData-Objekt enthalten sind, von einem Ort zu einem anderen. Der Start- und Endpunkt für den Drag-Vorgang ist ein View. Daher befinden sich die APIs, die Drag-and-drop-Vorgänge direkt verarbeiten, in der Klasse View.

Ein Drag-and-drop-Vorgang hat einen Lebenszyklus, der durch mehrere Drag-Aktionen definiert ist, die jeweils durch ein DragEvent-Objekt definiert sind, z. B. ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED und ACTION_DROP. Jede Ansicht, die an einem Drag-Vorgang beteiligt werden soll, kann diese Aktionen überwachen.

Um mit dem Ziehen von Inhalten in Ihrer Aktivität zu beginnen, rufen Sie startDrag() auf einem View auf. Geben Sie dabei ein ClipData-Objekt an, das die zu ziehenden Daten darstellt, ein View.DragShadowBuilder für den „Schatten“, den Nutzer beim Ziehen unter ihren Fingern sehen, und eine Object, die Informationen über das Ziehobjekt mit Ansichten teilen kann, die das Objekt empfangen könnten.

Registrieren Sie die Ansicht mit einem OnDragListener, indem Sie setOnDragListener() aufrufen, um ein Drag-Objekt in einem View zu akzeptieren (d. h., Sie erhalten das Drop-down-Menü). Wenn ein Drag-Ereignis in der Ansicht auftritt, ruft das System onDrag() für das OnDragListener auf, das einen DragEvent empfängt, der die Art der Ziehaktion beschreibt (z. B. ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED und ACTION_DROP). Während eines Drag-Vorgangs ruft das System wiederholt onDrag() für die Ansicht unterhalb des Ziehvorgangs auf, um einen Stream von Ziehereignissen zu senden. In der empfangenden Ansicht kann durch Aufrufen von getAction() im DragEvent ermittelt werden, welcher Ereignistyp an onDragEvent() gesendet wurde.

Hinweis:Ein Drag-Ereignis kann zwar ein ClipData-Objekt enthalten, hat aber nichts mit der Systemzwischenablage zu tun. Bei einem Drag-and-drop-Vorgang sollten die Daten niemals in die Systemzwischenablage verschoben werden.

Weitere Informationen finden Sie in der Dokumentation zu Drag-and-drop. Eine Implementierung von Drag-and-drop ist auch in den Anwendungen API Demos und Honeycomb Gallery verfügbar.

App-Widgets

Android 3.0 unterstützt mehrere neue Widget-Klassen für interaktivere App-Widgets auf dem Startbildschirm der Nutzer, darunter GridView, ListView, StackView, ViewFlipper und AdapterViewFlipper.

Außerdem können Sie mit dem neuen RemoteViewsService App-Widgets mit Sammlungen erstellen. Dazu verwenden Sie Widgets wie GridView, ListView und StackView, die von Remotedaten unterstützt werden, z. B. von einem Contentanbieter.

Die Klasse AppWidgetProviderInfo (in XML mit einem <appwidget-provider>-Element definiert) unterstützt auch zwei neue Felder: autoAdvanceViewId und previewImage. Im Feld autoAdvanceViewId können Sie die Ansichts-ID der Unteransicht des App-Widgets angeben, die vom Host des App-Widgets automatisch erweitert werden soll. Im Feld previewImage wird eine Vorschau des App-Widgets angezeigt. Es wird dem Nutzer in der Widget-Auswahl angezeigt. Ist dieses Feld nicht vorhanden, wird das Symbol des App-Widgets für die Vorschau verwendet.

Der Android-Emulator enthält eine App namens „Widget Preview“, mit der Sie ein Vorschaubild für Ihr App-Widget erstellen können, das Sie im Feld previewImage angeben können. Um ein Vorschaubild zu erstellen, starten Sie diese App, wählen Sie das App-Widget für Ihre App aus und legen Sie fest, wie Ihr Vorschaubild angezeigt werden soll. Speichern Sie es anschließend und platzieren Sie es in den Drawable-Ressourcen Ihrer Anwendung.

Eine Implementierung der neuen Funktionen für das App-Widget finden Sie in den Anwendungen StackView App Widget und Weather List Widget.

Benachrichtigungen in der Statusleiste

Die Notification APIs wurden erweitert, um Benachrichtigungen in der Statusleiste mit mehr Inhalten zu unterstützen. Mit der neuen Notification.Builder-Klasse können Sie ganz einfach Notification-Objekte erstellen.

Neue Funktionen:

  • Unterstützung eines großen Symbols in der Benachrichtigung mit setLargeIcon(). Dies geschieht in der Regel für soziale Anwendungen, um das Kontaktbild der Person anzuzeigen, von der die Benachrichtigung stammt, oder für Medien-Apps, um eine Albumminiaturansicht anzuzeigen.
  • Unterstützung benutzerdefinierter Layouts im Ticker der Statusleiste mit setTicker().
  • Unterstützung benutzerdefinierter Benachrichtigungslayouts mit Schaltflächen mit PendingIntents für interaktivere Benachrichtigungs-Widgets. Eine Benachrichtigung kann beispielsweise die Musikwiedergabe steuern, ohne eine Aktivität zu starten.

Contentlader

Neue Framework-APIs ermöglichen das asynchrone Laden von Daten mithilfe der Klasse Loader. Sie können es in Kombination mit UI-Komponenten wie Ansichten und Fragmenten verwenden, um Daten dynamisch aus Worker-Threads zu laden. Die abgeleitete Klasse CursorLoader wurde speziell für Daten entwickelt, die von einem ContentProvider-Element gestützt werden.

Sie müssen lediglich die LoaderCallbacks-Schnittstelle implementieren, um Callbacks zu erhalten, wenn ein neues Ladeprogramm angefordert wird oder sich die Daten geändert haben. Rufen Sie dann initLoader() auf, um das Ladeprogramm für Ihre Aktivität oder Ihr Fragment zu initialisieren.

Weitere Informationen finden Sie in der Dokumentation zu Loadern. In den Beispielen LoaderCursor und LoaderThrottle wird auch Beispielcode mit Loadern angezeigt.

Bluetooth A2DP und Headset-APIs

Android enthält jetzt APIs für Anwendungen, mit denen der Status verbundener Bluetooth-A2DP- und Headset-Profilgeräte geprüft werden kann. Anwendungen können beispielsweise erkennen, wenn ein Bluetooth-Headset zum Musikhören verbunden ist, und den Nutzer gegebenenfalls benachrichtigen. Anwendungen können auch Broadcasts für anbieterspezifische AT-Befehle empfangen und den Nutzer über den Status des verbundenen Geräts informieren, z. B. wenn der Akku des verbundenen Geräts schwach ist.

Sie können das entsprechende BluetoothProfile initialisieren, indem Sie getProfileProxy() mit der Profilkonstanten A2DP oder HEADSET und einem BluetoothProfile.ServiceListener aufrufen, um Callbacks zu erhalten, wenn der Bluetooth-Client verbunden oder getrennt ist.

Animations-Framework

Mit dem neuen flexiblen Animations-Framework können Sie beliebige Eigenschaften eines beliebigen Objekts animieren (View, Drawable, Fragment, Object usw.). Damit können Sie verschiedene Aspekte einer Animation definieren, z. B.:

  • Dauer
  • Wiederholungsmenge und -verhalten
  • Art der Zeitinterpolation
  • Animationen werden zusammen, nacheinander oder nach einer bestimmten Verzögerung abgespielt.
  • Verzögerung für Frameaktualisierung

Sie können diese und andere Animationsaspekte für die standardmäßigen, Gleitkomma- und hexadezimalen Farbwerte eines Objekts definieren. Das heißt, wenn ein Objekt ein Eigenschaftsfeld für einen dieser Typen hat, können Sie seinen Wert im Laufe der Zeit ändern, um sich auf die Animation zu auswirken. Um einen anderen Werttyp zu animieren, teilen Sie dem System mit, wie die Werte für diesen Wert berechnet werden sollen. Dazu implementieren Sie die TypeEvaluator-Schnittstelle.

Es gibt zwei Animatoren, mit denen Sie die Werte einer Eigenschaft animieren können: ValueAnimator und ObjectAnimator. Der ValueAnimator berechnet die Animationswerte, berücksichtigt jedoch nicht das spezifische Objekt oder die Eigenschaft, das bzw. die als Ergebnis animiert wird. Es führt einfach die Berechnungen durch, Sie müssen auf die Aktualisierungen warten und die Daten mit Ihrer eigenen Logik verarbeiten. ObjectAnimator ist eine abgeleitete Klasse von ValueAnimator und ermöglicht es Ihnen, das Objekt und die Eigenschaft zu animieren. Darüber hinaus werden damit alle Animationen ausgeführt. Sie geben also dem ObjectAnimator das zu animierende Objekt, die Eigenschaft des Objekts, die sich im Laufe der Zeit ändert, sowie eine Reihe von Werten, die im Laufe der Zeit auf die Eigenschaft angewendet werden sollen, und starten dann die Animation.

Außerdem aktiviert die Klasse LayoutTransition automatische Übergangsanimationen für Änderungen, die Sie am Aktivitätslayout vornehmen. Um Übergänge für einen Teil des Layouts zu aktivieren, erstellen Sie ein LayoutTransition-Objekt und legen es für ein beliebiges ViewGroup fest, indem Sie setLayoutTransition() aufrufen. Dadurch werden Standardanimationen ausgeführt, wenn Elemente zur Gruppe hinzugefügt oder daraus entfernt werden. Wenn Sie benutzerdefinierte Animationen festlegen möchten, rufen Sie setAnimator() für LayoutTransition auf und geben Sie eine benutzerdefinierte Animator an, z. B. ValueAnimator oder ObjectAnimator (siehe oben).

Weitere Informationen finden Sie in der Dokumentation zur Property-Animation. Sie können sich auch mehrere Beispiele für die Verwendung der Animations-APIs in der Anwendung API Demos ansehen.

Erweitertes UI-Framework

  • Multiple-Choice-Auswahl für ListView und GridView

    Mit dem neuen CHOICE_MODE_MULTIPLE_MODAL-Modus für setChoiceMode() können Nutzer mehrere Elemente aus ListView oder GridView auswählen. Bei Verwendung in Verbindung mit der Aktionsleiste können Nutzer mehrere Elemente auswählen und dann die auszuführende Aktion aus einer Liste von Optionen in der Aktionsleiste auswählen. Diese wurde zu einem Multi-Choice-Aktionsmodus.

    Um die Multiple-Choice-Auswahl zu aktivieren, rufen Sie setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL) auf und registrieren Sie eine MultiChoiceModeListener bei setMultiChoiceModeListener().

    Wenn der Nutzer lange auf ein Element drückt, wechselt die Aktionsleiste in den Aktionsmodus mit mehreren Auswahlmöglichkeiten. Das System benachrichtigt MultiChoiceModeListener, wenn Elemente durch Aufrufen von onItemCheckedStateChanged() ausgewählt werden.

    Ein Beispiel für die Multiple-Choice-Auswahl finden Sie in der Klasse List15.java in der API Demos-Beispielanwendung.

  • Neue APIs zum Transformieren von Ansichten

    Mit neuen APIs kannst du ganz einfach 2D- und 3D-Transformationen auf Ansichten in deinem Aktivitätslayout anwenden. Neue Transformationen werden mit einer Reihe von Objekteigenschaften möglich, die unter anderem die Layoutposition, Ausrichtung und Transparenz der Ansicht definieren.

    Neue Methoden zum Festlegen der Ansichtseigenschaften sind unter anderem setAlpha(), setBottom(), setLeft(), setRight(), setBottom(), setPivotX(), setPivotY(), setRotationX(), setRotationY(), setScaleX(), setScaleY() und setAlpha().

    Einige Methoden haben auch ein entsprechendes XML-Attribut, das Sie in der Layoutdatei angeben können, um eine Standardtransformation anzuwenden. Verfügbare Attribute sind: translationX, translationY, rotation, rotationX, rotationY, scaleX, scaleY, transformPivotX, transformPivotY und alpha.

    Wenn Sie einige dieser neuen Ansichtseigenschaften in Kombination mit dem neuen Animations-Framework (siehe oben) verwenden, können Sie Ihre Ansichten ganz einfach aufwendige Animationen anwenden. Wenn Sie beispielsweise eine Ansicht um ihre y-Achse drehen möchten, geben Sie für ObjectAnimator den View, die Eigenschaft "rotationY" und die Start- und Endwerte an:

    Kotlin

    ObjectAnimator.ofFloat(myView, "rotationY", 0f, 360f).apply {
        duration = 2000
        start()
    }
    

    Java

    ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "rotationY", 0, 360);
    animator.setDuration(2000);
    animator.start();
    
  • Neue holografische Designs

    Die standardmäßigen System-Widgets und das Gesamtdesign wurden neu gestaltet und enthalten ein neues holografisches Design für die Benutzeroberfläche. Das System wendet das neue Design nach dem Standardsystem Stil und Design an.

    Für jede Anwendung, die auf die Android 3.0-Plattform ausgerichtet ist, indem entweder der Wert android:minSdkVersion oder android:targetSdkVersion auf "11" gesetzt wird, wird das holografische Design standardmäßig übernommen. Wenn Ihre Anwendung jedoch auch ein eigenes Design anwendet, überschreibt dieses das holografische Design, sofern Sie die Stile nicht so aktualisieren, dass sie das holografische Design übernehmen.

    Wenn Sie das holografische Design auf einzelne Aktivitäten anwenden oder in Ihre eigenen Themendefinitionen übernehmen möchten, können Sie eines der neuen Theme.Holo-Designs verwenden. Wenn Ihre App mit Android-Versionen unter 3.0 kompatibel ist und benutzerdefinierte Designs anwendet, sollten Sie ein Design basierend auf der Plattformversion auswählen.

  • Neue Widgets
    • AdapterViewAnimator

      Basisklasse für ein AdapterView, das Animationen ausführt, wenn zwischen Ansichten gewechselt wird.

    • AdapterViewFlipper

      Einfache ViewAnimator, die zwischen zwei oder mehr Ansichten animiert wird, die ihm hinzugefügt wurden. Es wird jeweils nur ein Kind angezeigt. Auf Anforderung kann in regelmäßigen Abständen automatisch zwischen den einzelnen untergeordneten Elementen gewechselt werden.

    • CalendarView

      Nutzer können ein Datum aus einem Kalender auswählen, indem sie auf das Datum tippen, und im Kalender das gewünschte Datum auswählen. Sie können den Zeitraum konfigurieren, der im Widget verfügbar ist.

    • ListPopupWindow

      Verankert sich in einer Hostansicht und zeigt eine Liste mit Auswahlmöglichkeiten an, z. B. für eine Liste mit Vorschlägen bei der Eingabe in eine EditText-Ansicht.

    • NumberPicker

      Der Nutzer kann eine Zahl aus einem vordefinierten Bereich auswählen. Das Widget zeigt ein Eingabefeld sowie die Auf- und Ab-Tasten zur Auswahl einer Zahl an. Durch Tippen auf das Eingabefeld kann der Nutzer durch die Werte scrollen oder den aktuellen Wert durch erneutes Tippen direkt bearbeiten. Außerdem können Sie damit Strings Positionen zuordnen, sodass statt der Indexposition der entsprechende String angezeigt wird.

    • PopupMenu

      Zeigt ein Menu in einem modalen Pop-up-Fenster an, das mit einer Ansicht verankert ist. Das Pop-up-Fenster wird unter der Ankeransicht angezeigt, wenn genügend Platz ist, bzw. darüber, wenn nicht. Wenn der IME (Softtastatur) sichtbar ist, überschneidet sich das Pop-up-Fenster nicht mit dem IME, bis der Nutzer das Menü berührt.

    • SearchView

      Stellt ein Suchfeld bereit, das Sie so konfigurieren können, dass Suchanfragen an eine bestimmte Aktivität gesendet und Suchvorschläge angezeigt werden (wie beim herkömmlichen Suchdialogfeld). Dieses Widget eignet sich besonders, um ein Such-Widget in der Aktionsleiste anzubieten. Weitere Informationen finden Sie unter Suchoberfläche erstellen.

    • StackView

      Eine Ansicht, bei der die untergeordneten Elemente in einem 3D-Stapel angezeigt werden und Nutzer wie ein Roolodex durch Ansichten wischen können.

Grafik

  • Hardwarebeschleunigte 2D-Grafik

    Du kannst jetzt den OpenGL-Renderer für deine App aktivieren. Lege dazu android:hardwareAccelerated="true" im <application>-Element deines Manifestelements oder für einzelne <activity>-Elemente fest.

    Dieses Flag unterstützt Anwendungen, da sie schneller zeichnen können. Das Ergebnis sind flüssigere Animationen, flüssigeres Scrollen sowie insgesamt eine bessere Leistung und Reaktion auf Nutzerinteraktionen.

  • Unterstützung für Hardware- und Softwareschichten ansehen

    Standardmäßig ist für einen View keine Ebene angegeben. Sie können mithilfe von setLayerType() oder dem Attribut layerType angeben, dass die Ansicht entweder durch eine Hardware- oder Softwareebene gestützt werden soll, die durch die Werte LAYER_TYPE_HARDWARE und LAYER_TYPE_SOFTWARE angegeben wird.

    Eine Hardwareschicht wird durch eine hardwarespezifische Textur (in der Regel Frame Buffer Objects oder FBO auf OpenGL-Hardware) gestützt und sorgt dafür, dass die Ansicht über die Hardware-Rendering-Pipeline von Android gerendert wird, wenn die Hardwarebeschleunigung für die Ansichtshierarchie aktiviert ist. Wenn die Hardwarebeschleunigung deaktiviert ist, verhalten sich Hardwareschichten genau wie Softwareschichten.

    Eine Softwareebene wird von einer Bitmap unterstützt und bewirkt, dass die Ansicht über die Software-Rendering-Pipeline von Android gerendert wird, selbst wenn die Hardwarebeschleunigung aktiviert ist. Softwareebenen sollten vermieden werden, wenn der betroffene Ansichtsstruktur häufig aktualisiert wird. Bei jeder Aktualisierung muss die Softwareschicht neu gerendert werden, was möglicherweise langsam sein kann.

    Weitere Informationen finden Sie in der Dokumentation zu LAYER_TYPE_HARDWARE und LAYER_TYPE_SOFTWARE.

  • Renderscript 3D-Grafik-Engine

    Renderscript ist ein 3D-Laufzeit-Framework, das sowohl eine API zum Erstellen von 3D-Szenen als auch eine spezielle, plattformunabhängige Shader-Sprache für maximale Leistung bietet. Mit Renderscript lassen sich Grafikvorgänge und Datenverarbeitung beschleunigen. Renderscript ist ideal, um leistungsstarke 3D-Effekte für Anwendungen, Hintergründe, Karussells und mehr zu erstellen.

    Weitere Informationen finden Sie in der Dokumentation 3D-Rendering und 3D-Berechnung mit Renderscript.

Medien

  • Video im Zeitraffer

    Camcorder-APIs unterstützen jetzt die Aufzeichnung von Videos im Zeitraffer. Mit setCaptureRate() wird die Häufigkeit festgelegt, mit der Frames erfasst werden sollen.

  • Texturunterstützung für Bildstreams

    Mit der neuen SurfaceTexture können Sie einen Bildstream als OpenGL ES-Textur erfassen. Wenn Sie setPreviewTexture() für die Camera-Instanz aufrufen, können Sie die SurfaceTexture angeben, auf der die Videowiedergabe oder Vorschau-Frames von der Kamera gezeichnet werden sollen.

  • HTTP-Livestreaming

    Anwendungen können jetzt eine M3U-Playlist-URL an das Medien-Framework übergeben, um eine HTTP-Live-Streaming-Sitzung zu starten. Das Medien-Framework unterstützt die meisten der HTTP-Live-Streaming-Spezifikationen, einschließlich der adaptiven Bitrate. Weitere Informationen finden Sie im Dokument Unterstützte Medienformate.

  • EXIF-Daten

    ExifInterface enthält neue Felder für die Blende, den ISO-Wert und die Belichtungszeit.

  • Camcorder-Profile

    Mit der neuen hasProfile()-Methode und mehreren Videoqualitätsprofilen (z. B. QUALITY_1080P, QUALITY_720P und QUALITY_CIF) kannst du die Qualitätsoptionen für den Camcorder festlegen.

  • Dateiübertragung digitaler Medien

    Die Plattform unterstützt das Media/Picture Transfer Protocol (MTP/PTP) über USB, mit dem Nutzer Mediendateien aller Art zwischen Geräten auf einen Hostcomputer übertragen können. Entwickler können auf dieser Unterstützung aufbauen und Anwendungen erstellen, mit denen Nutzer Rich Media-Dateien erstellen oder verwalten können, die sie dann auf andere Geräte übertragen oder freigeben möchten.

  • Digitale Rechteverwaltung

    Neues erweiterbares DRM-Framework (Digital Rights Management) zur Überprüfung und Durchsetzung digitaler Rechte Sie ist in zwei Architekturebenen implementiert:

    • Eine DRM-Framework-API, die für Anwendungen verfügbar ist und über die Dalvik-VM für Standardanwendungen ausgeführt wird.
    • Ein nativer DRM-Manager, der die Framework-API implementiert und eine Schnittstelle für DRM-Plug-ins bereitstellt, über die Rechteverwaltung und -entschlüsselung für verschiedene DRM-Schemata abgewickelt werden können.

    Anwendungsentwicklern bietet das Framework eine abstrakte, einheitliche API, die die Verwaltung geschützter Inhalte vereinfacht. Die API verbirgt die Komplexität von DRM-Vorgängen und ermöglicht einen konsistenten Betriebsmodus für geschützte und ungeschützte Inhalte sowie für eine Vielzahl von DRM-Schemas.

    Für Gerätehersteller, Rechteinhaber und Internetanbieter digitaler Medien bietet die Plug-in-API des DRM-Frameworks die Möglichkeit, ein DRM-Schema ihrer Wahl in das Android-System zu integrieren und so den Schutz von Inhalten sicher zu erzwingen.

    Die Vorabversion enthält keine nativen DRM-Plug-ins zur Prüfung und Durchsetzung digitaler Rechte. Gerätehersteller können jedoch DRM-Plug-ins mit ihren Geräten ausliefern.

    Du findest alle DRM-APIs im android.drm-Paket.

Tastaturunterstützung

  • Unterstützung für Steuerungs-, Meta-, Feststell-, Num Lock- und Scroll Lock-Modifikatoren. Weitere Informationen finden Sie unter META_CTRL_ON und in den zugehörigen Feldern.
  • Unterstützung für vollständige Desktoptastaturen, einschließlich Unterstützung für Tasten wie Esc, Pos1, Ende, Entf und andere. Sie können feststellen, ob Schlüsselereignisse von einer vollständigen Tastatur stammen. Fragen Sie dazu getKeyboardType() ab und suchen Sie nach KeyCharacterMap.FULL.
  • TextView unterstützt jetzt tastaturbasiertes Ausschneiden, Kopieren, Einfügen und Auswählen mit den Tastenkombinationen Strg + X, Strg + C, Strg + V und Strg + A. Außerdem unterstützt sie die Bild-auf-/Bild-ab-Taste, Pos1/Ende und die tastaturbasierte Textauswahl.
  • Mit KeyEvent werden mehrere neue Methoden hinzugefügt, mit denen der Status des Schlüsselmodifizierers korrekt und konsistent geprüft werden kann. Siehe hasModifiers(int), hasNoModifiers(), metaStateHasModifiers(), metaStateHasNoModifiers().
  • In Anwendungen können benutzerdefinierte Tastenkombinationen implementiert werden, indem abgeleitete Klassen von Activity, Dialog oder View abgeleitet und onKeyShortcut() implementiert werden. Das Framework ruft diese Methode auf, wenn ein Schlüssel mit einem Kontrollschlüssel kombiniert wird. Wenn Sie ein Optionsmenü erstellen, können Sie Tastenkombinationen registrieren. Legen Sie dazu entweder das Attribut android:alphabeticShortcut oder android:numericShortcut für jedes <item>-Element oder setShortcut() fest.
  • Android 3.0 enthält eine neue virtuelle Tastatur mit der ID KeyCharacterMap.VIRTUAL_KEYBOARD. Die virtuelle Tastatur hat eine US-amerikanische Tastaturbelegung im Desktopstil, die sich zum Zusammenführen von Schlüsselereignissen zum Testen von Eingaben eignet.

Touch-Ereignisse aufteilen

Bisher konnten Touch-Ereignisse nur in einer einzigen Ansicht gleichzeitig akzeptiert werden. In Android 3.0 wird die Aufteilung von Touch-Ereignissen über Ansichten und sogar Fenster unterstützt, sodass verschiedene Ansichten gleichzeitige Touch-Ereignisse akzeptieren können.

Geteilte Touch-Ereignisse sind standardmäßig aktiviert, wenn eine App auf Android 3.0 ausgerichtet ist. Das ist der Fall, wenn die Anwendung entweder den Wert des Attributs android:minSdkVersion oder android:targetSdkVersion auf "11" gesetzt hat.

Mit den folgenden Eigenschaften können Sie jedoch geteilte Touch-Ereignisse über Ansichten in bestimmten Ansichtsgruppen und über Fenster hinweg deaktivieren.

  • Mit dem Attribut android:splitMotionEvents für Ansichtsgruppen können Sie geteilte Touch-Ereignisse deaktivieren, die zwischen untergeordneten Ansichten in einem Layout auftreten. Beispiel:
    <LinearLayout android:splitMotionEvents="false" ... >
        ...
    </LinearLayout>
    

    Auf diese Weise können untergeordnete Ansichten im linearen Layout keine Touch-Ereignisse aufteilen. Es kann jeweils nur eine Ansicht Touch-Ereignisse empfangen.

  • Mit der Stileigenschaft android:windowEnableSplitTouch können Sie geteilte Touch-Ereignisse über Fenster hinweg deaktivieren, indem Sie sie auf ein Design für die Aktivität oder die gesamte App anwenden. Beispiel:
    <style name="NoSplitMotionEvents" parent="android:Theme.Holo">
        <item name="android:windowEnableSplitTouch">false</item>
        ...
    </style>
    

    Wenn dieses Design auf ein <activity> oder <application> angewendet wird, werden nur Touch-Ereignisse im aktuellen Aktivitätsfenster akzeptiert. Wenn Sie beispielsweise die Aufteilung von Touch-Ereignissen über Fenster hinweg deaktivieren, kann die Systemleiste keine Touch-Ereignisse gleichzeitig mit der Aktivität empfangen. Dies hat keinen Einfluss darauf, ob Touchereignisse in Ansichten innerhalb der Aktivität aufgeteilt werden können. Standardmäßig können Touchereignisse weiterhin auf verschiedene Ansichten aufgeteilt werden.

    Weitere Informationen zum Erstellen eines Designs finden Sie unter Stile und Designs anwenden.

WebKit

  • Neue WebViewFragment-Klasse zum Erstellen eines Fragments, das aus einer WebView besteht.
  • Neue WebSettings-Methoden:
    • Mit setDisplayZoomControls() können Sie die Zoomsteuerelemente auf dem Bildschirm ausblenden und dem Nutzer gleichzeitig weiterhin die Möglichkeit bieten, mit Fingergesten zu zoomen. Für setBuiltInZoomControls() muss die Einstellung true festgelegt werden.
    • Mit der neuen WebSettings-Methode setEnableSmoothTransition() können Sie beim Schwenken und Zoomen unterbrechungsfreie Übergänge aktivieren. Wenn diese Option aktiviert ist, wählt WebView eine Lösung zur Leistungsmaximierung aus (z. B. wird der Inhalt von WebView während der Umstellung möglicherweise nicht aktualisiert).
  • Neue WebView-Methoden:
    • onPause()-Callback, um alle Verarbeitungen zu pausieren, die mit WebView verknüpft sind, wenn sie ausgeblendet wird. Dies ist nützlich, um unnötigen CPU- oder Netzwerkverkehr zu reduzieren, wenn das WebView nicht im Vordergrund ausgeführt wird.
    • onResume()-Callback, um die Verarbeitung der WebView fortzusetzen, die während onPause() pausiert wurde.
    • Mit saveWebArchive() kannst du die aktuelle Ansicht als Webarchiv auf dem Gerät speichern.
    • showFindDialog() initiiert eine Textsuche in der aktuellen Ansicht.

Browser

Der Browser bietet die folgenden Funktionen zur Unterstützung von Webanwendungen:

  • Medienaufnahme

    Wie in der Spezifikation HTML Media Capture definiert, ermöglicht der Browser den Zugriff von Webanwendungen auf die Audio-, Bild- und Videoaufnahmefunktionen des Geräts. Der folgende HTML-Code enthält beispielsweise eine Eingabe für den Nutzer, um ein Foto zum Hochladen aufzunehmen:

    <input type="file" accept="image/*;capture=camera" />
    

    Wenn der Nutzer den Parameter capture=camera ausschließt, kann er entweder ein neues Bild mit der Kamera aufnehmen oder eins auf dem Gerät auswählen, z. B. in der Galerie App.

  • Geräteausrichtung

    Wie in der Spezifikation für Geräteausrichtungsereignisse definiert, ermöglicht der Browser, dass Webanwendungen auf DOM-Ereignisse warten, die Informationen über die physische Ausrichtung und Bewegung des Geräts liefern.

    Die Geräteausrichtung wird mit den x-, y- und z-Achsen in Grad und die Bewegung mit Beschleunigungs- und Rotationsrate ausgedrückt. Eine Webseite kann für Ausrichtungsereignisse registriert werden, indem window.addEventListener mit dem Ereignistyp "deviceorientation" aufgerufen wird. Für Bewegungsereignisse wird der Ereignistyp "devicemotion" registriert.

  • CSS-3D-Transformationen

    Gemäß der Definition in der Spezifikation CSS 3D Transform Module können von CSS gerenderte Elemente im Browser in drei Dimensionen umgewandelt werden.

JSON-Dienstprogramme

Mit den neuen Klassen JsonReader und JsonWriter können Sie JSON-Streams lesen und schreiben. Die neuen APIs ergänzen die org.json-Klassen, mit denen ein Dokument im Speicher bearbeitet wird.

Sie können eine Instanz von JsonReader erstellen, indem Sie die zugehörige Konstruktormethode aufrufen und das InputStreamReader übergeben, das den JSON-String übergibt. Beginnen Sie dann mit dem Lesen eines Objekts, indem Sie beginObject() aufrufen, einen Schlüsselnamen mit nextName() lesen und den Wert mit den Methoden des Typs lesen, z. B. nextString() und nextInt(). Fahren Sie dann fort, solange hasNext() wahr ist.

Sie können eine Instanz von JsonWriter erstellen, indem Sie deren Konstruktor aufrufen und den entsprechenden OutputStreamWriter-Wert übergeben. Schreiben Sie dann die JSON-Daten ähnlich wie beim Lesegerät, indem Sie name() verwenden, um einen Attributnamen und eine geeignete value()-Methode, um den entsprechenden Wert hinzuzufügen.

Diese Klassen sind standardmäßig strikt. Die Methode setLenient() in jeder Klasse konfiguriert sie als liberaler, was akzeptiert wird. Dieser weniger umfassende Parser ist auch mit dem Standardparser von org.json kompatibel.

Neue Featurekonstanten

Mit dem Manfest-Element <uses-feature> sollten Sie externen Entitäten (z. B. Google Play) die Hardware- und Softwarefunktionen mitteilen, von denen Ihre Anwendung abhängt. In dieser Version fügt Android die folgenden neuen Konstanten hinzu, die Anwendungen mit diesem Element deklarieren können:

  • "android.hardware.faketouch"

    Wenn dies deklariert wird, bedeutet dies, dass die App mit einem Gerät kompatibel ist, das einen emulierten Touchscreen (oder einen besseren Bildschirm) bietet. Ein Gerät mit einem emulierten Touchscreen verfügt über ein Nutzereingabesystem, das einen Teil der Touchscreen-Funktionen emulieren kann. Ein Beispiel für ein solches Eingabesystem ist eine Maus oder Fernbedienung, die einen Cursor auf dem Bildschirm steuert. Solche Eingabesysteme unterstützen grundlegende Touch-Ereignisse wie das Klicken nach unten, das Klicken nach oben und das Ziehen. Komplexere Eingabetypen wie Gesten, Flings usw. können auf Fake-Touch-Geräten jedoch schwieriger oder unmöglich sein. Multi-Touch-Gesten sind definitiv nicht möglich.

    Wenn Ihre App keine komplizierten Touch-Gesten erfordert und Sie nicht möchten, dass Ihre App aus Geräten mit emuliertem Touchscreen gefiltert wird, sollten Sie "android.hardware.faketouch" mit einem <uses-feature>-Element deklarieren. Auf diese Weise ist Ihre Anwendung für die meisten Gerätetypen verfügbar, einschließlich solcher, die nur eine emulierte Touchscreen-Eingabe bieten.

    Alle Geräte mit Touchscreen unterstützen auch "android.hardware.faketouch", da Touchscreen-Funktionen eine Obermenge von Faketouch-Funktionen sind. Wenn Sie keinen Touchscreen benötigen, sollten Sie daher ein <uses-feature>-Element für Faketouch hinzufügen.

Neue Berechtigungen

  • "android.permission.BIND_REMOTEVIEWS"

    Dies muss im Manifestelement <service> für eine Implementierung von RemoteViewsService als erforderliche Berechtigung deklariert werden. Wenn Sie beispielsweise ein App-Widget erstellen, in dem eine Sammlungsansicht mit RemoteViewsService ausgefüllt wird, kann der Manifesteintrag so aussehen:

    <service android:name=".widget.WidgetService"
        android:exported="false"
        android:permission="android.permission.BIND_REMOTEVIEWS" />
    

Neue Plattformtechnologien

  • Speicher
    • ext4-Unterstützung des Dateisystems zur Aktivierung des integrierten eMMC-Speichers
    • FUSE-Dateisystem zur Unterstützung von MTP-Geräten.
    • Unterstützung des USB-Hostmodus zur Unterstützung von Tastaturen und USB-Hubs.
    • Unterstützung für MTP/PTP
  • Linux-Kernel
    • Upgrade auf 2.6.36 durchgeführt
  • Dalvik-VM
    • Neuer Code zur Unterstützung und Optimierung von SMP
    • Verschiedene Verbesserungen der JIT-Infrastruktur
    • Verbesserungen bei der automatischen Speicherbereinigung:
      • Für SMP abgestimmt
      • Unterstützung größerer Heap-Größen
      • Einheitliche Verarbeitung von Bitmaps und Bytezwischenspeichern
  • Dalvik Core Libraries
    • Neue, viel schnellere Implementierung von NIO (moderne E/A-Bibliothek)
    • Verbesserte Ausnahmemeldungen
    • Fehlerfreiheit und Leistungskorrekturen im gesamten Verlauf

Bericht zu API-Unterschieden

Eine detaillierte Ansicht aller API-Änderungen in Android 3.0 (API-Level 11) finden Sie im Bericht zu API-Unterschieden.

API-Ebene

Die Plattform Android 3.0 stellt eine aktualisierte Version der Framework API bereit. Der Android 3.0 API wird eine Ganzzahl-ID (11) zugewiesen, die im System selbst gespeichert ist. Mit dieser Kennung (API-Ebene) kann das System vor der Installation korrekt feststellen, ob eine App mit dem System kompatibel ist.

Um in Android 3.0 eingeführte APIs in Ihrer App zu verwenden, müssen Sie die App mithilfe der Android-Bibliothek kompilieren, die auf der Android 3.0 SDK-Plattform enthalten ist. Je nach deinen Anforderungen musst du dem <uses-sdk>-Element im Manifest der Anwendung möglicherweise auch ein android:minSdkVersion="11"-Attribut hinzufügen. Wenn Ihre App nur für die Ausführung unter Android 2.3 und höher entwickelt wurde, verhindert die Deklaration des Attributs, dass die App auf früheren Versionen der Plattform installiert wird.

Weitere Informationen finden Sie unter Was ist das API-Level?