APIs unter Android 4.2

API-Level: 17

Android 4.2 (JELLY_BEAN_MR1) ist ein Update für die Jelly Bean-Version, das neue Funktionen für Nutzer und die App bietet. zu entwickeln. In diesem Dokument erhalten Sie eine Einführung in die wichtigsten nützliche neue APIs für Entwickler.

Als App-Entwickler sollten Sie das Android 4.2-System-Image und die SDK-Plattform von SDK-Manager so schnell wie möglich aufrufen. Wenn Sie kein Gerät mit Android 4.2 haben, auf dem Sie Ihre App testen können, verwenden Sie das Android 4.2-System. um Ihre App im Android Emulator zu testen. Entwickeln Sie dann Ihre Apps für die Android 4.2-Plattform, um die neuesten APIs zu nutzen.

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

Ich APIs in Android 4.2 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?

Wichtige Verhaltensänderungen

Wenn Sie bereits eine App für Android veröffentlicht haben, beachten Sie bitte Folgendes: Änderungen, die sich auf das Verhalten Ihrer App auswirken können:

  • Contentanbieter werden nicht mehr standardmäßig exportiert. Das heißt, der Standardwert für das Attribut android:exported ist jetzt “false". Wenn es wichtig ist, dass andere Apps auf Ihren Contentanbieter zugreifen können, müssen Sie jetzt explizit android:exported="true" festlegen.

    Diese Änderung wird nur wirksam, wenn du android:targetSdkVersion oder android:minSdkVersion auf 17 oder höher setzt. Andernfalls ist der Standardwert immer noch “true". auch unter Android 4.2 und höher.

  • Im Vergleich zu früheren Android-Versionen sind die Ergebnisse zum Nutzerstandort eventuell weniger genau Ihre App die Berechtigung ACCESS_COARSE_LOCATION anfordert, aber fordert die Berechtigung ACCESS_FINE_LOCATION nicht an.

    Um die Datenschutzerwartungen der Nutzer zu erfüllen, wenn Ihre App Berechtigungen für ungefähren Standort (und keinen genauen Standort), erstellt das System keine Standortschätzung genauer als ein Häuserblock.

  • Einige von Settings.System definierte Geräteeinstellungen sind jetzt schreibgeschützt sein. Wenn deine App versucht, Änderungen an den in Settings.System definierten Einstellungen zu schreiben, die in Settings.Global verschoben wurden, unter Android 4.2 und höher schlägt der Schreibvorgang im Hintergrund fehl.

    Auch wenn Ihr Wert für android:targetSdkVersion und android:minSdkVersion niedriger als 17 ist, kann Ihre App die Einstellungen nicht ändern, die auf Settings.Global verschoben, wenn das Gerät mit Android 4.2 und höher ausgeführt wird.

  • Wenn deine App WebView verwendet, fügt Android 4.2 eine zusätzliche Sicherheit, damit Sie JavaScript sicherer an Ihre Android-Code. Wenn Sie Ihr targetSdkVersion 17 oder höher verwenden, müssen Sie nun die Anmerkung @JavascriptInterface jeder Methode hinzufügen, die für Ihren JavaScript-Code verfügbar sein sollen. Die Methode muss ebenfalls öffentlich sein. Wenn Sie die Anmerkung, diese Methode kann von einer Webseite in WebView nicht aufgerufen werden. wenn sie unter Android 4.2 oder höher laufen. Wenn Sie die targetSdkVersion 16 oder niedriger ist, ist die Anmerkung nicht erforderlich, wir empfehlen jedoch, die Zielversion zu aktualisieren. und fügen Sie die Anmerkung hinzu, um die Sicherheit zu erhöhen.

    Weitere Informationen zum Binden JavaScript-Code in Android-Code umwandeln.

Daydream

Daydream ist ein neuer interaktiver Bildschirmschonermodus für Android-Geräte. Die Aktivierung erfolgt automatisch wenn das Gerät in ein Dock eingesetzt wird oder inaktiv bleibt, während es an ein Ladegerät anzuschließen (anstatt das Display auszuschalten). Daydream zeigt einen Traum nach dem anderen an, ein rein visuelles, passives Display, das sich bei Berührung schließt oder interaktiv und responsiv sein kann zur gesamten Suite von Eingabeereignissen. Ihre Träume sind Teil Ihrer App und Sie haben vollen Zugriff auf das UI-Toolkit von Android, einschließlich Ansichten, Layouts und Animationen, damit sie flexibler und als Live-Hintergründe oder App-Widgets.

Du kannst einen Traum für Daydream erstellen, indem du eine abgeleitete Klasse von DreamService implementierst. Die DreamService APIs sind Sie ähneln denen von Activity. So legen Sie die Benutzeroberfläche für Ihre können Sie jederzeit eine Layout-Ressourcen-ID oder View an setContentView() übergeben. eines Fensters, z. B. aus dem onAttachedToWindow() Callback des Nutzers an.

Die Klasse DreamService bietet einen weiteren wichtigen Lebenszyklus-Callback zusätzlich zu den Service-Basis-APIs wie onDreamingStarted(), onDreamingStopped() und onDetachedFromWindow() an. Sie können keine DreamService aus Ihrem wird sie automatisch vom System gestartet.

Wenn Ihr Traum interaktiv ist, können Sie eine Aktivität aus dem Traum starten, um die Nutzenden die gesamte Benutzeroberfläche deiner App aus, um mehr Details oder Steuerungsmöglichkeiten zu sehen. Sie können finish() verwenden, um den Traum zu beenden, damit der Nutzer die neue Aktivität.

Deklariere DreamService mit einem <service>-Element, um deinen Daydream für das System verfügbar zu machen in Ihrer Manifest-Datei. Anschließend müssen Sie einen Intent-Filter mit der Aktion "android.service.dreams.DreamService" hinzufügen. Beispiel:

<service android:name=".MyDream" android:exported="true"
    android:icon="@drawable/dream_icon" android:label="@string/dream_label" >
    <intent-filter>
        <action android:name="android.service.dreams.DreamService" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</service>

Es gibt noch einige andere nützliche Methoden in DreamService beachten Sie Folgendes:

  • setInteractive(boolean) legt fest, ob der Traum Eingabeereignisse empfängt oder sofort nach einer Benutzereingabe beendet wird. Wenn der Traum interaktiv ist, kann der Nutzer die Schaltfläche Zurück oder Startseite zum Verlassen des Traums verwenden. Alternativ können Sie finish(), um den Traum zu beenden.
  • Wenn Sie ein vollständig immersives Display wünschen, können Sie setFullscreen() aufrufen, um die Statusleiste auszublenden.
  • Vor dem Start von Daydream wird das Display gedimmt, um dem Nutzer zu signalisieren, dass das Zeitlimit bei Inaktivität abgelaufen ist naht. Wenn du setScreenBright(true) aufrufst, kannst du stattdessen die Helligkeit des Displays auf die übliche Helligkeit einstellen.

Weitere Informationen finden Sie in der DreamService-Dokumentation.

Sekundäre Displays

Android ermöglicht es deiner App jetzt, einzigartige Inhalte auf weiteren, verbundenen Bildschirmen anzuzeigen per Kabel oder WLAN mit dem Gerät des Nutzers verbunden. Um einzigartige Inhalte für ein sekundäres Display zu erstellen, erweitere die Presentation und implementiere den onCreate()-Callback. Innerhalb von onCreate(), gib deine UI für den sekundären Bildschirm an indem du setContentView() anrufst. Als Erweiterung der Klasse Dialog stellt die Klasse Presentation die Region bereit, in der Ihre App eine eindeutige UI auf der sekundäre Displayanzeige.

So werden sekundäre Displays erkannt, auf denen Presentation angezeigt werden kann: Verwenden Sie entweder DisplayManager oder MediaRouter APIs Mit den DisplayManager-APIs können Sie mehrere Bildschirme gleichzeitig angeschlossen sein können, sollten Sie für gewöhnlich schnell über MediaRouter auf das Standarddisplay des Systems zugreifen. Präsentationen.

Um die Standardanzeige für Ihre Präsentation zu erhalten, rufen Sie MediaRouter.getSelectedRoute() auf und übergeben Sie es ROUTE_TYPE_LIVE_VIDEO. Dadurch wird ein MediaRouter.RouteInfo-Objekt zurückgegeben, das die aktuell ausgewählte Route des Systems beschreibt. für Videopräsentationen. Wenn MediaRouter.RouteInfo nicht null ist, rufen Sie getPresentationDisplay(), um die Display für den verbundenen Bildschirm abzurufen.

Anschließend können Sie Ihre Präsentation einblenden, indem Sie das Display-Objekt übergeben. an einen Konstruktor für Ihre Presentation-Klasse. Ihre Präsentation wird jetzt auf dem zweiten Display erscheinen.

Damit während der Laufzeit erkannt wird, wann eine neue Anzeige verbunden wurde, erstellen Sie eine Instanz von MediaRouter.SimpleCallback, in der Sie die Callback-Methode onRoutePresentationDisplayChanged() implementieren, die das System aufruft, wenn ein neuer Präsentationsdisplay ist verbunden. Registrieren Sie dann die MediaRouter.SimpleCallback, indem Sie sie zusammen mit dem Routentyp ROUTE_TYPE_LIVE_VIDEO an MediaRouter.addCallback() übergeben. Wenn Sie einen Anruf bei onRoutePresentationDisplayChanged(), rufe einfach wie oben beschrieben MediaRouter.getSelectedRoute() auf.

Zur weiteren Optimierung der UI in Presentation für sekundäre Bildschirme gibt, können Sie Design ändern, indem Sie das Attribut android:presentationTheme in der <style> angeben, auf Ihre App oder Aktivität angewendet.

Denken Sie daran, dass mit dem Gerät der Nutzenden verbundene Bildschirme oft eine größere Bildschirmgröße haben und wahrscheinlich eine andere Bildschirmdichte. Da die Bildschirmmerkmale unterschiedlich sein können, sollten Sie stellen Ressourcen bereit, die speziell für solche größeren Bildschirme optimiert sind. Bei Bedarf Wenn Sie zusätzliche Ressourcen von Ihrem Presentation anfordern möchten, rufen Sie getContext().getResources() auf, um das Resources-Objekt für die Anzeige abzurufen. Damit erhalten Sie Ressourcen aus Ihrer App, die sich am besten für das die Bildschirmgröße und -dichte des sekundären Bildschirms.

Weitere Informationen und einige Codebeispiele finden Sie in der Presentation. Klassendokumentation.

Sperrbildschirm-Widgets

Unter Android können Nutzer jetzt App-Widgets zum Sperrbildschirm hinzufügen. So machen Sie Ihr App-Widget für die Verwendung auf dem Sperrbildschirm hinzufügen, fügen Sie Ihrer XML-Datei das Attribut android:widgetCategory hinzu, das die AppWidgetProviderInfo angibt. Dieses Attribut unterstützt zwei Werte: home_screen und keyguard. Standardmäßig ist das Attribut auf home_screen gesetzt, sodass Nutzer Ihre App-Widget zum Startbildschirm hinzu. Soll das App-Widget auch auf dem Schloss verfügbar sein fügen Sie den Wert keyguard hinzu:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:widgetCategory="keyguard|home_screen">
</appwidget-provider>

Sie sollten auch ein anfängliches Layout für Ihr App-Widget angeben, wenn Sie Das Attribut android:initialKeyguardLayout Das funktioniert genauso wie das android:initialLayout, da sie Folgendes bereitstellt: ein Layout, das sofort angezeigt werden kann, bis Ihr App-Widget initialisiert ist und in der Lage ist, Layout.

Weitere Informationen zum Erstellen von App-Widgets für den Sperrbildschirm die Größe des App-Widgets auf dem Sperrbildschirm anpassen. Weitere Informationen

Mehrere Nutzer

Android erlaubt nun mehrere Nutzerbereiche auf gemeinsam nutzbaren Geräten wie Tablets. Jeder Nutzer einer Gerät verfügt über eigene Konten, Apps, Systemeinstellungen, Dateien und andere nutzerbezogenen Daten.

Als App-Entwickler müssen Sie nichts weiter tun, damit Ihre App funktioniert. mit mehreren Nutzern auf einem Gerät ordnungsgemäß funktioniert. Unabhängig davon, wie viele Nutzer auf einem werden die Daten, die Ihre App für einen bestimmten Nutzer speichert, von den Daten getrennt, die Ihre App speichert. für andere Nutzende. Das System verfolgt, welche Nutzerdaten zum User-Prozess gehören, in dem Ihre App ausgeführt wird und nur auf die Daten dieses Nutzers zugreifen kann. auf die Daten anderer Nutzer.

Daten in einer Umgebung mit mehreren Nutzern speichern

Immer wenn Ihre App Nutzereinstellungen speichert, eine Datenbank erstellt oder eine Datei im internen oder externen Speicherplatz haben, sind diese Daten nur verfügbar, wenn sie als dieser Nutzer ausgeführt werden.

Um sicherzustellen, dass sich Ihre App in einer Umgebung mit mehreren Nutzern ordnungsgemäß verhält, sollten Sie nicht auf die internes App-Verzeichnis oder externer Speicherort über hartcodierte Pfade und verwenden stattdessen immer die entsprechenden APIs:

Unabhängig davon, welche dieser APIs Sie zum Speichern von Daten für einen bestimmten Nutzer verwenden, werden die Daten nicht wenn sie unter einem anderen Nutzer ausgeführt werden. Aus der Sicht Ihrer App führt jeder Nutzer auf einem völlig anderen Gerät.

Nutzer in einer Umgebung mit mehreren Nutzern identifizieren

Wenn mit Ihrer App einzelne Nutzer identifiziert werden sollen, z. B. um Analysen zu erstellen oder ein anderes Konto zu erstellen sollten Sie die empfohlenen Praktiken zur Identifizierung einzelnen Installationen. Durch Erstellen einer neuen UUID beim Start deiner App für die erhalten Sie ganz sicher eine eindeutige ID für das Tracking jedes Nutzers, unabhängig davon, wie viele Nutzer installieren Ihre App auf einem einzigen Gerät. Alternativ können Sie ein lokales Token speichern, das von Ihren Server oder verwenden Sie die von Google Cloud Messaging bereitgestellte Registrierungs-ID.

Wenn Ihre App eine der Hardwaregeräte-IDs (z. B. WLAN-MAC) anfordert, Adresse oder die SERIAL-Nummer), geben sie für jede Telefonnummer den gleichen Wert an da diese mit der Hardware und nicht mit dem Nutzer verknüpft sind. Ganz zu schweigen von der Probleme, die durch diese Kennzeichnungen entstehen, wie im Abschnitt Identifizierung Blogpost zu App-Installationen.

Neue globale Einstellungen

Die Systemeinstellungen wurden aktualisiert und unterstützen nun mehrere Nutzer mit Settings.Global. Diese Einstellungssammlung ähnelt den Einstellungen für Settings.Secure, weil sie schreibgeschützt sind. Sie gelten aber global für alle alle Nutzerbereiche auf dem Gerät.

Mehrere vorhandene Einstellungen wurden von Settings.System oder Settings.Secure hierher verschoben. Wenn Ihre App Derzeit werden Änderungen an den zuvor in Settings.System definierten Einstellungen vorgenommen. (z. B. AIRPLANE_MODE_ON) angezeigt wird, ist zu erwarten, dass funktionieren auf Geräten mit Android 4.2 oder höher nicht mehr, wenn diese Einstellungen in Settings.Global verschoben. Sie können weiterhin die Einstellungen lesen, die sich in Settings.Global, aber die Einstellungen gelten nicht mehr als sicher wenn Apps geändert werden, scheitert der Versuch ohne Meldung und das System schreibt eine Warnung das Systemprotokoll, wenn Sie Ihre App unter Android 4.2 oder höher ausführen.

Unterstützung für RTL-Layout

Android bietet jetzt mehrere APIs, mit denen Sie Benutzeroberflächen erstellen können, Transformieren der Layoutausrichtung zur Unterstützung von Sprachen, die von rechts nach links gelesene UIs und Lesefunktionen verwenden Arabisch und Hebräisch.

Um RTL-Layouts in deiner App zu unterstützen, setze das Attribut android:supportsRtl in deiner Manifestdatei auf das Element <application> und lege ihn auf “true" fest. Anschließend aktiviert das System verschiedene RTL-APIs, Ihre App mit RTL-Layouts anzeigen. In der Aktionsleiste werden beispielsweise das Symbol und der Titel auf der rechten Seite und Aktionsschaltflächen auf der linken Seite sowie in allen Layouts, die Sie mit den Die vom Framework bereitgestellten View-Klassen werden ebenfalls umgekehrt.

Wenn Sie das Erscheinungsbild Ihrer App bei einer Anzeige mit RTL-Layout weiter optimieren möchten, gibt es zwei grundlegende Optimierungsebenen:

  1. Links- und rechtsorientierte Layouteigenschaften in start- und endorientiertes Layout umwandeln Eigenschaften.

    Verwenden Sie beispielsweise android:layout_marginStart. anstelle von android:layout_marginLeft und android:layout_marginEnd anstelle von android:layout_marginRight.

    Die Klasse RelativeLayout stellt auch das entsprechende Layout bereit. Attribute zum Ersetzen der linken/rechten Position, wie z. B. android:layout_alignParentStart bis android:layout_alignParentLeft und android:layout_toStartOf ersetzen android:layout_toLeftOf

  2. Für eine vollständige Optimierung von RTL-Layouts können Sie auch komplett separate Layoutdateien mit dem Ressourcenqualifizierer ldrtl (ldrtl steht für Layout-direction-right-to-left}). Speichern Sie Ihre Standardlayoutdateien beispielsweise res/layout/ und deine RTL-optimierten Layouts in res/layout-ldrtl/.

    Der Qualifier ldrtl eignet sich hervorragend für Drawable-Ressourcen, Grafiken, die in der Leserichtung ausgerichtet sind.

Verschiedene weitere APIs stehen im Framework zur Verfügung, um RTL-Layouts zu unterstützen, z. B. View, damit Sie die richtigen Verhaltensweisen für benutzerdefinierte und in Configuration, um die aktuelle Layoutrichtung abzufragen.

Hinweis: Wenn Sie SQlite verwenden und Tabellen- oder Spaltennamen vorhanden sind, die „nur Zahl“, sein Achtung: Die Verwendung von String.format(String, Object...) kann zu Fehlern führen, da die Zahlen in ihre arabischen Entsprechungen umgewandelt, wenn auf Ihrem Gerät die arabische Sprache eingestellt wurde. Sie müssen String.format(Locale,String,Object...) verwenden, damit die Zahlen korrekt sind als ASCII beibehalten. Auch String.format("%d", int) verwenden String.valueOf(int) für und Zahlen formatieren.

Verschachtelte Fragmente

Sie können jetzt Fragmente in Fragmente einbetten. Dies ist in verschiedenen Situationen nützlich, Sie dynamische und wiederverwendbare UI-Komponenten in eine UI-Komponente einfügen möchten, dynamisch und wiederverwendbar. Wenn Sie z. B. ViewPager verwenden, um Fragmente erstellen, die nach links und rechts wischen und einen Großteil des Bildschirms einnehmen, können Sie Fragmente jetzt in jede Fragmentseite.

Um ein Fragment zu verschachteln, rufen Sie einfach getChildFragmentManager() auf Die Fragment, in die Sie ein Fragment einfügen möchten. Dadurch wird eine FragmentManager zurückgegeben, die Sie wie gewohnt von der übergeordneten Aktivität verwenden können. zum Erstellen fragmentierter Transaktionen. Hier ist zum Beispiel Code, der ein Fragment einer vorhandenen Fragment-Klasse:

Kotlin

val videoFragment = VideoPlayerFragment()
childFragmentManager.beginTransaction().apply {
    add(R.id.video_fragment, videoFragment)
    commit()
}

Java

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

Innerhalb eines verschachtelten Fragments können Sie einen Verweis auf das übergeordnete Fragment abrufen, indem Sie getParentFragment()

Die Android Support Library unterstützt jetzt auch verschachtelte Fragmente. Du kannst also verschachtelte fragmentieren Sie Designs unter Android 1.6 und höher.

Hinweis:Sie können ein Layout nicht zu einem Fragment aufblähen, wenn dieses Layout enthält <fragment>. Verschachtelte Fragmente werden nur unterstützt, wenn sie einem dynamisch fragmentiert.

RenderScript

Die Renderscript-Berechnungsfunktionen wurden um folgende Funktionen erweitert:

Intrinsische Scripts

Sie können die integrierten Skript-Intrinsiken von Renderscript nutzen, gängige Abläufe für Sie, wie zum Beispiel:

Um ein intrinsisches Skript zu verwenden, rufen Sie die statische create()-Methode jedes einzelnen um eine Instanz des Skripts zu erstellen. Anschließend rufen Sie die verfügbare set() auf. jedes intrinsische Skript, um die notwendigen Eingaben und Optionen festzulegen. Rufen Sie abschließend forEach() auf. zum Ausführen des Skripts.

Skriptgruppen

Mit ScriptGroups kannst du verwandte Renderscripts miteinander verketten. und führen sie mit einem Aufruf aus.

ScriptGroup.Builder verwenden, um der Gruppe alle Skripts hinzuzufügen indem du addKernel() anrufst. Sobald Sie alle Skripts hinzufügen, Verbindungen zwischen den indem du addConnection() aufrufst. Wenn Sie alle Verbindungen hinzugefügt haben, rufen Sie create() auf um die Skriptgruppe zu erstellen. Geben Sie vor dem Ausführen der Skriptgruppe die Eingabe an Allocation und erstes Skript für die Ausführung mit dem setInput(Script.KernelID, Allocation)-Methode und geben Sie die Ausgabe an Allocation, in den das Ergebnis geschrieben wird, und das endgültige Skript in mit setOutput() durchführen. Rufen Sie schließlich execute(), um die Skriptgruppe auszuführen.

Filterscript

Filterscript definiert Einschränkungen für die vorhandenen Renderscript-APIs, die die Ausführung des resultierenden Codes ermöglichen. auf einer größeren Vielfalt von Prozessoren (CPUs, GPUs und DSPs) ausführen. Zum Erstellen von Filterscript-Dateien erstellen Sie .fs. anstelle von .rs-Dateien und geben Sie #pragma rs_fp_relaxed an, der Renderscript-Laufzeit mitteilen, dass Ihre Skripts keine strikte Gleitkommagenauigkeit gemäß IEEE 754-2008 benötigen. Diese Genauigkeit ermöglicht eine Leerung auf null für Denorme und das Runden in Richtung Null. Außerdem kann Ihr Filterscript Skripte dürfen keine integrierten 32-Bit-Typen verwenden und müssen mithilfe der Methode __attribute__((kernel))-Attribut, da Filterscript keine Cursor unterstützt, die die Standardsignatur der Funktion root().

Hinweis:Obwohl Filterscript in der Plattform unterstützt wird, Unterstützung wird in SDK Tools Version 21.0.1 verfügbar sein.

Eine detaillierte Ansicht aller API-Änderungen in Android 4.2 finden Sie in der Bericht zu API-Unterschieden