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.
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 mitSYSTEM_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. mitSYSTEM_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/oderSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
verwenden, damit bei Ihrem AnruffitSystemWindows()
für eine Ansicht, Die definierten Grenzen bleiben in Bezug auf den verfügbaren Bildschirmbereich einheitlich. Wenn dieses Flag festgelegt ist, verhält sichfitSystemWindows()
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.