API Android 4.1

Niveau d'API: 16

Android 4.1 (JELLY_BEAN) est une progression de la plate-forme qui offre et une meilleure expérience utilisateur. Il ajoute de nouvelles fonctionnalités pour les utilisateurs et les applis développeurs. Ce document présente les principaux sujets de nouvelles API utiles pour les développeurs d'applications.

En tant que développeur d'applications, Android 4.1 est disponible sur le SDK Manager en tant qu'image système que vous pouvez s'exécuter dans Android Emulator et une plate-forme SDK avec laquelle vous pouvez compiler votre application. Vous devez téléchargez l'image système et la plate-forme dès que possible pour créer et tester sur Android 4.1.

Afin d'optimiser votre application pour les appareils équipés d'Android 4.1, vous devez définir votre targetSdkVersion sur "16", installez-le sur une image système Android 4.1, la tester, puis publier une mise à jour avec cette modification.

Toi peuvent utiliser les API sous Android 4.1 tout en étant compatible avec les anciennes versions en ajoutant des conditions à votre code qui vérifient le niveau d'API du système avant d'exécuter API non compatibles avec votre minSdkVersion. Pour en savoir plus sur maintenir la rétrocompatibilité, consultez la section Créer des règles de rétrocompatibilité UI.

Pour en savoir plus sur le fonctionnement des niveaux d'API, consultez Qu'est-ce que l'API ? Niveau ?

Composants de l'appli

Services isolés

En spécifiant android:isolatedProcess="true" dans <service>, votre Service fonctionnera sous son propre processus d’ID utilisateur isolé qui ne dispose pas de ses propres autorisations.

Gestion de la mémoire

Les nouvelles constantes ComponentCallbacks2, telles que TRIM_MEMORY_RUNNING_LOW et TRIM_MEMORY_RUNNING_CRITICAL, fournissent le premier plan. traite plus d'informations sur l'état de la mémoire avant que le système n'appelle onLowMemory().

La nouvelle méthode getMyMemoryState(ActivityManager.RunningAppProcessInfo) vous permet d'effectuer les opérations suivantes : récupérer l'état général de la mémoire.

Fournisseurs de contenu

Une nouvelle méthode, acquireUnstableContentProviderClient(), vous permet d'accéder à un ContentProviderClient susceptible d'être "instable" afin que votre application ne plante pas le fournisseur de contenu. Il est utile lorsque vous interagissez avec des fournisseurs de contenu l'application.

Fonds d'écran animés

Nouveau protocole d'intent permettant de lancer directement l'activité de prévisualisation du fond d'écran animé les utilisateurs peuvent facilement sélectionner votre fond d'écran animé sans les obliger à le quitter votre application et naviguer dans le sélecteur de fond d'écran d'accueil.

Pour lancer le sélecteur de fond d'écran animé, appelez startActivity() avec un Intent à l'aide de ACTION_CHANGE_LIVE_WALLPAPER et un supplément qui spécifie votre fond d'écran animé ComponentName en tant que chaîne dans EXTRA_LIVE_WALLPAPER_COMPONENT.

Navigation dans la pile d'applications

Avec Android 4.1, il est beaucoup plus facile d'implémenter les modèles de conception appropriés pour la navigation vers le haut. Il vous suffit d'ajouter android:parentActivityName à chaque élément <activity> dans votre fichier manifeste. Le système utilise ces informations pour ouvrir l'activité appropriée lorsque l'utilisateur appuie sur le bouton Haut de la barre d'action (tout en terminant l'activité en cours). Si vous déclarer android:parentActivityName pour chaque activité, vous n'avez pas besoin de la méthode onOptionsItemSelected() pour gérer les clics ; sur l'icône d'application de la barre d'action. Le système gère désormais ces événements et reprend crée l'activité appropriée.

Cela est particulièrement utile dans les cas où l'utilisateur entre dans l'une des activités de votre application. par une « plongée en profondeur » comme à partir d'une notification ou d'un intent application différente (comme décrit dans le guide de conception Naviguer entre les applications). Quand ? l'utilisateur entre dans votre activité de cette façon, votre application peut ne pas avoir naturellement une pile "Retour" de activités qui peuvent être réactivées à mesure que l'utilisateur remonte. Toutefois, lorsque vous fournissez l'attribut android:parentActivityName pour vos activités, le système reconnaît si votre application contient déjà une pile "Retour" d'activités parentes et, si ce n'est pas le cas, des constructions ; Une pile "Retour" synthétique contenant toutes les activités parentes

Remarque:Lorsque l'utilisateur effectue une activité de fond dans votre application et une tâche est créée pour votre application, le système insère en fait la pile d'activités parentes dans la tâche. Par conséquent, appuyer sur le bouton "Retour" vous permet également de revenir à la pile d'éléments activités.

Lorsque le système crée une pile "Retour" synthétique pour votre application, il crée une Intent de base pour créer une instance de chaque activité parent. Il n'y a donc pas enregistré l'état des activités parentes de la manière à laquelle l'utilisateur doit naviguer naturellement à chaque activité. Si l'une des activités parentes affiche normalement une UI qui dépend de le contexte de l'utilisateur, ces informations contextuelles seront manquantes et vous devez les fournir au moment utilisateur revient en arrière dans la pile. Par exemple, si l'utilisateur consulte un album, dans une application musicale, la navigation vers le haut peut les amener à une activité listant tous les albums d'une genre musical. Dans ce cas, si la pile doit être créée, vous devez informer le parent le genre auquel appartient l'album actuel afin que le parent puisse afficher la liste appropriée si l'utilisateur provient réellement de cette activité. Pour fournir ces informations à un parent synthétique activité, vous devez remplacer la méthode onPrepareNavigateUpTaskStack(). Ce vous fournit un objet TaskStackBuilder que le système a créé pour synthétiserez les activités parentes. TaskStackBuilder contient des objets Intent que le système utilise pour créer chaque activité parente. Dans votre Implémentation de onPrepareNavigateUpTaskStack(), vous pouvez modifier le Intent approprié pour ajouter des données supplémentaires que l'activité parent peut utiliser pour déterminer le contexte et l'affichage appropriés l'interface utilisateur appropriée.

Lorsque le système crée le TaskStackBuilder, il ajoute les objets Intent utilisés pour créer les activités parentes dans leur logique en partant du haut de l'arborescence des activités. Ainsi, le dernier Intent ajouté au tableau interne est le parent direct de l'activité actuelle. Si vous souhaitez modifier le Intent pour le parent de l'activité, commencez par déterminer la longueur du tableau avec getIntentCount() et transmettre cette sur editIntentAt().

Si la structure de votre application est plus complexe, plusieurs autres API existent qui vous permettent de gérer le comportement de la navigation vers le haut et personnaliser entièrement la pile "Retour" synthétique. Certaines API vous offrent des fonctionnalités sont les suivants:

onNavigateUp()
Remplacez ce paramètre pour effectuer une action personnalisée lorsque l'utilisateur appuie sur le bouton "Haut".
navigateUpTo(Intent)
Appelez-le pour terminer l'activité en cours et accéder à celle indiquée par le a fourni Intent. Si l'activité existe dans la pile "Retour", n'est pas le parent le plus proche, toutes les autres activités entre l'activité actuelle et l'activité spécifiée avec l'intent sont également terminées.
getParentActivityIntent()
Appelez cette méthode pour obtenir le Intent qui lancera la logique pour l'activité en cours.
shouldUpRecreateTask(Intent)
Appelez cette méthode pour demander si une pile "Retour" synthétique doit être créée pour permettre la navigation vers le haut. Affiche la valeur "true" si une pile synthétique doit être créée et la valeur "false" si la pile appropriée est utilisée. existe déjà.
finishAffinity()
Appelez-le pour terminer l'activité actuelle et toutes les activités parent avec la même liées à l'activité actuelle. Si vous remplacez les comportements par défaut tels que onNavigateUp(), vous devez appeler cette méthode lorsque vous créer une pile "Retour" synthétique lors de la navigation vers le haut.
onCreateNavigateUpTaskStack
Remplacez ce paramètre si vous devez contrôler entièrement la façon dont la pile de tâches synthétique est créée. Si vous souhaitez simplement ajouter des données supplémentaires aux intents de votre pile "Retour", vous devez remplacer onPrepareNavigateUpTaskStack().

Toutefois, la plupart des applications n'ont pas besoin d'utiliser ces API ni d'implémenter onPrepareNavigateUpTaskStack(), mais elles peuvent obtenir le comportement correct simplement en en ajoutant android:parentActivityName à chaque élément <activity>.

Multimédia

Codecs multimédias

La classe MediaCodec permet d'accéder à des codecs multimédias de bas niveau pour l'encodage. et décoder vos contenus multimédias. Vous pouvez instancier un MediaCodec en appelant createEncoderByType() pour encoder un contenu multimédia ou appeler createDecoderByType() pour le décoder. Chacun de ces éléments utilisent un type MIME pour le type de contenu que vous souhaitez encoder ou décoder, par exemple "video/3gpp" ou "audio/vorbis".

Une fois qu'une instance de MediaCodec a été créée, vous pouvez appeler configure() pour spécifier des propriétés telles que le format multimédia ou si le contenu est chiffré ou non.

Qu'il s'agisse d'encoder ou de décoder votre contenu multimédia, le reste du processus créer le MediaCodec. Commencez par appeler getInputBuffers() pour obtenir un tableau de l'entrée ByteBuffer. et getOutputBuffers() pour obtenir un tableau d'objets ByteBuffer de sortie.

Lorsque vous êtes prêt à encoder ou à décoder, appelez dequeueInputBuffer() pour obtenir la position d'index du ByteBuffer (à partir du tableau de tampons d'entrée) que vous devez utiliser pour alimenter votre source. médias. Après avoir renseigné le ByteBuffer avec votre fichier multimédia source, renoncez à la propriété du tampon en appelant queueInputBuffer().

De même pour le tampon de sortie, appelez dequeueOutputBuffer() pour obtenir la position d'index de ByteBuffer. où vous recevrez les résultats. Après avoir lu la sortie de ByteBuffer, libérez la propriété en appelant releaseOutputBuffer().

Vous pouvez gérer les données multimédias chiffrées dans les codecs en appelant queueSecureInputBuffer() conjointement avec les API MediaCrypto, au lieu du queueInputBuffer() normal.

Pour en savoir plus sur l'utilisation des codecs, consultez la documentation MediaCodec.

Enregistrer l'audio au repère

La nouvelle méthode startRecording() permet de commencer l'enregistrement audio en fonction d'un repère défini par un MediaSyncEvent. Le MediaSyncEvent spécifie une session audio (telle que celle définie par MediaPlayer), qui, une fois l'opération terminée, déclenche l'enregistreur audio pour commencer l'enregistrement. Par exemple, vous pouvez utiliser cette fonctionnalité pour une tonalité sonore indiquant le début d'une session d'enregistrement démarre automatiquement. Vous n'avez donc pas besoin de synchroniser manuellement la tonalité et le d'enregistrement.

Pistes de texte synchronisées

MediaPlayer gère désormais les pistes de texte internes et externes. Les pistes de texte intégrées au bracelet sont une piste de texte au sein d'une source multimédia MP4 ou 3GPP. Texte hors bande les pistes peuvent être ajoutées en tant que source de texte externe via la méthode addTimedTextSource(). Après tout le texte externe sources des pistes ajoutées, getTrackInfo() doit être appelé pour obtenir la liste actualisée de tous les canaux disponibles dans une source de données.

Pour définir le titre à utiliser avec MediaPlayer, vous devez appelez selectTrack() à l'aide de l'index de la piste que vous souhaitez utiliser.

Pour recevoir une notification lorsque la piste de texte est prête à être lue, implémentez la l'interface et la carte MediaPlayer.OnTimedTextListener à setOnTimedTextListener().

Effets audio

La classe AudioEffect prend désormais en charge du contenu audio supplémentaire. types de prétraitement lors de la capture audio:

  • Annulateur d'écho acoustique (AEC) avec AcousticEchoCanceler supprime la contribution du signal reçu du tiers distant au signal audio capturé.
  • Contrôle automatique du gain (AGC) avec AutomaticGainControl normalise automatiquement la sortie du signal capturé.
  • Suppresseur de bruit (NS) avec NoiseSuppressor supprime le bruit de fond du signal capturé.

Vous pouvez appliquer ces effets de préprocesseur au contenu audio capturé avec un AudioRecord à l'aide de l'un des éléments AudioEffect sous-jacentes.

Remarque:Il n'est pas garanti que tous les appareils soient compatibles avec ces Vous devez donc toujours vérifier la disponibilité en appelant isAvailable() sur le classe d'effet audio.

Lecture sans interruption

Vous pouvez désormais effectuer une lecture sans interruption entre Objets MediaPlayer. Vous pouvez attendre la fin de vos MediaPlayer premières secondes, appeler setNextMediaPlayer() et Android essaie de lancer le deuxième joueur dès que le premier s'arrête.

Routeur multimédia. Les nouvelles API MediaRouter, MediaRouteActionProvider et MediaRouteButton fournissent des mécanismes standards et une interface utilisateur pour choisir où lire le contenu multimédia.

Appareil photo

Mouvement de mise au point automatique

La nouvelle interface Camera.AutoFocusMoveCallback vous permet d'écouter pour voir les changements de mouvement de mise au point automatique. Vous pouvez enregistrer votre interface auprès de setAutoFocusMoveCallback(). Lorsque la caméra est en mode autofocus en continu (FOCUS_MODE_CONTINUOUS_VIDEO ou FOCUS_MODE_CONTINUOUS_PICTURE), vous recevrez un appel à onAutoFocusMoving(), qui vous indique si l'autofocus a commencé à bouger ou s'il ne bouge plus.

Sons appareil photo

La classe MediaActionSound fournit un ensemble simple d'API à produire les sons standards émis par la caméra ou d'autres actions multimédias. Utilisez ces API pour jouer le son approprié lors de la création d'une caméra fixe ou vidéo personnalisée.

Pour émettre un son, instanciez simplement un objet MediaActionSound, appelez load() pour précharger le son souhaité, puis le moment opportun, appelez play().

Connectivité

Android Beam

Android BeamTM est désormais compatible avec les transferts de charges utiles volumineuses via Bluetooth. Lorsque vous définissez les données pour effectuer le transfert avec le nouveau setBeamPushUris() ou la nouvelle interface de rappel NfcAdapter.CreateBeamUrisCallback, Android remet le transfert de données vers le Bluetooth ou un autre transport alternatif vers pour atteindre des vitesses de transfert plus rapides. Ceci est particulièrement utile pour les charges utiles volumineuses, telles que les images fichiers audio et ne nécessite aucune association visible entre les appareils. Aucun travail supplémentaire n'est requis votre application pour tirer parti des transferts via Bluetooth.

La méthode setBeamPushUris() prend un tableau de Objets Uri qui spécifient les données que vous souhaitez transférer à partir de votre application. Vous pouvez également implémenter NfcAdapter.CreateBeamUrisCallback. que vous pouvez spécifier pour votre activité en appelant setBeamPushUrisCallback().

Lorsque vous utilisez la de rappel, le système appelle la méthode createBeamUris() de l'interface lorsque exécute un partage avec Android Beam afin que vous puissiez définir les URI à partager au moment du partage. Cela est utile si les URI à partager peuvent varier en fonction du contexte utilisateur dans le d'activité, alors que l'appel de setBeamPushUris() est utile lorsque les URI à partager ne changent pas et que vous pouvez les définir en toute sécurité à l'avance.

Identification du service réseau

Android 4.1 prend en charge la détection de services multicast basée sur DNS, ce qui vous permet de de rechercher et de s'y connecter via le Wi-Fi (appareils mobiles, par exemple) ; des imprimantes, des appareils photo, des lecteurs multimédias et d'autres appareils enregistrés sur le réseau local.

Le nouveau package android.net.nsd contient les nouvelles API qui vous permettent de diffuser vos services sur le réseau local, détecter les appareils locaux sur le réseau ; de se connecter à des appareils.

Pour enregistrer votre service, vous devez d'abord créer un NsdServiceInfo et définir les différentes propriétés de votre service à l'aide de méthodes setServiceName(), setServiceType() et setPort()

Vous devez ensuite implémenter NsdManager.RegistrationListener. et le transmettre à registerService(). avec votre NsdServiceInfo.

Pour découvrir les services sur le réseau, implémentez NsdManager.DiscoveryListener et transmettez-le à discoverServices().

Lorsque votre NsdManager.DiscoveryListener reçoit des rappels concernant des services vous devez résoudre le problème en appelant resolveService(), en lui transmettant une l'implémentation de NsdManager.ResolveListener, qui reçoit un objet NsdServiceInfo contenant des informations sur le service détecté, ce qui vous permet d'initier la connexion.

Détection de services Wi-Fi P2P

Les API Wi-Fi P2P sont améliorées dans Android 4.1 pour permettre la détection de services de pré-association dans le WifiP2pManager. Cela vous permet de découvrir et de filtrer appareils par les services utilisant le Wi-Fi P2P avant de s'y connecter, tandis que les services réseau La détection vous permet de découvrir un service sur un réseau connecté existant (tel qu'un réseau Wi-Fi local réseau).

Diffuser votre application en tant que service via le Wi-Fi afin que d'autres appareils puissent détecter votre application et vous y connecter, appelez addLocalService() avec un Objet WifiP2pServiceInfo qui décrit vos services applicatifs.

Pour lancer la détection des appareils à proximité via le Wi-Fi, vous devez d'abord déterminer si vous allez à l'aide de Bonjour ou de l'Upnp. Pour utiliser Bonjour, configurez d'abord des écouteurs de rappel avec setDnsSdResponseListeners(), qui accepte à la fois un WifiP2pManager.DnsSdServiceResponseListener et un WifiP2pManager.DnsSdTxtRecordListener. Pour utiliser Upnp, appelez setUpnpServiceResponseListener(), qui accepte un WifiP2pManager.UpnpServiceResponseListener.

Avant de pouvoir découvrir des services sur des appareils locaux, vous devez également appeler addServiceRequest(). Lorsque le WifiP2pManager.ActionListener que vous transmettez à cette méthode reçoit une rappel réussi, vous pouvez commencer à rechercher des services sur les appareils locaux en appelant discoverServices().

Lorsque des services locaux sont découverts, vous êtes rappelé au WifiP2pManager.DnsSdServiceResponseListener ou à l'WifiP2pManager.UpnpServiceResponseListener, selon que vous enregistré pour utiliser Bonjour ou Upnp. Dans les deux cas, le rappel reçu contient Objet WifiP2pDevice représentant l'appareil associé.

Utilisation du réseau

La nouvelle méthode isActiveNetworkMetered() vous permet d'effectuer les opérations suivantes : vérifier si l'appareil est actuellement connecté à un réseau facturé à l'usage. En cochant cet état avant d'effectuer des transactions réseau intensives, vous pouvez aider à gérer l'utilisation des données qui peut coûter de l'argent à vos utilisateurs et des décisions éclairées quant à l'exécution immédiate ou ultérieure des transactions (par exemple, lorsque le l'appareil se connecte au Wi-Fi).

Accessibilité

API des services d'accessibilité

La portée des API des services d'accessibilité a considérablement augmenté dans Android 4.1. Il maintenant vous permet de créer des services qui surveillent davantage d'événements d'entrée et y répondent, comme des gestes complexes avec onGesture() et d'autres via des ajouts aux classes AccessibilityEvent, AccessibilityNodeInfo et AccessibilityRecord.

Les services d'accessibilité peuvent également effectuer des actions pour le compte de l'utilisateur, y compris cliquer, faire défiler et parcourir du texte à l'aide de performAction et setMovementGranularities. La méthode performGlobalAction() permet également aux services d'effectuer des actions comme "Retour", "Accueil" et l'ouverture de "Récents". Applications et notifications.

Navigation personnalisable dans l'application

Lorsque vous créez une application Android, vous pouvez désormais personnaliser les schémas de navigation en recherchant les éléments sélectionnables et les widgets d'entrée à l'aide de findFocus() et focusSearch(), et placez le curseur en avant. avec setAccessibilityFocused().

Widgets plus accessibles

La nouvelle classe android.view.accessibility.AccessibilityNodeProvider vous permet de : proposer des vues personnalisées complexes aux services d'accessibilité afin qu'ils puissent présenter les informations de manière plus accessible. Le android.view.accessibility.AccessibilityNodeProvider permet à un utilisateur avec du contenu avancé, tel qu'une grille de calendrier, afin de présenter une structure sémantique logique pour des services d'accessibilité complètement distincts de la structure de mise en page du widget. Cette sémantique permet aux services d'accessibilité de présenter un modèle d'interaction plus utile pour les utilisateurs malvoyantes.

Copy and Paste

Copier et coller avec des intents

Vous pouvez maintenant associer un objet ClipData à un Intent à l'aide de la méthode setClipData(). Cela est particulièrement utile lorsque vous utilisez un intent pour transférer plusieurs URI content: vers un autre application, par exemple pour partager plusieurs documents. Les URI content: fournis cette méthode respecte également les indicateurs d'intent pour offrir un accès en lecture ou en écriture, ce qui vous permet d'accorder l'accès à plusieurs URI dans un intent. Lors du démarrage d'un intent ACTION_SEND ou ACTION_SEND_MULTIPLE, les URI fournis dans l'intent sont désormais automatiquement propagé à ClipData pour que le récepteur puisse qui leur est accordé.

Compatibilité avec les styles HTML et de chaîne

La classe ClipData prend désormais en charge le texte stylisé (au format HTML ou Android styled par exemple). Vous pouvez ajouter du texte stylisé HTML à ClipData avec newHtmlText().

RenderScript

La fonctionnalité de calcul de Renderscript a été améliorée avec les fonctionnalités suivantes:

  • Prise en charge de plusieurs noyaux dans un seul script.
  • Prise en charge de la lecture de l'allocation avec des échantillonneurs filtrés à partir du calcul dans une nouvelle API de script rsSample
  • Compatibilité avec différents niveaux de précision de FP dans #pragma.
  • Possibilité d'interroger des informations supplémentaires à partir d'objets RS à partir d'un script de calcul.
  • Nombreuses améliorations des performances.

De nouveaux pragmas sont également disponibles pour définir la précision à virgule flottante requise par votre Compute Renderscripts. Cela vous permet d'activer des opérations de type NEON, comme des opérations mathématiques à vecteur rapide sur le chemin du processeur, ce qui n'aurait pas été possible autrement avec la norme IEEE 754-2008 complète.

Remarque:Le moteur graphique Renderscript expérimental est désormais obsolète.

Animation

Animations de lancement de l'activité

Vous pouvez désormais lancer un Activity à l'aide d'animations de zoom ou vos propres animations personnalisées. Pour spécifier l'animation souhaitée, utilisez les API ActivityOptions afin de créer un Bundle que vous pouvez puis transmettre à l'un des qui démarrent une activité, telles que startActivity().

La classe ActivityOptions inclut une méthode différente pour chaque type d'animation qui peut s'afficher au début de l'activité:

makeScaleUpAnimation()
Crée une animation qui agrandit la fenêtre d'activité à partir d'un point de départ spécifié. à l'écran et une taille de départ spécifiée. Par exemple, l'écran d'accueil de Android 4.1 l'utilise lors de l'ouverture d'une application.
makeThumbnailScaleUpAnimation()
Crée une animation qui augmente la taille de la fenêtre d'activité à partir d'une valeur et une vignette fournie. Par exemple, la fenêtre "Applis récentes" Android 4.1 l'utilise lorsque vous revenez à une application.
makeCustomAnimation()
Crée une animation définie par vos propres ressources, c'est-à-dire une animation pour l'ouverture de l'activité et une autre pour l'activité en cours d'arrêt.

Animateur de temps

Le nouveau TimeAnimator fournit un rappel simple mécanisme avec le TimeAnimator.TimeListener qui notifie à chaque image de l'animation. Il n'y a pas de durée, d'interpolation ni de définition de valeur d'objet avec cet Animator. Le rappel de l'écouteur reçoit des informations pour chaque trame, y compris le temps total écoulé et le temps écoulé depuis l'image d'animation précédente.

Interface utilisateur

Notifications

Sous Android 4.1, vous pouvez créer des notifications avec des zones de contenu plus grandes, des aperçus d'images de grande taille, plusieurs boutons d'action et une priorité configurable.

Styles de notifications

La nouvelle méthode setStyle() vous permet de spécifier l'un des trois nouveaux styles de notification qui proposent chacun une zone de contenu plus vaste. À spécifiez le style de la zone de contenu volumineux, transmettez à setStyle() l'un des objets suivants:

Notification.BigPictureStyle
Pour les notifications incluant une grande image en pièce jointe.
Notification.BigTextStyle
Pour les notifications contenant beaucoup de texte (un seul e-mail, par exemple).
Notification.InboxStyle
Pour les notifications qui incluent une liste de chaînes, comme des extraits de plusieurs e-mails.
Actions de notification

Vous pouvez désormais afficher jusqu'à deux boutons d'action en bas de l'écran message de notification, que votre notification soit d'un style normal ou plus grand.

Pour ajouter un bouton d'action, appelez addAction(). Cette méthode utilise trois arguments: une ressource drawable pour une icône, du texte du bouton et un élément PendingIntent qui définit l'action à "perfrom".

Priorités

Vous pouvez désormais indiquer au système l'importance de votre notification pour l'ordre de vos notifications dans la liste en définissant la priorité avec setPriority(). Toi peut transmettre l'un des cinq niveaux de priorité différents définis par les constantes PRIORITY_* dans la classe Notification. La valeur par défaut est PRIORITY_DEFAULT. Il y a deux niveaux supérieurs et deux niveaux inférieurs.

Les notifications à priorité élevée sont des éléments auxquels les utilisateurs veulent généralement répondre rapidement, comme un nouveau message instantané, un SMS ou un rappel d'événement imminent. Priorité faible les notifications sont des événements d'agenda arrivés à expiration ou des promotions d'applications.

Commandes de l'UI du système

Ajout de nouveaux indicateurs pour contrôler la visibilité de l'UI du système sur Android 4.0 (Ice Cream Sandwich) , par exemple pour réduire l'apparence de la barre système ou la faire disparaître complètement sur les téléphones. Android 4.1 ajoute quelques indicateurs pour vous permettre de mieux contrôler l'apparence du système Éléments d'interface utilisateur et mise en page de votre activité par rapport à eux en appelant setSystemUiVisibility() et en transmettant les indicateurs suivants:

SYSTEM_UI_FLAG_FULLSCREEN
Masque les interfaces utilisateur système non critiques (comme la barre d'état). Si votre activité utilise la barre d'action en mode superposition (par android:windowActionBarOverlay), cet indicateur masque également la barre d'action avec une animation coordonnée lorsque les deux sont masqués et affichés.
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
Définit la mise en page de votre activité de sorte qu'elle utilise la même zone d'écran que celle qui est disponible lorsque vous a activé SYSTEM_UI_FLAG_FULLSCREEN même si les éléments de l'UI du système restent visibles. Bien que certaines parties de votre mise en page soient superposées l'UI du système, cela est utile si votre application masque et affiche souvent l'UI du système avec SYSTEM_UI_FLAG_FULLSCREEN, car cela évite que la mise en page ne soit s'ajuster aux nouvelles limites de mise en page chaque fois que l'interface utilisateur du système est masquée ou affichée.
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
Définit la mise en page de votre activité de sorte qu'elle utilise la même zone d'écran que celle qui est disponible lorsque vous SYSTEM_UI_FLAG_HIDE_NAVIGATION activé (ajouté dans Android 4.0) même si les éléments de l'UI du système sont encore visibles. Bien que certaines parties de votre mise en page en superposition avec les cette barre est utile si votre application masque et affiche souvent la barre de navigation avec SYSTEM_UI_FLAG_HIDE_NAVIGATION, car cela évite que la mise en page ne soit s'ajuster aux nouvelles limites de mise en page chaque fois que la barre de navigation est masquée ou s'affiche.
SYSTEM_UI_FLAG_LAYOUT_STABLE
Vous pouvez ajouter cette option si vous utilisez SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN et/ou SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION pour vous assurer que lorsque vous appelez fitSystemWindows() sur une vue les limites définies restent cohérentes par rapport à l'espace disponible à l'écran. Autrement dit, lorsque cet indicateur est défini, fitSystemWindows() se comporte comme si la visibilité des éléments d'UI du système restait inchangée. même après avoir masqué toute l'UI du système.

Pour en savoir plus sur les autres indicateurs d'UI du système associés, consultez celles ajoutées dans Android 4.0.

Vues à distance

GridLayout et ViewStub sont désormais des vues à distance, ce qui vous permet de les utiliser dans les mises en page les widgets d'application et les mises en page personnalisées des notifications.

Familles de polices

Android 4.1 ajoute plusieurs variantes du style de police Roboto pour un total de 10 variantes, et ils sont tous utilisables par les applications. Vos applis ont désormais accès à l'ensemble des fonctionnalités des variantes condensées.

Voici l'ensemble des variantes de polices Roboto disponibles:

  • Standard
  • Italique
  • Gras
  • Gras-italique
  • Léger
  • Clair-italique
  • Condensé standard
  • Italique condensé
  • Gras condensé
  • Gras-italique condensé

Vous pouvez appliquer l'une de ces options avec le nouveau fontFamily en combinaison avec l'attribut textStyle.

Les valeurs acceptées pour fontFamily sont les suivantes:

  • "sans-serif" pour le Roboto standard
  • "sans-serif-light" pour Roboto Light
  • "sans-serif-condensed" pour Roboto Condensed

Vous pouvez ensuite mettre en gras et/ou en italique les valeurs textStyle "bold" et "italic". Vous pouvez appliquer les deux comme suit: android:textStyle="bold|italic".

Vous pouvez également utiliser Typeface.create(). Par exemple, Typeface.create("sans-serif-light", Typeface.NORMAL).

Framework d'entrée

Plusieurs périphériques d'entrée

La nouvelle classe InputManager vous permet d'interroger le ensemble de périphériques d'entrée actuellement connectés et qui s'enregistrent pour recevoir une notification lorsqu'un nouvel appareil est ajoutée, modifiée ou supprimée. C'est particulièrement utile si vous créez un jeu qui prend en charge plusieurs joueurs et dont vous voulez savoir combien de manettes sont connectées et en cas de changement du nombre de manettes.

Vous pouvez interroger tous les périphériques d'entrée connectés en appelant getInputDeviceIds() Cela renvoie un tableau d'entiers, chacun étant un ID d'un périphérique d'entrée différent. Vous pouvez ensuite appeler getInputDevice() à acquérir un InputDevice pour un ID de périphérique d'entrée spécifié.

Si vous souhaitez être informé lorsque de nouveaux périphériques d'entrée sont connectés, modifiés ou déconnectés, implémenter l'interface InputManager.InputDeviceListener l'enregistrer auprès de registerInputDeviceListener().

Vibreur pour les contrôleurs d'entrée

Si les périphériques d'entrée connectés possèdent leurs propres fonctions de vibreur, vous pouvez désormais contrôler les vibrations de ces appareils à l'aide des API Vibrator existantes, simplement en appelant getVibrator() sur InputDevice.

Autorisations

Voici les nouvelles autorisations:

READ_EXTERNAL_STORAGE
Fournit un accès en lecture protégé à l'espace de stockage externe. Sur Android 4.1 par par défaut, toutes les applications ont un accès en lecture y accéder. Ce paramètre sera modifié dans une prochaine version pour exiger que les applications demandent explicitement l'accès en lecture à l'aide de cette autorisation. Si votre application demande déjà un accès en écriture, obtiennent automatiquement un accès en lecture également. Une nouvelle option pour les développeurs permet d'activer l'accès en lecture pour permettre aux développeurs de tester leurs applications par rapport au comportement d'Android à venir.
android.Manifest.permission.READ_USER_DICTIONARY
Permet à une application de lire le dictionnaire personnel. Cette opération ne doit être effectuée IME, ou un éditeur de dictionnaire comme l'application Paramètres.
READ_CALL_LOG
Permet à une application de lire le journal d'appels du système contenant des informations sur les appels entrants et sortants.
WRITE_CALL_LOG
Permet à une application de modifier le journal d'appels du système stocké sur votre téléphone
android.Manifest.permission.WRITE_USER_DICTIONARY
Permet à une application d'écrire dans le dictionnaire de mots de l'utilisateur.

Fonctionnalités de l'appareil

Android 4.1 inclut une nouvelle déclaration de fonctionnalités pour les appareils dédiés à l'affichage de l'interface utilisateur sur un écran de télévision: FEATURE_TELEVISION. Pour déclarer que votre application nécessite une interface de télévision, déclarez cette fonctionnalité dans votre fichier manifeste avec l'élément <uses-feature>:

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

Cette fonctionnalité définit le terme "télévision" pour une expérience télévisuelle classique: affichées sur un grand écran, où l'utilisateur est assis loin et sous la forme dominante l'entrée ressemble à un pavé directionnel, et généralement pas à l'aide d'écrans tactiles souris/pointeur-pointeur.