APIs unter Android 4.1

API-Ebene: 16

Android 4.1 (JELLY_BEAN) ist eine Weiterentwicklung der Plattform, die eine verbesserte Leistung und Nutzerfreundlichkeit bietet. Es bietet neue Funktionen für Nutzer und App-Entwickler. Dieses Dokument bietet eine Einführung in die wichtigsten und nützlichsten neuen APIs für App-Entwickler.

Als App-Entwickler können Sie Android 4.1 über den SDK Manager als System-Image herunterladen, das Sie im Android-Emulator ausführen können, und als SDK-Plattform, auf der Sie Ihre App erstellen können. Sie sollten das System-Image und die Plattform so schnell wie möglich herunterladen, um Ihre App unter Android 4.1 zu erstellen und zu testen.

Wenn Sie Ihre App für Geräte mit Android 4.1 optimieren möchten, sollten Sie targetSdkVersion auf "16" festlegen, die App auf einem Android 4.1-System-Image installieren, testen und dann ein Update mit dieser Änderung veröffentlichen.

Sie können APIs in Android 4.1 verwenden und gleichzeitig ältere Versionen unterstützen, indem Sie Ihrem Code Bedingungen hinzufügen, die die System-API-Ebene prüfen, bevor APIs ausgeführt werden, die von Ihrer minSdkVersion nicht unterstützt werden. Weitere Informationen zur Aufrechterhaltung der Abwärtskompatibilität finden Sie unter Abwärtskompatible UIs erstellen.

Weitere Informationen zur Funktionsweise von API-Levels finden Sie unter Was ist ein API-Level?

App-Komponenten

Isolierte Dienste

Wenn du android:isolatedProcess="true" im <service>-Tag angibst, wird deine Service in einem eigenen isolierten User-ID-Prozess ausgeführt, der keine eigenen Berechtigungen hat.

Arbeitsspeicherverwaltung

Neue ComponentCallbacks2-Konstanten wie TRIM_MEMORY_RUNNING_LOW und TRIM_MEMORY_RUNNING_CRITICAL bieten Vordergrundprozessen mehr Informationen zum Arbeitsspeicherstatus, bevor das System onLowMemory() aufruft.

Mit der neuen Methode getMyMemoryState(ActivityManager.RunningAppProcessInfo) können Sie den allgemeinen Speicherstatus abrufen.

Contentanbieter

Mit der neuen Methode acquireUnstableContentProviderClient() können Sie auf einen ContentProviderClient zugreifen, der möglicherweise „instabil“ ist, sodass Ihre App nicht abstürzt, wenn der Contentanbieter abstürzt. Das ist hilfreich, wenn Sie in einer separaten App mit Inhaltsanbietern interagieren.

Live-Hintergründe

Neues Intent-Protokoll zum direkten Starten der Vorschauaktivität für den Live-Hintergrund. So kannst du Nutzern helfen, deinen Live-Hintergrund einfach auszuwählen, ohne dass sie deine App verlassen und durch die Hintergrundauswahl für den Startbildschirm navigieren müssen.

Wenn Sie die Auswahl für Live-Hintergründe starten möchten, rufen Sie startActivity() mit einem Intent über ACTION_CHANGE_LIVE_WALLPAPER und einem zusätzlichen Parameter auf, in dem Ihr Live-Hintergrund ComponentName als String in EXTRA_LIVE_WALLPAPER_COMPONENT angegeben ist.

App-Stack-Navigation

Mit Android 4.1 ist es viel einfacher, die richtigen Designmuster für die Aufwärtsnavigation zu implementieren. Fügen Sie dazu einfach jedem <activity>-Element in Ihrer Manifestdatei android:parentActivityName hinzu. Das System verwendet diese Informationen, um die entsprechende Aktivität zu öffnen, wenn der Nutzer die Schaltfläche „Zurück“ in der Aktionsleiste drückt und gleichzeitig die aktuelle Aktivität beendet. Wenn Sie also die android:parentActivityName für jede Aktivität deklarieren, ist die Methode onOptionsItemSelected() nicht erforderlich, um Klickereignisse auf das App-Symbol in der Aktionsleiste zu verarbeiten. Das System verarbeitet dieses Ereignis jetzt und setzt die entsprechende Aktivität fort oder erstellt sie.

Das ist besonders nützlich für Szenarien, in denen Nutzer eine Aktivität Ihrer App über einen Deep-Dive-Intent aufrufen, z. B. über eine Benachrichtigung oder einen Intent aus einer anderen App (wie im Designleitfaden für das Wechseln zwischen Apps beschrieben). Wenn der Nutzer Ihre Aktivität auf diese Weise eingibt, hat Ihre App möglicherweise keinen Back-Stack von Aktivitäten, die fortgesetzt werden können, wenn der Nutzer nach oben navigiert. Wenn Sie jedoch das Attribut android:parentActivityName für Ihre Aktivitäten angeben, erkennt das System, ob Ihre App bereits einen Backstack mit übergeordneten Aktivitäten enthält. Andernfalls wird ein synthetischer Backstack mit allen übergeordneten Aktivitäten erstellt.

Hinweis:Wenn der Nutzer eine Deep-Aktivität in Ihrer App ausführt und dadurch eine neue Aufgabe für Ihre App erstellt wird, fügt das System den Stapel der übergeordneten Aktivitäten in die Aufgabe ein. Wenn Sie also die Schaltfläche „Zurück“ drücken, kehren Sie auch durch den Stapel der übergeordneten Aktivitäten zurück.

Wenn das System einen synthetischen Backstack für Ihre App erstellt, wird eine grundlegende Intent erstellt, um eine neue Instanz jeder übergeordneten Aktivität zu erstellen. Es gibt also keinen gespeicherten Status für die übergeordneten Aktivitäten, wie Sie es erwarten würden, wenn der Nutzer die einzelnen Aktivitäten auf natürliche Weise durchlaufen hätte. Wenn bei einer der übergeordneten Aktivitäten normalerweise eine UI angezeigt wird, die vom Kontext des Nutzers abhängig ist, fehlen diese Kontextinformationen. Sie sollten sie bereitstellen, wenn der Nutzer durch den Stack zurückkehrt. Wenn sich der Nutzer beispielsweise ein Album in einer Musik-App ansieht, wird er durch das Scrollen nach oben möglicherweise zu einer Aktivität weitergeleitet, in der alle Alben in einem ausgewählten Musikgenre aufgeführt sind. Wenn der Stack in diesem Fall erstellt werden muss, müssen Sie der übergeordneten Aktivität mitteilen, zu welchem Genre das aktuelle Album gehört, damit die übergeordnete Aktivität die richtige Liste anzeigen kann, als wäre der Nutzer tatsächlich von dieser Aktivität gekommen. Wenn Sie solche Informationen an eine synthetische übergeordnete Aktivität senden möchten, müssen Sie die Methode onPrepareNavigateUpTaskStack() überschreiben. Dadurch erhalten Sie ein TaskStackBuilder-Objekt, das das System zum Zusammenführen der übergeordneten Aktivitäten erstellt hat. Die TaskStackBuilder enthält Intent-Objekte, mit denen das System die einzelnen übergeordneten Aktivitäten erstellt. Bei der Implementierung von onPrepareNavigateUpTaskStack() können Sie die entsprechende Intent ändern, um zusätzliche Daten hinzuzufügen, mit denen die übergeordnete Aktivität den entsprechenden Kontext ermitteln und die entsprechende Benutzeroberfläche anzeigen kann.

Wenn das System die TaskStackBuilder erstellt, werden die Intent-Objekte hinzugefügt, mit denen die übergeordneten Aktivitäten in ihrer logischen Reihenfolge erstellt werden, beginnend oben im Aktivitätsbaum. Die letzte Intent, die dem internen Array hinzugefügt wurde, ist also das direkte übergeordnete Element der aktuellen Aktivität. Wenn Sie die Intent für das übergeordnete Element der Aktivität ändern möchten, ermitteln Sie zuerst die Länge des Arrays mit getIntentCount() und übergeben Sie diesen Wert an editIntentAt().

Wenn Ihre App-Struktur komplexer ist, gibt es mehrere andere APIs, mit denen Sie das Verhalten der Navigation nach oben steuern und den synthetischen Backstack vollständig anpassen können. Zu den APIs, die Ihnen zusätzliche Kontrolle bieten, gehören:

onNavigateUp()
Überschreiben Sie diese Einstellung, um eine benutzerdefinierte Aktion auszuführen, wenn der Nutzer die Aufwärtstaste drückt.
navigateUpTo(Intent)
Diese Funktion wird aufgerufen, um die aktuelle Aktivität zu beenden und zur Aktivität zu wechseln, die durch die angegebene Intent gekennzeichnet ist. Wenn die Aktivität im Backstack vorhanden ist, aber nicht die übergeordnete Aktivität ist, werden auch alle anderen Aktivitäten zwischen der aktuellen Aktivität und der mit dem Intent angegebenen Aktivität beendet.
getParentActivityIntent()
Diese Funktion wird aufgerufen, um die Intent abzurufen, mit der das logische übergeordnete Element für die aktuelle Aktivität gestartet wird.
shouldUpRecreateTask(Intent)
Mit dieser Funktion wird abgefragt, ob ein synthetischer Backstack erstellt werden muss, um nach oben zu wechseln. Gibt „true“ zurück, wenn ein synthetischer Stack erstellt werden muss, andernfalls „false“.
finishAffinity()
Diese Funktion wird aufgerufen, um die aktuelle Aktivität und alle übergeordneten Aktivitäten mit derselben Aufgabenaffinität abzuschließen, die mit der aktuellen Aktivität verknüpft sind. Wenn Sie das Standardverhalten wie onNavigateUp() überschreiben, sollten Sie diese Methode aufrufen, wenn Sie beim Zurückgehen einen synthetischen Backstack erstellen.
onCreateNavigateUpTaskStack
Überschreiben Sie diesen Wert, wenn Sie die Erstellung des synthetischen Task-Stacks vollständig steuern müssen. Wenn Sie den Intents für den Backstack einfach zusätzliche Daten hinzufügen möchten, sollten Sie stattdessen onPrepareNavigateUpTaskStack() überschreiben.

Bei den meisten Apps müssen diese APIs jedoch nicht verwendet und onPrepareNavigateUpTaskStack() nicht implementiert werden. Sie können das richtige Verhalten einfach durch Hinzufügen von android:parentActivityName zu jedem <activity>-Element erreichen.

Multimedia

Medien-Codecs

Die Klasse MediaCodec bietet Zugriff auf Low-Level-Medienkods zum Codieren und Decodieren von Medien. Du kannst eine Instanz von MediaCodec erstellen, indem du createEncoderByType() aufrufst, um Medien zu codieren, oder createDecoderByType(), um Medien zu decodieren. Jede dieser Methoden nimmt einen MIME-Typ für die Art der Medien an, die codiert oder decodiert werden sollen, z. B. "video/3gpp" oder "audio/vorbis".

Nachdem eine Instanz von MediaCodec erstellt wurde, können Sie configure() aufrufen, um Attribute wie das Medienformat anzugeben oder anzugeben, ob der Inhalt verschlüsselt ist.

Unabhängig davon, ob du deine Medien codierst oder decodierst, ist der Rest des Vorgangs nach dem Erstellen der MediaCodec identisch. Rufen Sie zuerst getInputBuffers() auf, um ein Array von Eingabe-ByteBuffer-Objekten und dann getOutputBuffers(), um ein Array von Ausgabe-ByteBuffer-Objekten zu erhalten.

Wenn du bereit bist, zu codieren oder zu decodieren, ruf dequeueInputBuffer() auf, um die Indexposition des ByteBuffer (aus dem Array der Eingabebuffer) zu erhalten, die du zum Eingeben deiner Quellmedien verwenden solltest. Nachdem du ByteBuffer mit deinen Quellmedien gefüllt hast, kannst du die Inhaberschaft am Puffer durch Aufrufen von queueInputBuffer() freigeben.

Rufen Sie für den Ausgabepuffer ebenfalls dequeueOutputBuffer() auf, um die Indexposition des ByteBuffer zu erhalten, an dem Sie die Ergebnisse erhalten. Nachdem du die Ausgabe von ByteBuffer gelesen hast, kannst du die Inhaberschaft mit releaseOutputBuffer() zurückgeben.

Sie können verschlüsselte Mediendaten in den Codecs verarbeiten, indem Sie queueSecureInputBuffer() in Verbindung mit den MediaCrypto APIs anstelle des normalen queueInputBuffer() aufrufen.

Weitere Informationen zur Verwendung von Codecs finden Sie in der MediaCodec-Dokumentation.

Audio auf Zuruf aufnehmen

Mit der neuen Methode startRecording() können Sie die Audioaufnahme basierend auf einem durch MediaSyncEvent definierten Hinweis starten. Mit MediaSyncEvent wird eine Audiositzung angegeben, z. B. eine von MediaPlayer definierte. Wenn diese abgeschlossen ist, wird der Audiorekorder zum Starten der Aufnahme veranlasst. So können Sie beispielsweise einen Audioton abspielen, der den Beginn einer Aufnahmesitzung angibt, und die Aufnahme wird automatisch gestartet, sodass Sie den Ton nicht manuell mit dem Beginn der Aufnahme synchronisieren müssen.

Synchronisierte Untertitel

Die MediaPlayer unterstützt jetzt sowohl In-Band- als auch Out-of-Band-Texttracks. In-Band-Texttracks sind Texttracks in einer MP4- oder 3GPP-Medienquelle. Out-of-Band-Texttracks können über die addTimedTextSource()-Methode als externe Textquelle hinzugefügt werden. Nachdem alle externen Text-Titelquellen hinzugefügt wurden, sollte getTrackInfo() aufgerufen werden, um die aktualisierte Liste aller verfügbaren Titel in einer Datenquelle abzurufen.

Wenn Sie den Titel festlegen möchten, der mit MediaPlayer verwendet werden soll, müssen Sie selectTrack() mit der Indexposition des gewünschten Titels aufrufen.

Wenn du benachrichtigt werden möchtest, wenn der Texttrack zur Wiedergabe bereit ist, implementiere die MediaPlayer.OnTimedTextListener-Schnittstelle und übergebe sie an setOnTimedTextListener().

Audio-Effekte

Die AudioEffect-Klasse unterstützt jetzt zusätzliche Arten der Audiovorverarbeitung bei der Audioaufnahme:

  • Die akustische Echounterdrückung (AEC) mit AcousticEchoCanceler entfernt den Beitrag des vom Remote-Teilnehmer empfangenen Signals aus dem aufgenommenen Audiosignal.
  • Die automatische Verstärkungsregelung (Automatic Gain Control, AGC) mit AutomaticGainControl gleicht die Ausgabe des erfassten Signals automatisch an.
  • Mit der Geräuschunterdrückung (NS) mit NoiseSuppressor werden Hintergrundgeräusche aus dem aufgenommenen Signal entfernt.

Sie können diese Vorverarbeitungseffekte mit einer der AudioEffect-Unterklassen auf mit einem AudioRecord aufgenommene Audioinhalte anwenden.

Hinweis:Es kann nicht garantiert werden, dass alle Geräte diese Effekte unterstützen. Du solltest daher immer zuerst die Verfügbarkeit prüfen, indem du isAvailable() auf die entsprechende Audioeffektklasse aufrufst.

Wiedergabe ohne Pause

Du kannst jetzt die lückenfreie Wiedergabe zwischen zwei separaten MediaPlayer-Objekten ausführen. Sie können jederzeit vor dem Ende des ersten MediaPlayer setNextMediaPlayer() aufrufen. Android versucht dann, den zweiten Player zu starten, sobald der erste stoppt.

Medienrouter. Die neuen APIs MediaRouter, MediaRouteActionProvider und MediaRouteButton bieten Standardmechanismen und eine Benutzeroberfläche zur Auswahl des Wiedergabeorts von Medien.

Kamera

Bewegung des Autofokus

Mit der neuen Benutzeroberfläche Camera.AutoFocusMoveCallback können Sie auf Änderungen der automatischen Fokusbewegung achten. Sie können Ihre Benutzeroberfläche bei setAutoFocusMoveCallback() registrieren. Wenn sich die Kamera dann im Modus für den kontinuierlichen Autofokus (FOCUS_MODE_CONTINUOUS_VIDEO oder FOCUS_MODE_CONTINUOUS_PICTURE) befindet, erhalten Sie einen Aufruf an onAutoFocusMoving(), der Ihnen mitteilt, ob der Autofokus begonnen hat, sich zu bewegen, oder ob er sich nicht mehr bewegt.

Kameratöne

Die Klasse MediaActionSound bietet eine einfache Reihe von APIs, um Standardtöne der Kamera oder anderer Medienaktionen zu erzeugen. Sie sollten diese APIs verwenden, um den entsprechenden Ton abzuspielen, wenn Sie eine benutzerdefinierte Foto- oder Videokamera erstellen.

Instanziieren Sie zum Abspielen eines Tons einfach ein MediaActionSound-Objekt, rufen Sie load() auf, um den gewünschten Ton vorab zu laden, und rufen Sie dann zum passenden Zeitpunkt play() auf.

Konnektivität

Android Beam

Android Beam™ unterstützt jetzt große Nutzlastübertragungen über Bluetooth. Wenn Sie die zu übertragenden Daten entweder mit der neuen setBeamPushUris()-Methode oder der neuen Callback-Schnittstelle NfcAdapter.CreateBeamUrisCallback definieren, übergibt Android die Datenübertragung an Bluetooth oder einen anderen alternativen Transport, um eine höhere Übertragungsgeschwindigkeit zu erreichen. Das ist besonders nützlich für große Nutzlasten wie Bild- und Audiodateien und erfordert keine sichtbare Kopplung zwischen den Geräten. Für die Nutzung von Übertragungen per Bluetooth sind keine zusätzlichen Änderungen an Ihrer App erforderlich.

Die Methode setBeamPushUris() nimmt ein Array von Uri-Objekten entgegen, die die Daten angeben, die aus Ihrer App übertragen werden sollen. Alternativ können Sie die NfcAdapter.CreateBeamUrisCallback-Schnittstelle implementieren, die Sie für Ihre Aktivität durch Aufrufen von setBeamPushUrisCallback() angeben können.

Bei Verwendung der Callback-Schnittstelle ruft das System die createBeamUris()-Methode der Schnittstelle auf, wenn der Nutzer eine Freigabe mit Android Beam ausführt. So können Sie die URIs zum Freigeben zum Zeitpunkt der Freigabe definieren. Das ist nützlich, wenn die zu teilenden URIs je nach Nutzerkontext in der Aktivität variieren können. Der Aufruf von setBeamPushUris() ist dagegen nützlich, wenn die zu teilenden URIs unveränderlich sind und Sie sie im Voraus definieren können.

Diensterkennung

Android 4.1 unterstützt die Multicast-DNS-basierte Diensterkennung, mit der Sie Dienste von Peer-Geräten über WLAN, z. B. Mobilgeräte, Drucker, Kameras, Mediaplayer und andere im lokalen Netzwerk registrierte, finden und sich mit ihnen verbinden können.

Das neue Paket android.net.nsd enthält die neuen APIs, mit denen Sie Ihre Dienste im lokalen Netzwerk übertragen, lokale Geräte im Netzwerk finden und eine Verbindung zu Geräten herstellen können.

Wenn Sie Ihren Dienst registrieren möchten, müssen Sie zuerst ein NsdServiceInfo-Objekt erstellen und die verschiedenen Eigenschaften Ihres Dienstes mithilfe von Methoden wie setServiceName(), setServiceType() und setPort() definieren.

Anschließend müssen Sie NsdManager.RegistrationListener implementieren und mit NsdServiceInfo an registerService() übergeben.

Wenn Sie Dienste im Netzwerk finden möchten, implementieren Sie NsdManager.DiscoveryListener und übergeben Sie ihn an discoverServices().

Wenn deine NsdManager.DiscoveryListener Rückrufe zu gefundenen Diensten erhält, musst du den Dienst auflösen, indem du resolveService() aufrufst und ihm eine Implementierung von NsdManager.ResolveListener übergibst, die ein NsdServiceInfo-Objekt mit Informationen zum gefundenen Dienst empfängt, damit du die Verbindung herstellen kannst.

WLAN-P2P-Diensterkennung

Die Wi‑Fi P2P APIs wurden in Android 4.1 erweitert, um die Diensterkennung vor der Verknüpfung in der WifiP2pManager zu unterstützen. So können Sie Geräte in der Nähe mithilfe von WLAN-P2P nach Diensten suchen und filtern, bevor Sie eine Verbindung herstellen. Mit der Netzwerkdiensterkennung können Sie einen Dienst in einem vorhandenen verbundenen Netzwerk (z. B. einem lokalen WLAN) finden.

Wenn Sie Ihre App als Dienst über WLAN übertragen möchten, damit andere Geräte sie finden und eine Verbindung herstellen können, rufen Sie addLocalService() mit einem WifiP2pServiceInfo-Objekt auf, das Ihre App-Dienste beschreibt.

Wenn Sie die Suche nach Geräten in der Nähe über WLAN starten möchten, müssen Sie zuerst entscheiden, ob Sie mit Bonjour oder Upnp kommunizieren möchten. Wenn Sie Bonjour verwenden möchten, richten Sie zuerst einige Callback-Listener mit setDnsSdResponseListeners() ein. Dieser nimmt sowohl eine WifiP2pManager.DnsSdServiceResponseListener als auch eine WifiP2pManager.DnsSdTxtRecordListener an. Wenn Sie Upnp verwenden möchten, rufen Sie setUpnpServiceResponseListener() auf, das einen WifiP2pManager.UpnpServiceResponseListener annimmt.

Bevor du Dienste auf lokalen Geräten entdecken kannst, musst du auch addServiceRequest() anrufen. Wenn die WifiP2pManager.ActionListener, die Sie an diese Methode übergeben, einen erfolgreichen Rückruf erhält, können Sie Dienste auf lokalen Geräten suchen, indem Sie discoverServices() aufrufen.

Wenn lokale Dienste gefunden werden, erhalten Sie einen Rückruf an WifiP2pManager.DnsSdServiceResponseListener oder WifiP2pManager.UpnpServiceResponseListener, je nachdem, ob Sie sich für die Verwendung von Bonjour oder Upnp registriert haben. Der in beiden Fällen empfangene Callback enthält ein WifiP2pDevice-Objekt, das das Peer-Gerät darstellt.

Netzwerknutzung

Mit der neuen Methode isActiveNetworkMetered() können Sie prüfen, ob das Gerät derzeit mit einem getakteten Netzwerk verbunden ist. Wenn Sie diesen Status prüfen, bevor Sie intensive Netzwerktransaktionen ausführen, können Sie die Datennutzung verwalten, die Ihre Nutzer möglicherweise kosten, und fundierte Entscheidungen darüber treffen, ob die Transaktionen jetzt oder später ausgeführt werden sollen (z. B. wenn das Gerät mit einem WLAN verbunden ist).

Bedienungshilfen

APIs für Bedienungshilfen

Die Reichweite der APIs für Dienste zur Barrierefreiheit wurde in Android 4.1 deutlich erhöht. Sie können jetzt Dienste erstellen, die mehr Eingabeereignisse überwachen und darauf reagieren, z. B. komplexe Gesten mit onGesture(). Andere Eingabeereignisse werden durch Ergänzungen der Klassen AccessibilityEvent, AccessibilityNodeInfo und AccessibilityRecord ergänzt.

Dienste zur Barrierefreiheit können auch Aktionen im Namen des Nutzers ausführen, z. B. Klicken, Scrollen und Vor- und Zurückspringen im Text mit performAction und setMovementGranularities. Mit der Methode performGlobalAction() können Dienste auch Aktionen wie „Zurück“, „Startseite“ und „Zuletzt geöffnete Apps“ und „Benachrichtigungen“ ausführen.

Benutzerdefinierte App-Navigation

Beim Erstellen einer Android-App können Sie jetzt Navigationsschemas anpassen. Dazu suchen Sie mit findFocus() und focusSearch() nach fokussierbaren Elementen und Eingabe-Widgets und legen den Fokus mit setAccessibilityFocused() fest.

Barrierefreiere Widgets

Mit der neuen Klasse android.view.accessibility.AccessibilityNodeProvider können Sie komplexe benutzerdefinierte Ansichten für Dienste zur Barrierefreiheit bereitstellen, damit die Informationen barrierefreier präsentiert werden können. Mit dem android.view.accessibility.AccessibilityNodeProvider können Nutzer in einem Widget mit erweiterten Inhalten wie einem Kalenderraster eine logische semantische Struktur für Dienste zur Barrierefreiheit präsentieren, die völlig unabhängig von der Layoutstruktur des Widgets ist. Diese semantische Struktur ermöglicht es Bedienungshilfen, ein nützlicheres Interaktionsmodell für sehbehinderte Nutzer zu präsentieren.

Copy and Paste

Intents kopieren und einfügen

Sie können jetzt mit der Methode setClipData() ein ClipData-Objekt einem Intent zuordnen. Dies ist besonders nützlich, wenn mit einem Intent mehrere content:-URIs an eine andere Anwendung übertragen werden, z. B. wenn mehrere Dokumente freigegeben werden. Die auf diese Weise bereitgestellten content:-URIs berücksichtigen auch die Flags der Intents, um Lese- oder Schreibzugriff anzubieten. So können Sie in einer Intent-Anfrage Zugriff auf mehrere URIs gewähren. Wenn Sie einen ACTION_SEND- oder ACTION_SEND_MULTIPLE-Intent starten, werden die darin angegebenen URIs jetzt automatisch an die ClipData weitergeleitet, damit dem Empfänger Zugriff gewährt werden kann.

Unterstützung für HTML- und String-Stile

Die ClipData-Klasse unterstützt jetzt formatierten Text (entweder als HTML oder als formatierte Android-Strings). Mit newHtmlText() können Sie dem ClipData HTML-Text hinzufügen.

RenderScript

Die RenderScript-Berechnungsfunktionen wurden um die folgenden Funktionen erweitert:

  • Unterstützung mehrerer Kernel in einem Script.
  • Unterstützung für das Lesen aus der Zuweisung mit gefilterten Samplern aus der Berechnung in einer neuen Script APIrsSample.
  • Unterstützung unterschiedlicher FP-Genauigkeit in #pragma.
  • Unterstützung für die Abfrage zusätzlicher Informationen aus RS-Objekten über ein Compute-Script.
  • Zahlreiche Leistungsverbesserungen.

Es gibt auch neue Pragmas, mit denen die für Ihre Compute-Renderscripts erforderliche Gleitkommagenauigkeit definiert werden kann. So können Sie NEON-ähnliche Vorgänge wie schnelle Vektormathematikvorgänge auf dem CPU-Pfad aktivieren, die mit dem vollständigen IEEE 754-2008-Standard sonst nicht möglich wären.

Hinweis:Die experimentelle Renderscript-Grafik-Engine wird nicht mehr unterstützt.

Animation

Startanimationen für Aktivitäten

Sie können jetzt eine Activity mit Zoom-Animationen oder eigenen benutzerdefinierten Animationen starten. Um die gewünschte Animation anzugeben, erstellen Sie mit den ActivityOptions APIs einen Bundle, den Sie dann an eine der Methoden übergeben können, die eine Aktivität starten, z. B. startActivity().

Die Klasse ActivityOptions enthält eine andere Methode für jede Art von Animation, die Sie beim Öffnen der Aktivität anzeigen möchten:

makeScaleUpAnimation()
Erstellt eine Animation, bei der das Aktivitätsfenster von einer bestimmten Startposition auf dem Bildschirm und einer bestimmten Startgröße maximiert wird. So wird beispielsweise beim Öffnen einer App der Startbildschirm von Android 4.1 verwendet.
makeThumbnailScaleUpAnimation()
Erstellt eine Animation, bei der das Aktivitätsfenster von einer bestimmten Position und einem bereitgestellten Thumbnail-Bild aus vergrößert wird. Beispielsweise wird dies im Fenster „Zuletzt geöffnete Apps“ in Android 4.1 verwendet, wenn Sie zu einer App zurückkehren.
makeCustomAnimation()
Erstellt eine Animation, die durch Ihre eigenen Ressourcen definiert wird: eine für das Öffnen der Aktivität und eine für das Anhalten der Aktivität.

Zeitanimation

Die neue TimeAnimator bietet einen einfachen Rückrufmechanismus mit der TimeAnimator.TimeListener, der Sie bei jedem Frame der Animation benachrichtigt. Bei diesem Animator gibt es keine Einstellung für Dauer, Interpolation oder Objektwert. Der Callback des Listeners erhält Informationen für jeden Frame, einschließlich der Gesamtzeit, die vergangen ist, und der Zeit, die seit dem vorherigen Animationsframe vergangen ist.

Benutzeroberfläche

Benachrichtigungen

Unter Android 4.1 können Sie Benachrichtigungen mit größeren Inhaltsbereichen, großen Bildvorschauen, mehreren Aktionsschaltflächen und konfigurierbarer Priorität erstellen.

Benachrichtigungsstile

Mit der neuen Methode setStyle() können Sie einen von drei neuen Stilen für Ihre Benachrichtigung angeben, die jeweils einen größeren Inhaltsbereich bieten. Wenn du den Stil für den Bereich mit großen Inhalten festlegen möchtest, übergebe setStyle() eines der folgenden Objekte:

Notification.BigPictureStyle
Für Benachrichtigungen mit einem großen Bildanhang.
Notification.BigTextStyle
Für Benachrichtigungen mit viel Text, z. B. eine einzelne E-Mail.
Notification.InboxStyle
Für Benachrichtigungen, die eine Liste von Strings enthalten, z. B. Ausschnitte aus mehreren E-Mails.
Benachrichtigungsaktionen

Es werden jetzt bis zu zwei Aktionsschaltflächen unterstützt, die unten in der Benachrichtigung angezeigt werden, unabhängig davon, ob die Benachrichtigung im normalen oder größeren Stil verwendet wird.

Wenn Sie eine Aktionsschaltfläche hinzufügen möchten, rufen Sie addAction() auf. Diese Methode nimmt drei Argumente entgegen: eine Zeichnen-Ressource für ein Symbol, Text für die Schaltfläche und eine PendingIntent, die die auszuführende Aktion definiert.

Prioritäten

Sie können dem System jetzt mitteilen, wie wichtig Ihre Benachrichtigung ist, um die Reihenfolge in der Liste zu beeinflussen. Legen Sie dazu die Priorität mit setPriority() fest. Sie können eine von fünf verschiedenen Prioritätsstufen übergeben, die durch PRIORITY_*-Konstanten in der Notification-Klasse definiert sind. Die Standardeinstellung ist PRIORITY_DEFAULT. Es gibt zwei höhere und zwei niedrigere Ebenen.

Benachrichtigungen mit hoher Priorität sind Dinge, auf die Nutzer in der Regel schnell reagieren möchten, z. B. eine neue Nachricht oder eine Erinnerung an einen bevorstehenden Termin. Beispiele für Benachrichtigungen mit niedriger Priorität sind abgelaufene Kalendertermine oder App-Werbung.

Steuerelemente für die System-UI

Mit Android 4.0 (Ice Cream Sandwich) wurden neue Flags hinzugefügt, um die Sichtbarkeit der System-UI-Elemente zu steuern. So kann die Systemleiste beispielsweise gedimmt oder auf Smartphones vollständig ausgeblendet werden. Android 4.1 bietet einige weitere Flags, mit denen Sie das Erscheinungsbild der UI-Elemente des Systems und das Layout Ihrer Aktivität im Verhältnis dazu weiter steuern können. Rufen Sie dazu setSystemUiVisibility() auf und übergeben Sie die folgenden Flags:

SYSTEM_UI_FLAG_FULLSCREEN
Blendet nicht kritische System-UI-Elemente aus, z. B. die Statusleiste. Wenn in Ihrer Aktivität die Aktionsleiste im Overlay-Modus verwendet wird (android:windowActionBarOverlay aktiviert ist), wird sie mit diesem Flag ebenfalls ausgeblendet. Dabei wird eine koordinierte Animation verwendet, wenn die Aktionsleiste ausgeblendet und wieder eingeblendet wird.
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
Setzt das Aktivitätslayout so, dass derselbe Bildschirmbereich verwendet wird, der auch nach der Aktivierung von SYSTEM_UI_FLAG_FULLSCREEN verfügbar ist, auch wenn die Elemente der System-UI noch sichtbar sind. Obwohl Teile des Layouts von der System-UI überlagert werden, ist dies nützlich, wenn Ihre Anwendung die System-UI häufig mit SYSTEM_UI_FLAG_FULLSCREEN ein- und ausblendet. So wird verhindert, dass sich das Layout jedes Mal an die neuen Layoutgrenzen anpasst, wenn die System-UI aus- oder eingeblendet wird.
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
Legt fest, dass für das Aktivitätslayout derselbe Bildschirmbereich verwendet wird, der verfügbar ist, wenn du SYSTEM_UI_FLAG_HIDE_NAVIGATION (in Android 4.0 hinzugefügt) aktiviert hast, auch wenn die Elemente der System-UI noch sichtbar sind. Auch wenn Teile des Layouts von der Navigationsleiste überlagert werden, ist dies nützlich, wenn die Navigationsleiste in Ihrer App häufig mit SYSTEM_UI_FLAG_HIDE_NAVIGATION ein- und ausgeblendet wird, da so verhindert wird, dass sich das Layout jedes Mal an die neuen Layoutgrenzen anpasst, wenn die Navigationsleiste ein- oder ausgeblendet wird.
SYSTEM_UI_FLAG_LAYOUT_STABLE
Du kannst dieses Flag hinzufügen, wenn du SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN und/oder SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION verwendest, damit die definierten Ränder beim Aufrufen von fitSystemWindows() für eine Ansicht in Bezug auf den verfügbaren Bildschirmbereich konsistent bleiben. Wenn dieses Flag gesetzt ist, verhält sich fitSystemWindows() so, als wäre die Sichtbarkeit der System-UI-Elemente unverändert, auch wenn Sie die gesamte System-UI ausgeblendet haben.

Weitere Informationen zu den anderen zugehörigen Flags für die System-UI finden Sie unter Android 4.0.

Remote-Ansichten

GridLayout und ViewStub sind jetzt verschiebbare Ansichten, sodass Sie sie in Layouts für Ihre App-Widgets und benutzerdefinierten Benachrichtigungslayouts verwenden können.

Schriftfamilien

Android 4.1 bietet mehrere weitere Varianten des Roboto-Schriftstils, insgesamt zehn. Sie können alle in Apps verwendet werden. Ihre Anwendungen haben jetzt Zugriff auf den gesamten Satz an leichten und komprimierten Varianten.

Die folgenden Schriftartenvarianten von Roboto sind verfügbar:

  • Normal
  • Kursiv
  • Fett
  • Fett-kursiv
  • Leicht
  • Light-italic
  • Kompakt, normal
  • Gestrichelte Kursivschrift
  • Komprimiert fett
  • Komprimiert, fett-kursiv

Sie können eine dieser Optionen mit dem neuen Attribut fontFamily in Kombination mit dem Attribut textStyle anwenden.

Folgende Werte werden für fontFamily unterstützt:

  • "sans-serif" für die reguläre Roboto-Schriftart
  • "sans-serif-light" für Roboto Light
  • "sans-serif-condensed" für Roboto Condensed

Sie können dann mit den textStyle-Werten "bold" und "italic" Fettdruck und/oder Kursivschrift anwenden. Sie können beide anwenden: android:textStyle="bold|italic".

Sie können auch Typeface.create() verwenden. Beispiel: Typeface.create("sans-serif-light", Typeface.NORMAL).

Eingabe-Framework

Mehrere Eingabegeräte

Mit der neuen Klasse InputManager können Sie die derzeit verbundenen Eingabegeräte abfragen und sich benachrichtigen lassen, wenn ein neues Gerät hinzugefügt, geändert oder entfernt wird. Das ist besonders nützlich, wenn Sie ein Spiel entwickeln, das mehrere Spieler unterstützt, und Sie erkennen möchten, wie viele Controller verbunden sind und wann sich die Anzahl der Controller ändert.

Durch Aufrufen von getInputDeviceIds() können Sie alle verbundenen Eingabegeräte abfragen. Dadurch wird ein Array von Ganzzahlen zurückgegeben, die jeweils die ID eines anderen Eingabegeräts sind. Sie können dann getInputDevice() aufrufen, um eine InputDevice für eine angegebene Eingabegeräte-ID abzurufen.

Wenn Sie informiert werden möchten, wenn neue Eingabegeräte verbunden, geändert oder getrennt werden, implementieren Sie die InputManager.InputDeviceListener-Schnittstelle und registrieren Sie sie bei registerInputDeviceListener().

Bei Eingaben vibrieren

Wenn verbundene Eingabegeräte eigene Vibrationsfunktionen haben, können Sie die Vibration dieser Geräte jetzt über die vorhandenen Vibrator APIs steuern, indem Sie einfach getVibrator() auf der InputDevice aufrufen.

Berechtigungen

Folgende Berechtigungen sind neu:

READ_EXTERNAL_STORAGE
Ermöglicht geschützten Lesezugriff auf externen Speicher. Unter Android 4.1 haben alle Anwendungen standardmäßig Lesezugriff. In einem zukünftigen Release wird dies geändert, sodass Anwendungen den Lesezugriff mit dieser Berechtigung explizit anfordern müssen. Wenn Ihre Anwendung bereits Schreibzugriff anfordert, erhält sie automatisch auch Lesezugriff. Es gibt eine neue Entwickleroption, mit der die Einschränkung des Lesezugriffs aktiviert werden kann. So können Entwickler ihre Apps auf das zukünftige Verhalten von Android testen.
android.Manifest.permission.READ_USER_DICTIONARY
Ermöglicht einer App das Lesen des Wörterbuchs. Dies sollte nur von einer IME oder einem Wörterbucheditor wie der Einstellungen App erforderlich sein.
READ_CALL_LOG
Ermöglicht einer App, das Anrufprotokoll des Systems zu lesen, das Informationen zu ein- und ausgehenden Anrufen enthält.
WRITE_CALL_LOG
Ermöglicht einer App, die auf Ihrem Smartphone gespeicherte Anrufliste des Systems zu ändern
android.Manifest.permission.WRITE_USER_DICTIONARY
Ermöglicht einer App, in das Wörterbuch des Nutzers zu schreiben.

Gerätefunktionen

Android 4.1 enthält eine neue Funktiondeklaration für Geräte, die speziell für die Darstellung der Benutzeroberfläche auf einem Fernsehbildschirm vorgesehen sind: FEATURE_TELEVISION. Wenn Ihre App eine Fernsehoberfläche benötigt, deklarieren Sie diese Funktion in Ihrer Manifestdatei mit dem Element <uses-feature>:

<manifest ... >
    <uses-feature android:name="android.hardware.type.television"
                  android:required="true" />
    ...
</manifest>

Für diese Funktion ist „Fernsehen“ ein typisches Fernseherlebnis im Wohnzimmer: Wird auf einem großen Bildschirm gezeigt, auf dem der Nutzer weit weg sitzt und die dominante Form etwa ein Steuerkreuz ist und in der Regel nicht durch Berührung oder Maus oder Zeiger bedient wird.