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.
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 avecSYSTEM_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 avecSYSTEM_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/ouSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
pour vous assurer que lorsque vous appelezfitSystemWindows()
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.