APIs unter Android 3.1

API-Level: 12

Für Entwickler steht die Android 3.1-Plattform (HONEYCOMB_MR1) 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.1-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 Tests für Android 3.1 beginnen möchtest, lade die Plattform mit dem Android SDK Manager in dein SDK herunter.

API-Übersicht

Die folgenden Abschnitte bieten einen technischen Überblick über die Neuerungen für Entwickler in Android 3.1, einschließlich der neuen Funktionen und Änderungen der Framework API seit der vorherigen Version.

USB-APIs

Mit Android 3.1 werden leistungsstarke neue APIs zur Integration verbundener Peripheriegeräte in Anwendungen eingeführt, die auf der Plattform ausgeführt werden. Die APIs basieren auf einem USB-Stack (Universal Serial Bus) und den in die Plattform integrierten Diensten, einschließlich Unterstützung für USB-Host- und Geräteinteraktionen. Mit den APIs können Entwickler Anwendungen erstellen, die eine Vielzahl von über USB verbundenen Gerätetypen erkennen, mit ihnen kommunizieren und diese verwalten können.

Der Stack und die APIs unterscheiden zwei grundlegende Arten von USB-Hardware, je nachdem, ob das Android-Gerät als Host oder die externe Hardware als Host fungiert:

  • Ein USB-Gerät ist eine verbundene Hardware, die darauf angewiesen ist, dass das Android-Gerät als Host dient. Die meisten Eingabegeräte, Mäuse und Joysticks sind beispielsweise USB-Geräte, ebenso viele Kameras, Hubs usw.
  • Ein USB-Zubehör ist ein verbundenes Hardwareelement, das über einen USB-Host-Controller verfügt, Strom liefert und für die Kommunikation mit Android-Mobilgeräten über USB vorgesehen ist. Eine Vielzahl von Peripheriegeräten kann als Zubehör verbunden werden, von Roboter-Controllern über Musikgeräte bis hin zu Heimtrainern.

Bei beiden Typen – USB-Geräten und USB-Zubehör – unterstützen die USB APIs der Plattform die Erkennung durch Intent-Übertragung, wenn sie hinzugefügt oder getrennt werden, sowie über Standardschnittstellen, Endpunkte und Übertragungsmodi (Steuerung, Bulk und Unterbrechung).

Die USB APIs sind im Paket android.hardware.usb verfügbar. Die zentrale Klasse ist UsbManager, die Hilfsmethoden zur Identifizierung und Kommunikation sowohl mit USB-Geräten als auch mit USB-Zubehör bietet. Anwendungen können eine Instanz von UsbManager abrufen und dann die Liste der verbundenen Geräte oder Zubehörteile abfragen und dann mit ihnen kommunizieren oder sie verwalten. UsbManager deklariert auch Intent-Aktionen, die vom System gesendet werden, um informiert zu werden, wenn ein USB-Gerät oder Zubehör verbunden oder getrennt wird.

Weitere Klassen:

  • UsbDevice, eine Klasse, die externe Hardware darstellt, die als USB-Gerät verbunden ist (wobei das Android-Gerät als Host fungiert).
  • UsbAccessory für die externe Hardware, die als USB-Host angeschlossen ist (wobei das Android-Gerät als USB-Gerät fungiert).
  • UsbInterface und UsbEndpoint, die Zugriff auf standardmäßige USB-Schnittstellen und -Endpunkte für ein Gerät bieten.
  • UsbDeviceConnection und UsbRequest zum synchronen und asynchronen Senden und Empfangen von Daten sowie Steuernachrichten an oder von einem USB-Gerät.
  • UsbConstants für Konstanten zum Deklarieren von Endpunkttypen, Geräteklassen usw.

Obwohl der USB-Stack in die Plattform integriert ist, wird die tatsächliche Unterstützung für den USB-Hostmodus und das Öffnen von Zubehör auf bestimmten Geräten von den jeweiligen Herstellern bestimmt. Besonders der Hostmodus erfordert eine geeignete USB-Controller-Hardware im Android-Gerät.

Darüber hinaus können Entwickler einen Filter bei Google Play anfordern, damit ihre Apps nicht für Nutzer verfügbar sind, deren Geräte keine geeignete USB-Unterstützung bieten. Um eine Filterung anzufordern, fügen Sie dem Anwendungsmanifest eines oder beide der folgenden Elemente hinzu:

  • Wenn die Anwendung nur für Geräte sichtbar sein soll, die den USB-Hostmodus (Verbindung von USB-Geräten) unterstützen, deklarieren Sie dieses Element:

    <uses-feature android:name="android.hardware.usb.host" android:required="true">

  • Wenn die Anwendung nur für Geräte sichtbar sein soll, die USB-Zubehör unterstützen (Verbindung von USB-Hosts), deklarieren Sie dieses Element:

    <uses-feature android:name="android.hardware.usb.accessory" android:required="true">

Umfassende Informationen zur Entwicklung von Anwendungen, die mit USB-Zubehör interagieren, findest du in der Entwicklerdokumentation.

Beispielanwendungen, die die USB-Host-API verwenden, finden Sie unter ADB Test und Missile Launcher.

MTP/PTP-API

Android 3.1 stellt eine neue MTP-API zur Verfügung, über die Anwendungen direkt mit verbundenen Kameras und anderen PTP-Geräten interagieren können. Mit der neuen API kann eine Anwendung ganz einfach Benachrichtigungen empfangen, wenn Geräte angehängt oder entfernt werden, Dateien und Speicher auf diesen Geräten verwalten sowie Dateien und Metadaten an und von ihnen übertragen. Die MTP API implementiert die PTP (Picture Transfer Protocol)-Teilmenge der MTP-Spezifikation (Media Transfer Protocol).

Die MTP API ist im Paket android.mtp verfügbar und bietet folgende Klassen:

  • Der MtpDevice kapselt ein MTP-Gerät, das über den USB-Hostbus verbunden ist. Eine Anwendung kann ein Objekt dieses Typs instanziieren und dann mithilfe seiner Methoden Informationen über das Gerät und die darauf gespeicherten Objekte abrufen sowie die Verbindung öffnen und Daten übertragen. Dazu gehören:
    • getObjectHandles() gibt eine Liste der Handles für alle Objekte auf dem Gerät zurück, die einem bestimmten Format und übergeordneten Element entsprechen. Zum Abrufen von Informationen zu einem Objekt kann eine Anwendung einen Handle an getObjectInfo() übergeben.
    • Mit importFile() kann eine Anwendung Daten für ein Objekt in eine Datei in einem externen Speicher kopieren. Dieser Aufruf kann je nach Größe der Daten und Geschwindigkeit der Geräte für einen beliebigen Zeitraum blockiert werden. Er sollte daher aus einem speziellen Thread erfolgen.
    • Mit open() kann eine Anwendung ein verbundenes MTP/PTP-Gerät öffnen.
    • getThumbnail() gibt die Miniaturansicht des Objekts als Byte-Array zurück.
  • MtpStorageInfo enthält Informationen zu einer Speichereinheit auf einem MTP-Gerät, die dem in Abschnitt 5.2.2 der MTP-Spezifikation beschriebenen StorageInfo-Dataset entsprechen. Mit Methoden in der Klasse kann eine Anwendung den Beschreibungsstring, den freien Speicherplatz, die maximale Speicherkapazität, die Speicher-ID und die Volume-ID einer Speichereinheit abrufen.
  • MtpDeviceInfo enthält Informationen zu einem MTP-Gerät, das dem in Abschnitt 5.1.1 der MTP-Spezifikation beschriebenen DeviceInfo-Dataset entspricht. Mit Methoden in der Klasse können Anwendungen Hersteller, Modell, Seriennummer und Version eines Geräts abrufen.
  • MtpObjectInfo enthält Informationen zu einem auf einem MTP-Gerät gespeicherten Objekt, das dem in Abschnitt 5.3.1 der MTP-Spezifikation beschriebenen ObjectInfo-Dataset entspricht. Mit Methoden in der Klasse können Anwendungen Objektgröße, Datenformat, Verknüpfungstyp, Erstellungsdatum und Miniaturansichtsinformationen eines Objekts abrufen.
  • MtpConstants bietet Konstanten zum Deklarieren von MTP-Dateiformatcodes, Verknüpfungstyp und Schutzstatus.

Unterstützung neuer Eingabegeräte und Bewegungsereignisse

Android 3.1 erweitert das Eingabesubsystem, um neue Eingabegeräte und neue Arten von Bewegungsereignissen in allen Ansichten und Fenstern zu unterstützen. Entwickler können auf diesen Funktionen aufbauen, damit Nutzer nicht nur über Tastaturen und Touchscreens, sondern auch über Mäuse, Trackballs, Joysticks, Gamepads und andere Geräte mit ihren Anwendungen interagieren können.

Für die Steuerung der Maus-, Scrollrad- und Trackball-Eingabe unterstützt die Plattform zwei neue Bewegungsereignisaktionen:

  • ACTION_SCROLL: Gibt die Zeigerposition an, an der eine Scrollbewegung ohne Touch-Geste (z. B. von einem Scrollrad einer Maus) stattgefunden hat. In MotionEvent gibt der Wert der Achsen AXIS_HSCROLL und AXIS_VSCROLL die relative Scrollbewegung an.
  • ACTION_HOVER_MOVE meldet die aktuelle Position der Maus, wenn keine Tasten gedrückt werden, sowie alle Zwischenpunkte seit dem letzten HOVER_MOVE-Ereignis. Benachrichtigungen zum Ein- und Ausblenden durch Mausbewegung werden noch nicht unterstützt.

Zur Unterstützung von Joysticks und Gamepads enthält die Klasse InputDevice diese neuen Eingabegerätequellen:

Um Bewegungsereignisse aus diesen neuen Quellen und von Mäusen und Trackballs zu beschreiben, definiert die Plattform jetzt Achsencodes auf MotionEvent, ähnlich wie Schlüsselcodes auf KeyEvent. Zu den neuen Achsencodes für Joysticks und Gamecontroller gehören AXIS_HAT_X, AXIS_HAT_Y, AXIS_RTRIGGER, AXIS_ORIENTATION, AXIS_THROTTLE und viele weitere. Vorhandene MotionEvent-Achsen werden durch AXIS_X, AXIS_Y, AXIS_PRESSURE, AXIS_SIZE, AXIS_TOUCH_MAJOR, AXIS_TOUCH_MINOR, AXIS_TOOL_MAJOR, AXIS_TOOL_MINOR und AXIS_ORIENTATION dargestellt.

Außerdem definiert MotionEvent eine Reihe generischer Achsencodes, die verwendet werden, wenn das Framework nicht weiß, wie eine bestimmte Achse abgebildet werden soll. Bestimmte Geräte können die generischen Achsencodes verwenden, um benutzerdefinierte Bewegungsdaten an Anwendungen zu übergeben. Eine vollständige Liste der Achsen und ihrer beabsichtigten Interpretationen finden Sie in der Dokumentation zur Klasse MotionEvent.

Die Plattform stellt den Anwendungen Bewegungsereignisse in Batches zur Verfügung, sodass ein einzelnes Ereignis eine aktuelle Position und mehrere sogenannte historische Bewegungen enthalten kann. Anwendungen sollten getHistorySize() verwenden, um die Anzahl der historischen Stichproben abzurufen, und dann alle historischen Stichproben in der Reihenfolge mithilfe von getHistoricalAxisValue() abrufen und verarbeiten. Danach sollten Anwendungen das aktuelle Beispiel mit getAxisValue() verarbeiten.

Einige Achsen können mithilfe spezieller Zugriffsmethoden abgerufen werden. Anstatt getAxisValue() aufzurufen, können Anwendungen beispielsweise getX() aufrufen. Zu den Achsen mit integrierten Zugriffsfunktionen gehören AXIS_X, AXIS_Y, AXIS_PRESSURE, AXIS_SIZE, AXIS_TOUCH_MAJOR, AXIS_TOUCH_MINOR, AXIS_TOOL_MAJOR, AXIS_TOOL_MINOR und AXIS_ORIENTATION.

Jedes Eingabegerät hat eine eindeutige, vom System zugewiesene ID und kann auch mehrere Quellen bereitstellen. Wenn ein Gerät mehrere Quellen bereitstellt, können mehrere Quellen Achsendaten über dieselbe Achse bereitstellen. Ein Touch-Ereignis, das von der Touch-Quelle kommt, verwendet die X-Achse für Bildschirmpositionsdaten, während ein Joystick-Ereignis von der Joystick-Quelle stattdessen die X-Achse für die Stick-Position verwendet. Aus diesem Grund ist es wichtig, dass Anwendungen Achsenwerte nach ihrer Quelle interpretieren. Bei der Verarbeitung eines Bewegungsereignisses sollten Anwendungen Methoden der InputDevice-Klasse verwenden, um die von einem Gerät oder einer Quelle unterstützten Achsen zu bestimmen. Insbesondere können Anwendungen getMotionRanges() verwenden, um alle Achsen eines Geräts oder alle Achsen einer bestimmten Quelle des Geräts abzufragen. In beiden Fällen geben die Bereichsinformationen für die Achsen, die im InputDevice.MotionRange-Objekt zurückgegeben werden, die Quelle für jeden Achsenwert an.

Da die Bewegungsereignisse von Joysticks, Gamepads, Mäusen und Trackballs keine Touch-Ereignisse sind, fügt die Plattform eine neue Callback-Methode hinzu, mit der sie als "allgemeine" Bewegungsereignisse an ein View übergeben werden können. Insbesondere werden die Bewegungsereignisse ohne Berührung an Views über einen Aufruf an onGenericMotionEvent() statt an onTouchEvent() gemeldet.

Die Plattform sendet generische Bewegungsereignisse je nach Ereignisquellenklasse unterschiedlich. SOURCE_CLASS_POINTER-Ereignisse werden auf die View unter dem Mauszeiger gesetzt, ähnlich wie bei Touch-Ereignissen. Alle anderen werden zum aktuellen Objekt „View“ im Fokus. Das bedeutet beispielsweise, dass ein View den Fokus darauf legen muss, um Joystick-Ereignisse zu empfangen. Bei Bedarf können Anwendungen diese Ereignisse auf Aktivitäts- oder Dialogfeldebene verarbeiten, indem dort stattdessen onGenericMotionEvent() implementiert wird.

Eine Beispielanwendung, die Joystick-Bewegungsereignisse verwendet, finden Sie unter GameControllerInput und GameView.

RTP-API

Android 3.1 stellt eine API im integrierten RTP-Stack (Real-time Transport Protocol) bereit, mit dem Anwendungen On-Demand- oder interaktives Datenstreaming verwalten können. Insbesondere können Anwendungen, die VoIP, Push-to-Talk, Konferenzen und Audiostreaming bereitstellen, die API verwenden, um Sitzungen zu initiieren und Datenstreams über jedes verfügbare Netzwerk zu senden oder zu empfangen.

Die RTP API ist im Paket android.net.rtp verfügbar. Zu den Klassen gehören:

  • RtpStream, die Basisklasse von Streams, die Netzwerkpakete mit Mediennutzlasten über RTP senden und empfangen.
  • AudioStream, eine abgeleitete Klasse von RtpStream, die Audionutzlasten über RTP überträgt.
  • AudioGroup, ein lokaler Audio-Hub zum Verwalten und Mischen des Lautsprechers, des Mikrofons und von AudioStream des Geräts.
  • AudioCodec, die eine Sammlung von Codecs enthält, die Sie für ein AudioStream definieren.

Um Audiokonferenzen und ähnliche Verwendungen zu unterstützen, instanziiert eine Anwendung zwei Klassen als Endpunkte für den Stream:

  • AudioStream gibt einen Remote-Endpunkt an und besteht aus der Netzwerkzuordnung und einer konfigurierten AudioCodec.
  • AudioGroup steht für den lokalen Endpunkt für ein oder mehrere AudioStreams. Der AudioGroup mischt alle AudioStreams und interagiert optional gleichzeitig mit dem Lautsprecher und dem Mikrofon des Geräts.

Die einfachste Verwendung erfordert einen einzelnen Remote-Endpunkt und einen lokalen Endpunkt. Informationen zu komplexeren Verwendungen finden Sie in den für AudioGroup beschriebenen Einschränkungen.

Damit Anwendungen die RTP API verwenden können, müssen sie eine Berechtigung vom Nutzer anfordern, indem sie <uses-permission android:name="android.permission.INTERNET"> in ihren Manifestdateien deklarieren. Um das Mikrofon des Geräts zu erhalten, ist auch die Berechtigung „<uses-permission android:name="android.permission.RECORD_AUDIO">“ erforderlich.

App-Widgets mit anpassbarer Größe

Ab Android 3.1 können Entwickler die Größe ihrer Startbildschirm-Widgets anpassen – horizontal, vertikal oder auf beiden Achsen. Halten Sie ein Widget gedrückt, um seine Ziehpunkte zur Größenanpassung einzublenden, und ziehen Sie dann die horizontalen und/oder vertikalen Ziehpunkte, um die Größe im Layoutraster zu ändern.

Entwickler können die Größe jedes Startbildschirm-Widgets anpassen, indem sie ein resizeMode-Attribut in den AppWidgetProviderInfo-Metadaten des Widgets definieren. Mögliche Werte für das Attribut resizeMode sind „horizontal“, „vertical“ und „none“. Um ein Widget als horizontal oder vertikal anpassbares Widget zu deklarieren, geben Sie den Wert "horizontal|vertical" an.

Beispiel:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/preview"
    android:initialLayout="@layout/example_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigure"
    android:resizeMode="horizontal|vertical" >
</appwidget-provider>

Weitere Informationen zu Startbildschirm-Widgets findest du in der Dokumentation zu App-Widgets.

Animations-Framework

  • Neue „ViewPropertyAnimator-Klasse“
    • Die neue ViewPropertyAnimator-Klasse bietet eine bequeme Möglichkeit für Entwickler, ausgewählte Attribute von View-Objekten zu animieren. Die Klasse automatisiert und optimiert die Animation der Eigenschaften und erleichtert die Verwaltung mehrerer gleichzeitiger Animationen für ein View-Objekt.

      Die Verwendung von ViewPropertyAnimator ist unkompliziert. Um Eigenschaften für eine View zu animieren, rufen Sie animate() auf, um ein ViewPropertyAnimator-Objekt für diese View zu erstellen. Mit den Methoden für ViewPropertyAnimator können Sie angeben, welches Attribut animiert werden soll und wie es animiert werden soll. Wenn Sie beispielsweise View transparent machen möchten, rufen Sie alpha(0); auf. Das ViewPropertyAnimator-Objekt verarbeitet die Details zum Konfigurieren der zugrunde liegenden Animator-Klasse, Starten der Klasse und Rendern der Animation.

  • Hintergrundfarbe der Animation
    • Mit den neuen Methoden getBackgroundColor() und setBackgroundColor(int) können Sie die Hintergrundfarbe hinter Animationen abrufen/festlegen und nur für Fensteranimationen. Der Hintergrund muss schwarz sein und jeden gewünschten Alphawert einstellen.
  • Animierter Bruch wird von ViewAnimator abgerufen
    • Mit der neuen Methode getAnimatedFraction() können Sie den aktuellen Animationsanteil, also den verstrichenen/interpolierten Anteil, der bei der letzten Frame-Aktualisierung verwendet wurde, aus einer ValueAnimator abrufen.

UI-Framework

  • Erzwungenes Rendering einer Ebene
    • Mit der neuen buildLayer()-Methode kann eine Anwendung das Erstellen der Ebene einer Ansicht erzwingen und die Ansicht sofort darin rendern. Eine Anwendung könnte diese Methode beispielsweise verwenden, um eine Ansicht in ihre Ebene zu rendern, bevor eine Animation gestartet wird. Wenn die Ansicht komplex ist und sie vor dem Start der Animation in der Ebene gerendert wird, werden Frames nicht übersprungen.
  • Entfernung zur Kamera
    • In Anwendungen kann mit der neuen Methode setCameraDistance(float) die Entfernung von der Kamera zu einer Ansicht festgelegt werden. Dadurch erhalten Anwendungen eine bessere Kontrolle über 3D-Transformationen der Ansicht, wie etwa Rotationen.
  • Kalenderansicht aus einem DatePicker abrufen
  • Callbacks abrufen, wenn Ansichten getrennt werden
  • Navigationspfad für Fragment, neue onInflate()-Signatur
  • Suchergebnis auf neuem Tab anzeigen
  • Drawbarer Textcursor
    • Mit dem neuen Ressourcenattribut textCursorDrawable kannst du jetzt ein Drawable angeben, das als Textcursor verwendet werden soll.
  • Angezeigtes Kind in Remote-Ansichten festlegen
  • Allgemeine Tasten für Gamepads und andere Eingabegeräte
    • KeyEvent fügt eine Reihe generischer Keycodes für Gamepad-Tasten hinzu. Die Klasse fügt außerdem isGamepadButton(int) und einige weitere Hilfsmethoden für die Arbeit mit Schlüsselcodes hinzu.

Grafik

  • Hilfsprogramme zum Verwalten von Bitmaps
    • Mit setHasAlpha(boolean) kann eine App angeben, dass alle Pixel in einer Bitmap bekanntermaßen undurchsichtig sind (falsch) oder dass einige Pixel möglicherweise nicht opake Alphawerte enthalten (wahr). Hinweis: Bei einigen Konfigurationen (z. B. RGB_565) wird dieser Aufruf ignoriert, da er keine Alpha-Werte pro Pixel unterstützt. Dies ist als Zeichenhinweis gedacht. In einigen Fällen kann eine Bitmap, die als undurchsichtig ist, schneller verarbeitet werden als eine Bitmap mit nicht opaken Alpha-Werten pro Pixel.
    • getByteCount() ruft die Größe einer Bitmap in Byte ab.
    • Mit getGenerationId() kann eine Anwendung feststellen, ob eine Bitmap geändert wurde, z. B. für Caching.
    • sameAs(android.graphics.Bitmap) gibt an, ob sich eine bestimmte Bitmap in Bezug auf Dimensionen, Konfiguration oder Pixeldaten von der aktuellen Bitmap unterscheidet.
  • Standort und Drehung der Kamera festlegen

Netz

  • Leistungsstarke WLAN-Sperre
    • Eine neue Hochleistungs-WLAN-Sperre ermöglicht es Anwendungen, leistungsstarke WLAN-Verbindungen auch bei ausgeschaltetem Gerätebildschirm aufrechterhalten zu können. Anwendungen, die Musik, Videos oder Sprachaufnahmen über einen längeren Zeitraum streamen, können die leistungsstarke WLAN-Sperre nutzen, um die Streaming-Leistung auch bei ausgeschaltetem Bildschirm sicherzustellen. Da diese mehr Energie verbraucht, sollten Anwendungen das leistungsstarke WLAN nutzen, wenn eine lange aktive Verbindung erforderlich ist.

      Übergeben Sie WIFI_MODE_FULL_HIGH_PERF als Sperrmodus in einem Aufruf von createWifiLock(), um eine Sperre mit hoher Leistung zu erstellen.

  • Weitere Traffic-Statistiken
    • Anwendungen können jetzt mithilfe der neuen Methoden in TrafficStats auf Statistiken zu weiteren Arten der Netzwerknutzung zugreifen. Anwendungen können die Methoden verwenden, um UDP-Statistiken, Paketanzahl, TCP-Übertragungs-/-Empfangsnutzlastbyte und Segmente für eine bestimmte UID abzurufen.
  • Nutzername für die SIP-Authentifizierung

Download-Manager

  • Umgang mit abgeschlossenen Downloads
  • Downloads nach Größe sortiert anzeigen

IME-Framework

  • Zusätzlichen Wertschlüssel einer Eingabemethode abrufen

Medien

  • Neue Streaming-Audioformate
    • Das Medien-Framework bietet integrierte Unterstützung für ADTS-AAC-Rohinhalte für verbessertes Audio-Streaming sowie Unterstützung für FLAC-Audio für komprimierte Audioinhalte mit höchster Qualität (verlustfrei). Weitere Informationen finden Sie im Dokument Unterstützte Medienformate.

Startsteuerelemente bei beendeten Anwendungen

Ab Android 3.1 erfasst der Paketmanager des Systems Anwendungen, die sich im Status "gestoppt" befinden, und bietet eine Möglichkeit, deren Start über Hintergrundprozesse und andere Anwendungen zu steuern.

Beachten Sie, dass der Status „Beendet“ einer App nicht dasselbe ist wie der Status „Beendet“ einer Aktivität. Das System verwaltet diese beiden Stoppzustände separat.

Die Plattform definiert zwei neue Intent-Flags, mit denen ein Absender angeben kann, ob der Intent Komponenten in beendeter Anwendung aktivieren darf.

Wenn keines oder beide dieser Flags in einem Intent definiert sind, werden in der Standardeinstellung Filter beendeter Anwendungen in die Liste der potenziellen Ziele aufgenommen.

Beachten Sie, dass das System FLAG_EXCLUDE_STOPPED_PACKAGES allen Broadcast-Intents hinzufügt. Dadurch wird verhindert, dass Broadcasts von Hintergrunddiensten versehentlich oder unnötigerweise Komponenten beendeter Anwendungen starten. Ein Hintergrunddienst oder eine Hintergrundanwendung kann dieses Verhalten überschreiben. Dazu fügen Sie das Flag FLAG_INCLUDE_STOPPED_PACKAGES hinzu, um Intents zu senden, die angehaltene Anwendungen aktivieren dürfen.

Anwendungen befinden sich im Status „Beendet“, wenn sie zum ersten Mal installiert, aber noch nicht gestartet wurden oder wenn sie vom Nutzer manuell beendet werden (unter „Anwendungen verwalten“).

Benachrichtigung über den ersten Start und das erste Upgrade der App

Die Plattform bietet eine verbesserte Benachrichtigung über den ersten Start von Anwendungen und Upgrades über zwei neue Intent-Aktionen:

  • ACTION_PACKAGE_FIRST_LAUNCH: Wird an das Installationspaket einer App gesendet, wenn diese App zum ersten Mal gestartet wird, d. h. wenn sie zum ersten Mal beendet wird. Die Daten enthalten den Namen des Pakets.
  • ACTION_MY_PACKAGE_REPLACED: Informiert eine Anwendung über eine Aktualisierung, wobei eine neue Version anstelle einer vorhandenen Version installiert wurde. Dies wird nur an die Anwendung gesendet, die ersetzt wurde. Sie enthält keine zusätzlichen Daten. Deklarieren Sie für diese Aktion einen Intent-Filter, um sie zu erhalten. Sie können den Intent zum Auslösen von Code verwenden, mit dem Sie Ihre Anwendung nach einem Upgrade wieder in die richtige Form bringen können.

    Dieser Intent wird direkt an die Anwendung gesendet, aber nur, wenn ein Upgrade der Anwendung durchgeführt wurde, während sie sich im Status „Start“ (nicht beendet) befand.

Kerndienstprogramme

  • LRU-Cache
    • Mit der neuen LruCache-Klasse können Ihre Anwendungen von effizientem Caching profitieren. Anwendungen können die Klasse verwenden, um die Zeit für die Berechnung oder das Herunterladen von Daten aus dem Netzwerk zu reduzieren und gleichzeitig einen sinnvollen Speicherbedarf für die im Cache gespeicherten Daten beizubehalten.LruCache ist ein Cache, der starke Verweise auf eine begrenzte Anzahl von Werten enthält. Bei jedem Zugriff auf einen Wert wird dieser an den Anfang einer Warteschlange verschoben. Wenn ein Wert zu einem vollen Cache hinzugefügt wird, wird der Wert am Ende dieser Warteschlange entfernt und kann für die automatische Speicherbereinigung infrage kommen.
  • Dateideskriptor als int

WebKit

  • Cookies für Dateischemas
    • CookieManager unterstützt jetzt Cookies, die das URI-Schema file: verwenden. Sie können setAcceptFileSchemeCookies() verwenden, um die Unterstützung für Dateischema-Cookies zu aktivieren oder zu deaktivieren, bevor Sie eine Instanz von WebView oder CookieManager erstellen. In einer CookieManager-Instanz können Sie durch Aufrufen von allowFileSchemeCookies() prüfen, ob Cookies für Dateischemata aktiviert sind.
  • Benachrichtigung über Anmeldeanfrage
    • Zur Unterstützung der in Android 3.0 eingeführten Funktionen zur automatischen Anmeldung im Browser benachrichtigt die neue Methode onReceivedLoginRequest() die Hostanwendung, dass eine Anfrage zur automatischen Anmeldung für den Nutzer verarbeitet wurde.
  • Entfernte Klassen und Schnittstellen
    • Mehrere Klassen und Schnittstellen wurden aus der öffentlichen API entfernt, nachdem sie sich im Status „Veraltet“ befanden. Weitere Informationen finden Sie im Bericht zu API-Unterschieden.

Browser

Die Browseranwendung bietet die folgenden Funktionen zur Unterstützung von Webanwendungen:

  • Unterstützung der Inline-Wiedergabe von Videos, die in das HTML5-Tag <video> eingebettet sind Die Wiedergabe erfolgt wenn möglich hardwarebeschleunigt.
  • Unterstützung von Elementen mit fester Position für alle Websites (Mobilgeräte und Computer)

Neue Featurekonstanten

Die Plattform fügt neue Konstanten für Hardwarefunktionen hinzu, die Entwickler in ihren Anwendungsmanifesten deklarieren können, um externe Entitäten wie Google Play über die Anforderungen der Anwendung an neue Hardwarefunktionen zu informieren, die in dieser Version der Plattform unterstützt werden. Entwickler deklarieren diese und andere Funktionskonstanten in <uses-feature>-Manifestelementen.

  • android.hardware.usb.accessory: Die Anwendung verwendet die USB API, um mit externen Hardwaregeräten zu kommunizieren, die über USB verbunden sind und als Hosts fungieren.
  • android.hardware.usb.host: Die Anwendung verwendet die USB API, um mit externen Hardwaregeräten zu kommunizieren, die über USB verbunden sind und als Geräte zu fungieren.

Google Play filtert Apps anhand der in den <uses-feature>-Manifestelementen deklarierten Funktionen. Weitere Informationen zum Deklarieren von Funktionen in einem App-Manifest findest du unter Google Play-Filter.

Bericht zu API-Unterschieden

Eine detaillierte Ansicht aller API-Änderungen in Android 3.1 (API-Level 12) findest du im API-Unterschiedsbericht.

API-Ebene

Die Plattform Android 3.1 stellt eine aktualisierte Version der Framework API bereit. Der Android 3.1 API wird eine Ganzzahl-ID (12) 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.1 eingeführte APIs in Ihrer App zu verwenden, müssen Sie die App mithilfe der Android-Bibliothek kompilieren, die auf der Android 3.1 SDK-Plattform enthalten ist. Je nach deinen Anforderungen musst du dem <uses-sdk>-Element im Manifest der Anwendung möglicherweise auch ein android:minSdkVersion="12"-Attribut hinzufügen.

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