APIs unter Android 4.1

API-Level: 16

Android 4.1 (JELLY_BEAN) ist eine Weiterentwicklung der Plattform, die verbesserte und eine bessere Nutzererfahrung bieten. Neue Funktionen für Nutzer und Apps zu entwickeln. In diesem Dokument erhalten Sie eine Einführung in die wichtigsten nützliche neue APIs für App-Entwickler.

Als App-Entwickler steht Android 4.1 in der SDK-Manager als System-Image, das Sie und einer SDK-Plattform, mit der Sie Ihre App erstellen können. Sie sollten Laden Sie so schnell wie möglich das System-Image und die Plattform herunter, um Ihr für Android 4.1.

Um deine App für Geräte mit Android 4.1 besser zu optimieren, sollten Sie Ihr targetSdkVersion auf "16", installieren Sie es auf einem System-Image von Android 4.1, testen und ein Update mit dieser Änderung veröffentlichen.

Ich APIs in Android 4.1 verwenden und gleichzeitig ältere Versionen unterstützen, indem hinzufügen, die vor der Ausführung auf die API-Ebene des Systems prüfen. APIs werden von deinem minSdkVersion nicht unterstützt. Weitere Informationen über Informationen zur Aufrechterhaltung der Abwärtskompatibilität finden Sie unter Abwärtskompatibilität erstellen Benutzeroberflächen.

Weitere Informationen zur Funktionsweise von API-Ebenen finden Sie unter Was ist eine API? Stufe?

App-Komponenten

Isolierte Dienste

Durch Angabe von android:isolatedProcess="true" im Feld <service>-Tag verwenden, wird Ihre Service ausgeliefert unter isolierten User-ID-Prozess, der über keine eigenen Berechtigungen verfügt.

Arbeitsspeicherverwaltung

Neue ComponentCallbacks2-Konstanten wie TRIM_MEMORY_RUNNING_LOW und TRIM_MEMORY_RUNNING_CRITICAL stellen den Vordergrund zur Verfügung. verarbeitet weitere Informationen über bevor das System onLowMemory() aufruft.

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

Contentanbieter

Mit der neuen Methode acquireUnstableContentProviderClient() können Sie auf ein ContentProviderClient zugreifen, das möglicherweise „instabil“ ist sodass Ihre App nicht abstürzt, was der Contentanbieter tut. Das ist nützlich, wenn Sie mit Contentanbietern in einem separaten

Live-Hintergründe

Neues Intent-Protokoll zum direkten Starten der Vorschauaktivität für Live-Hintergründe Benutzer können deinen Live-Hintergrund einfach auswählen, ohne sie zu verlassen Ihre App und navigieren Sie durch die Hintergrundauswahl für den Startbildschirm.

Rufe zum Starten der Live-Hintergrundauswahl startActivity() mit einem Intent auf: ACTION_CHANGE_LIVE_WALLPAPER und ein Extra , der deinen Live-Hintergrund ComponentName als String in EXTRA_LIVE_WALLPAPER_COMPONENT angibt.

Navigation im App-Stack

Mit Android 4.1 ist es viel einfacher, die richtigen Designmuster für die Aufwärtsnavigation zu implementieren. Sie müssen nur das android:parentActivityName jedem <activity>-Element in Ihre Manifestdatei. Das System verwendet diese Informationen, um die entsprechende Aktivität zu öffnen, wenn der Nutzer drückt die Nach-oben-Taste in der Aktionsleiste (während gleichzeitig die aktuelle Aktivität beendet wird). Wenn Sie also das android:parentActivityName für jede Aktivität deklarieren, Sie benötigen die onOptionsItemSelected()-Methode nicht für die Verarbeitung des Klicks auf dem App-Symbol der Aktionsleiste angezeigt. Das System verarbeitet dieses Ereignis jetzt die entsprechende Aktivität erstellt.

Das ist besonders nützlich, wenn der Nutzer eine App-Aktivität ausführt. genauer unter die Lupe nehmen wie z. B. über eine Benachrichtigung oder einen Intent Apps verwenden (wie im Designleitfaden für die Navigation zwischen Apps beschrieben). Wann? wenn der Nutzer Ihre Aktivität auf diese Weise eingibt, hat Ihre App nicht unbedingt einen Back-Stack von Aktivitäten, die fortgesetzt werden können, wenn die Nutzenden nach oben navigieren. Wenn Sie jedoch das Attribut android:parentActivityName für Ihre Aktivitäten angeben, erkennt das System ob Ihre App bereits einen Back-Stack übergeordneter Aktivitäten enthält und, falls nicht, Konstrukte einen synthetischen Back-Stack, der alle übergeordneten Aktivitäten enthält.

Hinweis:Wenn der Nutzer eine tiefgreifende Aktivität in Ihrer App eingibt und wird eine neue Aufgabe für Ihre App erstellt. Das System fügt den Stapel der übergeordneten Aktivitäten ein. in die Aufgabe einfließen lassen. Durch Drücken der Schaltfläche „Zurück“ können Sie also auch durch den Stapel der übergeordneten Elemente Aktivitäten.

Wenn das System einen synthetischen Back-Stack für Ihre App erstellt, generiert es eine einfache Intent, um eine neue Instanz jeder übergeordneten Aktivität zu erstellen. Es gibt also keine für die übergeordneten Aktivitäten so gespeichert, wie Sie es vom Nutzer erwartet hätten bis für jede Aktivität. Wenn bei einer der übergeordneten Aktivitäten normalerweise eine Benutzeroberfläche angezeigt wird, Kontext des Nutzers, fehlen diese Kontextinformationen und Sie sollten sie liefern, Nutzer navigiert im Stapel zurück. Wenn sich der Nutzer beispielsweise ein Album ansieht, in einer Musik-App angezeigt wird, gelangen sie möglicherweise zu einer Aktivität, in der alle Alben in einem Musikgenre. Wenn der Stack erstellt werden muss, müssen Sie in diesem Fall das übergeordnete Element geben an, zu welchem Genre das aktuelle Album gehört, damit das übergeordnete Element die entsprechende Liste als ob die Nutzenden tatsächlich von dieser Aktivität stammen. Um solche Informationen an ein synthetisches übergeordnetes Element zu senden Aktivität führen, müssen Sie die Methode onPrepareNavigateUpTaskStack() überschreiben. Dieses stellt ein TaskStackBuilder-Objekt bereit, das vom System erstellt wurde, um die übergeordneten Aktivitäten zusammenführen. TaskStackBuilder enthält Intent-Objekte, mit denen das System die einzelnen übergeordneten Aktivitäten erstellt. In der Implementierung von onPrepareNavigateUpTaskStack() können Sie die entsprechende Intent ändern, um zusätzliche Daten hinzufügen, anhand derer die übergeordnete Aktivität den entsprechenden Kontext bestimmen und die entsprechende Benutzeroberfläche.

Wenn das System TaskStackBuilder erstellt, fügt es die Intent-Objekte, die zum Erstellen der übergeordneten Aktivitäten verwendet werden, in ihrer logischen beginnend am Anfang des Aktivitätsbaums. Die letzte Intent, die dem internen Array hinzugefügt wird, 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. Legen Sie zuerst fest, Länge des Arrays mit getIntentCount() und übergeben Sie Wert auf editIntentAt() setzen.

Wenn Ihre App-Struktur komplexer ist, gibt es mehrere andere APIs. mit denen Sie das Verhalten der Aufwärts- und den synthetischen Back-Stack vollständig anpassen. Einige der APIs, die Ihnen zusätzliche enthalten:

onNavigateUp()
Überschreibe dies, um eine benutzerdefinierte Aktion auszuführen, wenn der Nutzer die Aufwärtstaste drückt.
navigateUpTo(Intent)
Klicken Sie auf diesen Link, um die aktuelle Aktivität abzuschließen und zu der über das Intent bereitgestellt. Wenn die Aktivität im Back-Stack vorhanden ist, nicht dem nächsten übergeordneten Element zugeordnet ist, werden alle anderen Aktivitäten zwischen der aktuellen Aktivität und dem mit dem Intent angegebene Aktivität ebenfalls abgeschlossen werden.
getParentActivityIntent()
Rufen Sie dies auf, um das Intent abzurufen, das die logische Abfrage startet. übergeordnetes Element für die aktuelle Aktivität.
shouldUpRecreateTask(Intent)
Mit diesem Befehl wird abgefragt, ob ein synthetischer Back-Stack erstellt werden muss, um zwischen nach oben. Gibt „true“ zurück, wenn ein synthetischer Stack erstellt werden muss, und „false“, wenn der entsprechende Stack erstellt wird existiert bereits.
finishAffinity()
Rufen Sie diesen Befehl auf, um die aktuelle Aktivität und alle übergeordneten Aktivitäten mit die an die aktuelle Aktivität gekettet sind. Wenn Sie die Standardeinstellungen wie onNavigateUp(), sollten Sie diese Methode aufrufen, und einen synthetischen Back-Stack über die Aufwärts-Navigation 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 Ihren Back Stack nur zusätzliche Daten hinzufügen möchten, sollten Sie stattdessen onPrepareNavigateUpTaskStack() überschreiben.

Die meisten Apps benötigen diese APIs jedoch nicht und implementieren keine onPrepareNavigateUpTaskStack(). Das korrekte Verhalten lässt sich jedoch ganz einfach durch folgende Maßnahmen erreichen: indem Sie jedem <activity>-Element android:parentActivityName hinzufügen.

Multimedia

Medien-Codecs

Die Klasse MediaCodec bietet Zugriff auf untergeordnete Medien-Codecs für die Codierung und Decodierung Ihrer Medien. Sie können eine MediaCodec instanziieren, indem Sie createEncoderByType() aufrufen, um Medien zu codieren, oder createDecoderByType(), um Medien zu decodieren. Jede dieser Optionen verwenden einen MIME-Typ für den Medientyp, den Sie codieren oder decodieren möchten, z. B. "video/3gpp" oder "audio/vorbis".

Nachdem eine Instanz von MediaCodec erstellt wurde, können Sie configure() aufrufen, um Attribute wie das Medienformat oder ob die Inhalte verschlüsselt sind.

Unabhängig davon, ob Sie Ihre Medien codieren oder decodieren, ist der Rest des Vorgangs gleich, nachdem Sie MediaCodec erstellen. Erster Aufruf von getInputBuffers(), um ein Array der Eingabe-ByteBuffer abzurufen -Objekten und getOutputBuffers(), um ein Array von ByteBuffer-Ausgabeobjekten zu erhalten.

Wenn Sie zum Codieren oder Decodieren bereit sind, rufen Sie dequeueInputBuffer() auf, um die Indexposition der ByteBuffer (aus dem Array der Eingabepuffer) abzurufen, die Sie zum Einspeisen in Ihre Quelle verwenden sollten. Medien. Nachdem du das ByteBuffer mit deinen Quellmedien gefüllt hast, musst du die Eigentumsrechte freigeben des Zwischenspeichers durch Aufrufen von queueInputBuffer().

Ebenso für den Ausgabepuffer: Rufen Sie dequeueOutputBuffer() auf, um die Indexposition von ByteBuffer abzurufen. wo Sie die Ergebnisse erhalten. Nachdem Sie die Ausgabe aus ByteBuffer gelesen haben, durch Aufrufen von releaseOutputBuffer() die Eigentumsrechte freigeben.

Du kannst verschlüsselte Mediendaten in den Codecs verarbeiten, indem du queueSecureInputBuffer() in Verbindung mit die MediaCrypto APIs anstelle des normalen queueInputBuffer().

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

Audio für Cue aufnehmen

Die neue Methode startRecording() ermöglicht beginnst du mit der Audioaufnahme basierend auf einem durch MediaSyncEvent definierten Hinweis. MediaSyncEvent gibt eine Audiositzung an. (z. B. durch MediaPlayer definiert), die nach Abschluss des Vorgangs ausgelöst wird. den Audiorekorder, um die Aufnahme zu starten. Sie können diese Funktion beispielsweise nutzen, Einen Ton abspielen, der den Beginn einer Aufnahme und einer Aufzeichnung anzeigt wird automatisch gestartet, sodass du Ton und Anfang nicht manuell synchronisieren musst der Aufzeichnung.

Zeitgesteuerte Texttracks

MediaPlayer kann jetzt sowohl In-Band- als auch Out-of-Band-Texttracks verarbeiten. In-Band-Textspuren werden als Textspuren in einer MP4- oder 3GPP-Medienquelle bereitgestellt. Out-of-Band-Text Tracks können mit der Methode addTimedTextSource() als externe Textquelle hinzugefügt werden. Nach dem gesamten externen Text Trackquellen hinzugefügt wurden, sollte getTrackInfo() aufgerufen werden, um Die aktualisierte Liste aller verfügbaren Tracks in einer Datenquelle.

Um den Track für die Verwendung mit MediaPlayer festzulegen, musst du selectTrack() mit dem Index aufrufen Position für den gewünschten Titel ein.

Um benachrichtigt zu werden, wenn der Texttrack wiedergegeben werden kann, implementiere MediaPlayer.OnTimedTextListener-Schnittstelle und Karte/Ticket es an setOnTimedTextListener().

Audio-Effekte

Der AudioEffect-Kurs unterstützt jetzt zusätzliche Audiodateien Vorverarbeitungstypen bei der Audioaufnahme verwenden:

  • Akustik-Echo-Canceler (AEC) mit AcousticEchoCanceler entfernt den Beitrag des von der anderen Partei empfangenen Signals aus dem aufgezeichneten Audiosignal.
  • Automatische Verstärkungsregelung mit AutomaticGainControl und normalisiert die Ausgabe des erfassten Signals automatisch.
  • Geräuschunterdrückung (NS) mit NoiseSuppressor werden Hintergrundgeräusche aus dem aufgenommenen Signal entfernt.

Du kannst diese Präprozessor-Effekte auf Audioinhalte anwenden, die mit einem AudioRecord mit einer der AudioEffect aufgenommen wurden abgeleiteten Klassen.

Hinweis:Es kann nicht garantiert werden, dass diese Funktionen auf allen Geräten unterstützt werden. Auswirkungen. Sie sollten daher immer zuerst die Verfügbarkeit prüfen, indem Sie isAvailable() auf der entsprechenden Audioeffektklasse.

Unterbrechungsfreie Wiedergabe

Sie können jetzt zwischen zwei getrennten Geräten MediaPlayer-Objekte. Sie können jederzeit vor dem Ende der ersten MediaPlayer setNextMediaPlayer() und Android anrufen versucht, den zweiten Spieler in dem Moment zu starten, in dem der erste beendet wird.

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

Kamera

Bewegung des Autofokus

Mit der neuen Camera.AutoFocusMoveCallback-Oberfläche kannst du für Änderungen an der Autofokusbewegung. Sie können Ihre Schnittstelle bei setAutoFocusMoveCallback() registrieren. Wenn die Kamera dann befindet sich im kontinuierlichen Autofokusmodus (FOCUS_MODE_CONTINUOUS_VIDEO oder FOCUS_MODE_CONTINUOUS_PICTURE), erhältst du einen Anruf an onAutoFocusMoving(), Gibt an, ob der Autofokus eine Bewegung begonnen hat oder aufgehört hat.

Kameratöne

Die Klasse MediaActionSound bietet einen einfachen Satz von APIs zum Erstellen von Standardtöne, die von der Kamera oder anderen Medienaktionen abgespielt werden Sie sollten diese APIs verwenden, um beim Bau einer benutzerdefinierten Stand- oder Videokamera den richtigen Ton verwenden.

Instanziieren Sie zum Abspielen eines Tons einfach ein MediaActionSound-Objekt, rufen Sie load(), um den gewünschten Ton vorab zu laden, und dann im zur richtigen Zeit: Rufen Sie play() an.

Konnektivität

Android Beam

Android BeamTM unterstützt jetzt die Übertragung großer Nutzlasten über Bluetooth. Wenn Sie die Daten definieren, zum Übertragen mit dem neuen setBeamPushUris() oder der neuen Callback-Oberfläche NfcAdapter.CreateBeamUrisCallback, Android die Datenübertragung an Bluetooth oder einen anderen schnellere Übertragungsgeschwindigkeiten. Dies 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 , um die Übertragung über Bluetooth zu nutzen.

Die Methode setBeamPushUris() verwendet ein Array von Uri-Objekte, die die Daten angeben, die Sie aus Ihrer App übertragen möchten. Alternativ können Sie den NfcAdapter.CreateBeamUrisCallback implementieren die Sie für Ihre Aktivität durch Aufrufen von setBeamPushUrisCallback() angeben können.

Bei Verwendung des Callback-Schnittstelle aufgerufen, ruft das System die createBeamUris()-Methode der Schnittstelle auf, wenn die -Nutzer führt eine Freigabe mit Android Beam aus, sodass du die URIs definieren kannst, die bei der Freigabe geteilt werden sollen. Dies ist nützlich, wenn die freizugebenden URIs je nach Nutzerkontext im Aktivität ausgeführt werden soll, während das Aufrufen von setBeamPushUris() sind nützlich, wenn sich die freizugebenden URIs nicht ändern und Sie sie im Voraus bedenkenlos definieren können.

Diensterkennung

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

Das neue Paket android.net.nsd enthält die neuen APIs, mit denen du Ihre Dienste im lokalen Netzwerk zu senden, lokale Geräte im Netzwerk zu finden und mit Geräten verbinden können.

Zum Registrieren Ihres Dienstes müssen Sie zuerst ein NsdServiceInfo erstellen -Objekt und definieren die verschiedenen Eigenschaften Ihres Dienstes mit Methoden wie setServiceName(), setServiceType() und setPort().

Dann müssen Sie NsdManager.RegistrationListener implementieren und übergeben es an registerService() mit deinem NsdServiceInfo.

Implementieren Sie NsdManager.DiscoveryListener und übergeben Sie es an discoverServices(), um Dienste im Netzwerk zu erkennen.

Wenn NsdManager.DiscoveryListener Rückrufe zu Diensten erhält gefunden haben, müssen Sie den Dienst auflösen, indem Sie resolveService(), übergeben Sie Implementierung von NsdManager.ResolveListener, die Ein NsdServiceInfo-Objekt, das Informationen zum erkannten Dienst, sodass Sie die Verbindung herstellen können.

WLAN-P2P-Diensterkennung

Die Wi-Fi P2P APIs wurden in Android 4.1 optimiert, um die Diensterkennung vor der Verknüpfung in WifiP2pManager. So können Sie nach Orten in der Nähe suchen und diese filtern. nach Diensten über Wi-Fi-P2P sortiert, bevor eine Verbindung hergestellt wird, während Mit der Erkennungsfunktion können Sie einen Dienst in einem bestehenden verbundenen Netzwerk finden, beispielsweise in einem lokalen WLAN. Netzwerk).

Um Ihre App als Dienst über WLAN zu übertragen, damit andere Geräte sie erkennen können und eine Verbindung herstellen, rufen Sie addLocalService() mit einer WifiP2pServiceInfo-Objekt, das Ihre Anwendungsdienste beschreibt.

Um die Erkennung von Geräten in der Nähe über WLAN zu ermöglichen, müssen Sie zuerst entscheiden, Bonjour oder Upnp verwenden. Richten Sie zur Verwendung von Bonjour zunächst einige Callback-Listener mit setDnsSdResponseListeners() für WifiP2pManager.DnsSdServiceResponseListener und WifiP2pManager.DnsSdTxtRecordListener. Um Upnp zu verwenden, rufen Sie setUpnpServiceResponseListener() für WifiP2pManager.UpnpServiceResponseListener.

Bevor du Dienste auf lokalen Geräten entdecken kannst, musst du auch addServiceRequest() anrufen. Wenn die WifiP2pManager.ActionListener, die Sie an diese Methode übergeben, ein erfolgreichem Rückruf erfolgreich ist, kannst du dann Dienste auf lokalen Geräten suchen, indem du discoverServices() aufrufst.

Wenn lokale Dienste erkannt werden, erhältst du einen Callback an WifiP2pManager.DnsSdServiceResponseListener oder WifiP2pManager.UpnpServiceResponseListener, je nachdem, ob du zur Nutzung von Bonjour oder Upnp registriert. Der empfangene Rückruf enthält in beiden Fällen eine Ein WifiP2pDevice-Objekt, das das Peer-Gerät darstellt.

Netzwerknutzung

Mit der neuen Methode isActiveNetworkMetered() können Sie Prüfe, ob das Gerät derzeit mit einem kostenpflichtigen Netzwerk verbunden ist. Durch Prüfen dieses Status bevor Sie intensive Netzwerktransaktionen durchführen, können Sie dabei helfen, die Datennutzung in den Griff zu bekommen. fundierte Entscheidungen darüber, ob die Transaktionen jetzt oder später durchgeführt werden sollen, z. B. wann Gerät mit dem WLAN verbunden wird.

Bedienungshilfen

Bedienungshilfen-APIs

Die Reichweite von Bedienungshilfen-APIs wurde in Android 4.1 deutlich erhöht. Jetzt ermöglicht das Erstellen von Diensten, die mehr Eingabeereignisse, wie z. B. komplexe Gesten, überwachen und darauf reagieren mit onGesture() und anderen Eingabeereignisse durch Ergänzungen der Klassen AccessibilityEvent, AccessibilityNodeInfo und AccessibilityRecord.

Bedienungshilfen können auch Aktionen im Namen des Nutzers ausführen, wie z. B. das Klicken, zum Scrollen und zum Blättern durch Text mit performAction und setMovementGranularities. Die Methode performGlobalAction() Dienste können außerdem Aktionen wie „Zurück“, „Startseite“ und „Letzte“ Apps und Benachrichtigungen.

Anpassbare App-Navigation

Beim Erstellen einer Android-App können Sie jetzt Navigationsschemas anpassen, indem Sie und Eingabe-Widgets mit findFocus() und focusSearch() hinzufügen und den Fokus festlegen mit setAccessibilityFocused().

Besser zugängliche Widgets

Mit der neuen Klasse android.view.accessibility.AccessibilityNodeProvider können Sie komplexe benutzerdefinierte Ansichten für Bedienungshilfen zugänglich machen, damit sie die Informationen in einem zugänglicher machen. Mit der android.view.accessibility.AccessibilityNodeProvider kann ein Nutzer ein Widget mit erweiterten Inhalten wie einem Kalenderraster zur Darstellung einer logischen semantischen Struktur für Bedienungshilfen, die vollständig von der Layoutstruktur des Widgets getrennt sind. Diese Semantik Struktur ermöglicht es Bedienungshilfen, ein nützlicheres Interaktionsmodell für Nutzende zu präsentieren, die sehbehindert sind.

Copy and Paste

Mit Intents kopieren und einfügen

Du kannst jetzt mithilfe der Methode setClipData() ein ClipData-Objekt mit einem Intent verknüpfen. Dies ist besonders nützlich, wenn mit einem Intent mehrere content:-URIs an einen anderen z. B. wenn Sie mehrere Dokumente gemeinsam nutzen. Die angegebenen content:-URIs Auf diese Weise werden auch die Flags des Intents berücksichtigt, sodass Sie Lese- oder Schreibzugriff gewähren können. Zugriff auf mehrere URIs in einem Intent. Beim Starten eines ACTION_SEND- oder ACTION_SEND_MULTIPLE-Intents sind die im Intent angegebenen URIs jetzt automatisch an ClipData weitergegeben, damit der Empfänger Zugriffsrechte gewährt wird.

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

Die ClipData-Klasse unterstützt jetzt formatierten Text (entweder als HTML- oder Android Design Strings) fest. Mit newHtmlText() kannst du dem ClipData Text im HTML-Format hinzufügen.

RenderScript

Die Renderscript-Berechnungsfunktionen wurden um folgende Funktionen erweitert:

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

Es stehen auch neue Pragma-Werte zur Verfügung, mit denen Sie die für Ihre Renderscripts zu berechnen. So können Sie NEON-ähnliche Operationen wie schnelle Vektormathematiken aktivieren im CPU-Pfad, der mit dem vollen IEEE 754-2008-Standard nicht möglich wäre.

Hinweis:Die experimentelle Renderscript-Grafik-Engine ist jetzt eingestellt.

Animation

Animationen zum Starten von Aktivitäten

Sie können jetzt ein Activity mit Zoomanimationen oder Animationen erstellen und bearbeiten. Um die gewünschte Animation anzugeben, verwenden Sie die ActivityOptions-APIs, um eine Bundle zu erstellen, die Sie übergeben Sie dann an eine der Methoden, die eine Aktivität starten, wie z. B. startActivity().

Die ActivityOptions-Klasse enthält jeweils eine andere Methode. Art der Animation, die Sie beim Öffnen der Aktivität anzeigen möchten:

makeScaleUpAnimation()
Erstellt eine Animation, bei der das Aktivitätsfenster ab einem bestimmten Startwert hochskaliert wird und eine festgelegte Ausgangsgröße haben. Der Startbildschirm in In Android 4.1 wird dies beim Öffnen einer App verwendet.
makeThumbnailScaleUpAnimation()
Erstellt eine Animation, bei der das Aktivitätsfenster ausgehend von einem bestimmten Position und ein bereitgestelltes Thumbnail-Bild. Das Fenster „Zuletzt verwendete Apps“ in In Android 4.1 wird das bei der Rückkehr zu einer App verwendet.
makeCustomAnimation()
Erstellt eine Animation, die von Ihren eigenen Ressourcen definiert ist: eine, die die Animation für die zu öffnende Aktivität und eine weitere für die angehaltene Aktivität.

Zeitanimation

Die neue TimeAnimator bietet einen einfachen Callback. mit dem TimeAnimator.TimeListener-Element, das auf jedem Frame der Animation. Bei diesem Animator gibt es keine Einstellung für Dauer, Interpolation oder Objektwert. Der Callback des Listeners empfängt Informationen für jeden Frame, einschließlich die gesamte verstrichene Zeit und die seit dem vorherigen Animationsframe verstrichene Zeit.

Benutzeroberfläche

Benachrichtigungen

In Android 4.1 können Sie Benachrichtigungen mit größeren Inhaltsbereichen, großen Bildvorschauen mehrere Aktionsschaltflächen und konfigurierbare Priorität.

Benachrichtigungsstile

Mit der neuen Methode setStyle() können Sie einem von drei neuen Stilen für die Benachrichtigung, dass jeder einen größeren Inhaltsbereich anbietet. Bis den Stil für den großen Inhaltsbereich angeben möchten, übergeben Sie setStyle() eines der folgenden Objekte:

Notification.BigPictureStyle
Für Benachrichtigungen mit einem großen Bild als Anhang.
Notification.BigTextStyle
Für Benachrichtigungen, die viel Text enthalten, 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 auf der Benachrichtigung angezeigt, ob für die Benachrichtigung der normale oder die größere Benachrichtigungsart verwendet wird.

Wenn Sie eine Aktionsschaltfläche hinzufügen möchten, rufen Sie addAction() auf. Diese Methode verwendet drei Argumente: eine Drawable-Ressource für ein Symbol, Text für die Schaltfläche und ein PendingIntent, das die Aktion definiert in Perfrom.

Prioritäten

Du kannst dem System jetzt mitteilen, wie wichtig deine Benachrichtigung für die Reihenfolge Ihrer Benachrichtigungen in der Liste, indem Sie die Priorität mit setPriority(). Ich kann eine von fünf verschiedenen Prioritätsstufen übergeben, die durch PRIORITY_*-Konstanten definiert sind in der Klasse Notification. Die Standardeinstellung ist PRIORITY_DEFAULT. Es gibt zwei höhere und zwei niedrigere Ebenen.

Benachrichtigungen mit hoher Priorität sind Dinge, auf die Nutzende im Allgemeinen schnell reagieren, wie z. B. eine neue Chat-Nachricht, eine SMS oder eine Erinnerung für einen anstehenden Termin. Niedrige Priorität Benachrichtigungen können beispielsweise abgelaufene Kalendertermine oder App-Werbung sein.

Steuerelemente für die System-UI

Unter Android 4.0 (Ice Cream Sandwich) wurden neue Flags hinzugefügt, um die Sichtbarkeit der System-UI zu steuern. Elemente, z. B. um das Erscheinungsbild der Systemleiste zu dimmen oder sie auf Mobilgeräten vollständig auszublenden. In Android 4.1 wurden weitere Flags hinzugefügt, mit denen Sie das Erscheinungsbild des Systems UI-Elemente und das Layout deiner Aktivität im Verhältnis dazu durch Aufrufen von setSystemUiVisibility() und die folgenden Flags übergeben:

SYSTEM_UI_FLAG_FULLSCREEN
Nicht kritische System-UI (z. B. die Statusleiste) wird ausgeblendet. Wird bei Ihrer Aktivität die Aktionsleiste im Overlay-Modus verwendet (durch android:windowActionBarOverlay aktivieren, blendet dieses Flag außerdem die Aktionsleiste aus und also mit einer koordinierten Animation, wenn beide aus- und eingeblendet werden.
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
Legt fest, dass für Ihr Aktivitätslayout derselbe Bildschirmbereich verwendet wird, der verfügbar ist, wenn Sie SYSTEM_UI_FLAG_FULLSCREEN aktiviert, auch wenn die System-UI-Elemente weiterhin sichtbar sind. Obwohl Teile Ihres Layouts vom System-UI angezeigt wird, ist dies nützlich, wenn Ihre App häufig die System-UI mit SYSTEM_UI_FLAG_FULLSCREEN, da so das Layout sich jedes Mal an die neuen Layoutgrenzen anpassen, wenn die System-UI aus- oder eingeblendet wird.
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
Legt fest, dass für Ihr Aktivitätslayout derselbe Bildschirmbereich verwendet wird, der verfügbar ist, wenn Sie aktiviert SYSTEM_UI_FLAG_HIDE_NAVIGATION (in Android 4.0 hinzugefügt) auch wenn die UI-Elemente des Systems noch sichtbar sind. Obwohl Teile Ihres Layouts überlagert vom Navigationsleiste verwenden, ist dies nützlich, wenn die Navigationsleiste in Ihrer App häufig ein- und ausgeblendet wird. mit SYSTEM_UI_FLAG_HIDE_NAVIGATION, da so verhindert wird, dass Ihr Layout Anpassung an die neuen Layoutgrenzen jedes Mal, wenn die Navigationsleiste ein- oder ausgeblendet wird.
SYSTEM_UI_FLAG_LAYOUT_STABLE
Dieses Flag sollten Sie hinzufügen, wenn Sie SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN und/oder SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION verwenden, damit bei Ihrem Anruf fitSystemWindows() für eine Ansicht, Die definierten Grenzen bleiben in Bezug auf den verfügbaren Bildschirmbereich einheitlich. Wenn dieses Flag festgelegt ist, verhält sich fitSystemWindows() also so, als wäre die Sichtbarkeit der System-UI-Elemente unverändert auch nachdem Sie die gesamte System-UI ausgeblendet haben.

Weitere Informationen zu anderen verwandten System-UI-Flags finden Sie unter die in Android 4.0 hinzugefügt wurden.

Remote-Ansichten

GridLayout und ViewStub sind jetzt entfernbare Ansichten, sodass Sie sie in Layouts für Ihre App-Widgets und benutzerdefinierte Layouts für Benachrichtigungen.

Schriftfamilien

Unter Android 4.1 werden weitere Varianten des Roboto-Schriftstils hinzugefügt, sodass insgesamt zehn Varianten verfügbar sind. und können von Apps genutzt werden. Ihre Apps haben jetzt Zugriff auf alle Leucht- und Varianten zusammengefasst.

Alle verfügbaren Roboto-Schriftartvarianten sind:

  • Normal
  • Kursiv
  • Fett
  • Fett-kursiv
  • Leicht
  • Hell-kursiv
  • Kondensiertes Regulär
  • Schmal und kursiv
  • Komprimiert fett
  • Komprimiert (fett/kursiv)

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

Unterstützte Werte für fontFamily sind:

  • "sans-serif" für reguläres Roboto
  • "sans-serif-light" für Roboto Light
  • "sans-serif-condensed" für Roboto Condensed

Anschließend können Sie Werte für textStyle fett und/oder kursiv formatieren "bold" und "italic". 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 Gruppe von Eingabegeräten, die aktuell verbunden sind und registriert werden, um benachrichtigt zu werden, wenn ein neues Gerät hinzugefügt, geändert oder entfernt wird. Das ist besonders nützlich, wenn Sie ein Spiel das mehrere Spieler unterstützt und du wissen möchtest, wie viele Controller verbunden sind und wenn sich die Anzahl der Controller ändert.

Sie können alle verbundenen Eingabegeräte abfragen, indem Sie getInputDeviceIds() Dadurch wird zurückgegeben, Array von Ganzzahlen, von denen jede eine ID für ein anderes Eingabegerät ist. Sie können dann getInputDevice() zum Kauf Ein InputDevice für eine angegebene Eingabegeräte-ID.

Wenn Sie informiert werden möchten, wenn neue Eingabegeräte verbunden, geändert oder getrennt werden, gehen Sie so vor: Implementieren der InputManager.InputDeviceListener-Schnittstelle und und es bei registerInputDeviceListener() registrieren.

Bei Eingabe-Controllern vibrieren

Wenn verbundene Eingabegeräte eigene Vibrationsfunktionen haben, können Sie jetzt die Vibration dieser Geräte über die vorhandenen Vibrator-APIs indem du getVibrator() im InputDevice aufrufst.

Berechtigungen

Die folgenden neuen Berechtigungen sind verfügbar:

READ_EXTERNAL_STORAGE
Bietet geschützten Lesezugriff auf externen Speicher. In Android 4.1 von standardmäßig alle Anwendungen gelesen Zugriff haben. Dies wird in einer zukünftigen Version geändert, sodass Anwendungen dies explizit anfordern müssen. mit dieser Berechtigung Lesezugriff gewähren. Wenn Ihre Anwendung bereits Schreibzugriff anfordert, erhalten automatisch auch Lesezugriff. Es gibt eine neue Entwickleroption, mit der der Lesezugriff aktiviert werden kann eingeschränkt, damit Entwickler ihre Apps mit dem aktuellen Verhalten von Android im zu entwickeln.
android.Manifest.permission.READ_USER_DICTIONARY
Ermöglicht einer App das Lesen des Wörterbuchs. Dies sollte nur für einen IME oder einen Wörterbucheditor wie die App „Einstellungen“ verwenden.
READ_CALL_LOG
Ermöglicht einer App, das Anrufprotokoll des Systems zu lesen, das Informationen zu eingehende und ausgehende Anrufe.
WRITE_CALL_LOG
Ermöglicht einer App, die auf deinem 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

Unter Android 4.1 gibt es eine neue Erklärung zu Funktionen für zweckbestimmte Geräte zur Darstellung der Benutzeroberfläche auf einem Fernsehbildschirm: FEATURE_TELEVISION. So geben Sie an, dass für Ihre App Folgendes erforderlich ist: TV-Schnittstelle verwenden, 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>

Diese Funktion definiert „Fernsehen“ wie beim Fernsehen im Wohnzimmer: die auf einem großen Bildschirm dargestellt werden, auf dem die Nutzenden weit weg sitzen und die dominante Form Die Eingabe erfolgt in etwa wie ein Steuerkreuz, in der Regel nicht durch Berührung oder Maus-/Zeigergerät an.