Livello API: 16
Android 4.1 (JELLY_BEAN
)
è un progresso della piattaforma che offre
un'esperienza utente migliorata e prestazioni elevate. Aggiunge nuove funzionalità per utenti e app
sviluppatori. Questo documento fornisce un'introduzione alle
nuove e utili API per gli sviluppatori di app.
In qualità di sviluppatore di app, Android 4.1 è disponibile per te tramite Gestore SDK come immagine di sistema che puoi nell'emulatore Android e in una piattaforma SDK su cui puoi creare la tua app. Dovresti scarica l'immagine di sistema e la piattaforma appena possibile per creare e testare il tuo su Android 4.1.
Per ottimizzare meglio la tua app per i dispositivi con Android 4.1,
devi impostare targetSdkVersion
su
"16"
, installalo su un'immagine di sistema Android 4.1,
testarlo, quindi pubblicare un aggiornamento con questa modifica.
Tu
possono utilizzare le API in Android 4.1 e al contempo supportare le versioni precedenti aggiungendo
condizioni al codice che controllano il livello API di sistema prima di eseguirlo
API non supportate dal tuo minSdkVersion
.
Per scoprire di più su
mantenendo la compatibilità con le versioni precedenti, leggi l'articolo Creazione di una compatibilità con le versioni precedenti
UI.
Ulteriori informazioni su come funzionano i livelli API sono disponibili nella pagina Che cos'è l'API Livello?
Componenti dell'app
Servizi isolati
Specificando android:isolatedProcess="true"
nel
tag <service>
, la tua Service
verrà eseguita in
un proprio processo ID utente isolato, privo di autorizzazioni proprie.
Gestione della memoria
Le nuove costanti ComponentCallbacks2
, come TRIM_MEMORY_RUNNING_LOW
e TRIM_MEMORY_RUNNING_CRITICAL
, forniscono il primo piano
elabora altre informazioni
stato della memoria prima che il sistema chiami onLowMemory()
.
Il nuovo metodo getMyMemoryState(ActivityManager.RunningAppProcessInfo)
ti consente di:
per recuperare lo stato generale della memoria.
Fornitori di contenuti
Un nuovo metodo, acquireUnstableContentProviderClient()
, ti consente di accedere a un ContentProviderClient
che potrebbe essere "instabile" in modo che l'app non abbia un arresto anomalo
del fornitore di contenuti. È utile quando interagisci con i fornitori di contenuti in un
dell'app.
Sfondi animati
Nuovo protocollo per intent per avviare direttamente l'attività di anteprima dello sfondo animato in modo che tu possa aiutarti gli utenti possono selezionare facilmente il tuo sfondo animato senza costringerli a uscire la tua app e spostati nel selettore di sfondi Home.
Per avviare il selettore di sfondi animati, chiama startActivity()
con un Intent
utilizzando
ACTION_CHANGE_LIVE_WALLPAPER
e un extra
che specifica il tuo sfondo animato ComponentName
come stringa in EXTRA_LIVE_WALLPAPER_COMPONENT
.
Navigazione dello stack di app
Android 4.1 semplifica l'implementazione dei pattern di progettazione appropriati per Navigazione veloce.
Non devi fare altro che aggiungere android:parentActivityName
a ogni elemento <activity>
in
del file manifest. Il sistema utilizza queste informazioni per aprire l'attività appropriata quando l'utente
Preme il pulsante Su nella barra delle azioni (e termina l'attività corrente). Quindi se
dichiarare android:parentActivityName
per ogni attività, non è necessario il metodo onOptionsItemSelected()
per gestire i clic
eventi visibili sull'icona dell'app della barra delle azioni: il sistema ora gestisce l'evento e riprende o
crei l'attività appropriata.
Ciò è particolarmente efficace per i casi in cui l'utente avvia una delle attività dell'app
attraverso un "approfondimento" come un intento di una notifica o un intento
un'app diversa (come descritto nella guida alla progettazione per Navigare tra le app). Quando
l'utente inserisce la tua attività in questo modo, la tua app potrebbe non avere naturalmente uno stack
attività che possono essere riprese man mano che l'utente sale. Tuttavia, quando fornisci l'attributo android:parentActivityName
per le tue attività, il sistema riconosce
se l'app contiene già uno stack di attività principali e, in caso contrario, genera
un back stack sintetico contenente tutte le attività principali.
Nota:quando l'utente inserisce un'attività approfondita nella tua app e viene creata una nuova attività per l'app, in realtà il sistema inserisce lo stack di attività principali nell'attività. Di conseguenza, se premi il pulsante Indietro puoi anche tornare indietro nello stack di attività.
Quando il sistema crea un back stack sintetico per la tua app, crea un elemento Intent
di base per creare una nuova istanza dell'attività di ogni genitore. Quindi non c'è
stato salvato per le attività principali come previsto per la navigazione naturale dell'utente
alla
ogni attività. Se una delle attività principali mostra normalmente un'interfaccia utente che dipende
contesto dell'utente, mancano queste informazioni e
dovresti fornirle quando
utente
scorre l'elenco filtri. Ad esempio, se l'utente sta visualizzando un album
di un'app di musica, la navigazione verso l'alto potrebbe portarli a un'attività che elenca tutti gli album di un
genere musicale. In questo caso, se è necessario creare lo stack, è necessario informare il publisher principale
attività a quale genere appartiene l'album corrente, in modo che il genitore possa visualizzare l'elenco appropriato
se l'utente proviene effettivamente da quell'attività. Fornire queste informazioni a un genitore sintetico
attività, devi eseguire l'override del metodo onPrepareNavigateUpTaskStack()
. Questo
ti fornisce un oggetto TaskStackBuilder
creato dal sistema per
sintetizza le attività principali. TaskStackBuilder
contiene Intent
oggetti che il sistema utilizza per creare ciascuna attività principale. Nel tuo
implementazione di onPrepareNavigateUpTaskStack()
, puoi modificare il Intent
appropriato in
Aggiungere altri dati che l'attività del genitore può utilizzare per determinare il contesto e la visualizzazione appropriati
l'interfaccia utente appropriata.
Quando il sistema crea l'elemento TaskStackBuilder
, aggiunge gli oggetti Intent
utilizzati per creare le attività padre nella relativa logica
dall'alto dell'albero delle attività. Pertanto, l'ultimo Intent
aggiunto all'array interno è l'elemento padre diretto dell'attività corrente. Se
vuoi modificare Intent
per l'attività principale dell'attività, devi prima determinare
la lunghezza dell'array con getIntentCount()
e passiamo
su editIntentAt()
.
Se la struttura della tua app è più complessa, esistono diverse altre API disponibili che ti consentono di gestire il comportamento della navigazione personalizzare completamente il back stack sintetico. Alcune delle API che offrono funzionalità aggiuntive di controllo includono:
onNavigateUp()
- Sostituisci questa impostazione per eseguire un'azione personalizzata quando l'utente preme il pulsante Su.
navigateUpTo(Intent)
- Chiama questo numero per terminare l'attività in corso e andare all'attività indicata dal
fornito
Intent
. Se l'attività è presente nello stack esistente, ma non è il genitore più prossimo, tutte le altre attività tra l'attività corrente e anche l'attività specificata con l'intento è terminata. getParentActivityIntent()
- Chiama questo per ottenere il
Intent
che darà inizio alla logica principale per l'attività corrente. shouldUpRecreateTask(Intent)
- Chiama questo pulsante per chiedere se è necessario creare un back stack sintetico per navigare verso l'alto. Restituisce true se è necessario creare uno stack sintetico, false se lo stack appropriato esiste già.
finishAffinity()
- Chiama questo numero per completare l'attività corrente e tutte le attività principali con la stessa
di affinità delle attività collegate all'attività corrente.
Se sostituisci i comportamenti predefiniti, come
onNavigateUp()
, devi chiamare questo metodo quando Creare un back stack sintetico durante la navigazione in alto. onCreateNavigateUpTaskStack
- Esegui l'override di questa opzione se devi avere il controllo completo del modo in cui viene creato lo stack di attività sintetiche. Se vuoi semplicemente aggiungere alcuni dati extra agli intent per il tuo back stack, devi invece eseguire l'override di
onPrepareNavigateUpTaskStack()
Tuttavia, la maggior parte delle app non ha bisogno di utilizzare queste API o implementare onPrepareNavigateUpTaskStack()
, ma può ottenere il comportamento corretto semplicemente
aggiungendo android:parentActivityName
a ogni elemento <activity>
.
Multimediale
Codec multimediali
La classe MediaCodec
fornisce accesso a codec multimediali di basso livello per la codifica
e decodificare i contenuti multimediali. Puoi creare un'istanza di MediaCodec
chiamando createEncoderByType()
per codificare i contenuti multimediali o chiamando createDecoderByType()
per decodificarli. Ciascuno di questi
prendono un tipo MIME per il tipo di contenuto multimediale che vuoi codificare o decodificare, ad esempio "video/3gpp"
o "audio/vorbis"
.
Con un'istanza di MediaCodec
creata, puoi quindi chiamare configure()
per specificare proprietà come il formato multimediale o
se i contenuti sono criptati o meno.
Che tu voglia codificare o decodificare i tuoi contenuti multimediali, il resto del processo è lo stesso dopo
crea MediaCodec
. Prima chiama getInputBuffers()
per ottenere un array di input ByteBuffer
e getOutputBuffers()
per ottenere un array di oggetti ByteBuffer
di output.
Quando tutto è pronto per la codifica o la decodifica, chiama dequeueInputBuffer()
per ottenere la posizione di indice di ByteBuffer
(dall'array di buffer di input) da utilizzare per il feed nella tua origine
contenuti multimediali. Dopo aver compilato il ByteBuffer
con i contenuti multimediali di origine, ritira la proprietà
del buffer chiamando queueInputBuffer()
.
Allo stesso modo per il buffer di output, chiama dequeueOutputBuffer()
per ottenere la posizione di indice di ByteBuffer
dove riceverai i risultati. Dopo aver letto l'output da ByteBuffer
,
svincolare la proprietà chiamando il numero releaseOutputBuffer()
.
Puoi gestire i dati multimediali criptati nei codec chiamando queueSecureInputBuffer()
in combinazione con
le API MediaCrypto
, invece del normale queueInputBuffer()
.
Per ulteriori informazioni su come utilizzare i codec, consulta la documentazione di MediaCodec
.
Registra audio al momento del segnale
Il nuovo metodo startRecording()
consente
iniziare una registrazione audio in base a un segnale definito da un MediaSyncEvent
.
Il MediaSyncEvent
specifica una sessione audio
(ad esempio uno definito da MediaPlayer
), che, una volta completato, attiva
il registratore audio per iniziare a registrare. Ad esempio, puoi utilizzare questa funzionalità
riprodurrà un segnale audio che indica l'inizio di una sessione di registrazione e
inizia automaticamente, così non devi sincronizzare manualmente il tono e l'inizio
di registrazione.
Tracce di testo temporizzate
L'MediaPlayer
ora gestisce le tracce di testo in banda e fuori banda.
Le tracce di testo in banda sono disponibili come traccia di testo all'interno di un'origine multimediale MP4 o 3GPP. Testo fuori banda
È possibile aggiungere tracce come origine di testo esterna con il metodo addTimedTextSource()
. Dopo tutto il testo esterno
vengono aggiunte le sorgenti delle tracce, occorre chiamare getTrackInfo()
per ottenere
l'elenco aggiornato di tutti i canali disponibili in un'origine dati.
Per impostare la traccia da usare con MediaPlayer
, devi:
chiama selectTrack()
, utilizzando l'indice
della traccia che vuoi utilizzare.
Per ricevere una notifica quando la traccia di testo è pronta per la riproduzione, implementa il metodo
Interfaccia e tessera MediaPlayer.OnTimedTextListener
a setOnTimedTextListener()
.
Effetti audio
Il corso AudioEffect
ora supporta audio aggiuntivo
tipi di pre-elaborazione durante l'acquisizione dell'audio:
- AEC (Acoustic Echo Canceler) con
AcousticEchoCanceler
rimuove il contributo del segnale ricevuto dall'utente remoto dal segnale audio acquisito. - Controllo automatico del guadagno (AGC) con
AutomaticGainControl
normalizza automaticamente l'output del segnale acquisito. - Soppressore del rumore (NS) con
NoiseSuppressor
rimuove il rumore di fondo dal segnale acquisito.
Puoi applicare questi effetti del pre-processore all'audio acquisito con un AudioRecord
utilizzando una delle AudioEffect
le sottoclassi del deployment.
Nota:non è garantito che tutti i dispositivi supportino queste funzionalità
pertanto devi sempre verificare la disponibilità chiamando isAvailable()
sul
classe degli effetti audio.
Riproduzione senza interruzioni
Ora puoi eseguire la riproduzione senza interruzioni tra due
MediaPlayer
oggetti. In qualsiasi momento prima del termine del tuo primo MediaPlayer
,
chiama setNextMediaPlayer()
e Android
prova ad avviare il secondo giocatore nel momento in cui si ferma il primo.
Fotocamera
Movimento automatico della messa a fuoco
La nuova interfaccia Camera.AutoFocusMoveCallback
consente di ascoltare
per le modifiche al movimento della messa a fuoco automatica. Puoi registrare la tua interfaccia con setAutoFocusMoveCallback()
. Poi, quando la videocamera
è in modalità di messa a fuoco automatica continua (FOCUS_MODE_CONTINUOUS_VIDEO
o
FOCUS_MODE_CONTINUOUS_PICTURE
), riceverai una chiamata
a onAutoFocusMoving()
,
che indica se la messa a fuoco automatica è stata avviata o si è interrotta.
Suoni fotocamera
La classe MediaActionSound
fornisce un semplice set di API per generare
i suoni standard generati dalla videocamera o da altre azioni multimediali. Dovresti usare queste API per giocare
l'audio appropriato quando crei un'immagine statica o una videocamera personalizzata.
Per riprodurre un suono, crea semplicemente un'istanza di un oggetto MediaActionSound
, richiama
load()
per precaricare l'audio desiderato, poi allo
al momento opportuno, chiama il numero play()
.
Connettività
Android Beam
Android BeamTM ora supporta trasferimenti di payload di grandi dimensioni tramite Bluetooth. Quando definisci i dati
di trasferire con il nuovo setBeamPushUris()
o la nuova interfaccia di callback NfcAdapter.CreateBeamUrisCallback
, Android
passa il trasferimento dei dati a Bluetooth o un altro mezzo di trasporto alternativo
raggiungere velocità di trasferimento più elevate. Ciò è particolarmente utile per i payload di grandi dimensioni, come
file audio e non richiede l'accoppiamento visibile tra i dispositivi. Non è richiesto alcun intervento aggiuntivo da parte tua
la tua app per sfruttare i trasferimenti tramite Bluetooth.
Il metodo setBeamPushUris()
richiede un array di
Uri
oggetti che specificano i dati che vuoi trasferire dalla tua app.
In alternativa, puoi implementare NfcAdapter.CreateBeamUrisCallback
, che puoi specificare per la tua attività chiamando setBeamPushUrisCallback()
.
Quando utilizzi il
interfaccia di callback, il sistema chiama il metodo createBeamUris()
dell'interfaccia quando
l'utente esegue una condivisione con Android Beam, in modo che tu possa definire gli URI da condividere al momento della condivisione.
Questo è utile se gli URI da condividere possono variare a seconda del contesto dell'utente all'interno
attività fisica, mentre la chiamata al numero setBeamPushUris()
è utile quando gli URI da condividere non cambiano e puoi definirli in modo sicuro.
Rilevamento servizi di rete
Android 4.1 aggiunge il supporto per il rilevamento dei servizi basato su DNS multicast, che consente di trovare e connettersi a servizi offerti da dispositivi peer tramite Wi-Fi, come dispositivi mobili, stampanti, fotocamere, lettori multimediali e altri dispositivi registrati sulla rete locale.
Il nuovo pacchetto android.net.nsd
contiene le nuove API che consentono di
trasmettere i tuoi servizi sulla rete locale, rilevare dispositivi locali sulla rete e
connettersi ai dispositivi.
Per registrare il servizio, devi prima creare un NsdServiceInfo
e definire le varie proprietà del servizio con metodi come
setServiceName()
,
setServiceType()
e
setPort()
.
Poi devi implementare NsdManager.RegistrationListener
e la passiamo a registerService()
con NsdServiceInfo
.
Per scoprire i servizi sulla rete, implementa NsdManager.DiscoveryListener
e passalo a discoverServices()
.
Quando il tuo NsdManager.DiscoveryListener
viene richiamato sui servizi
trovato, devi risolvere il servizio chiamando
resolveService()
, ha passato un
implementazione di NsdManager.ResolveListener
che riceve
un oggetto NsdServiceInfo
che contiene informazioni
rilevato e ti consente di avviare la connessione.
Rilevamento del servizio P2P Wi-Fi
Le API Wi-Fi P2P sono state migliorate in Android 4.1 per supportare il rilevamento dei servizi di pre-associazione in
WifiP2pManager
. In questo modo puoi scoprire e filtrare le vicinanze
dispositivi da parte di servizi che usano Wi-Fi P2P prima di connettersi a un dispositivo, mentre il Servizio di rete
Rilevamento consente di rilevare un servizio su una rete connessa esistente (ad esempio una rete Wi-Fi locale)
Google Cloud).
Trasmettere la tua app come servizio tramite Wi-Fi in modo che altri dispositivi possano rilevare
la tua app e connettiti, chiama addLocalService()
con un
WifiP2pServiceInfo
che descrive i servizi dell'app.
Per avviare il rilevamento di dispositivi nelle vicinanze tramite Wi-Fi, devi prima decidere se
comunicare tramite Bonjour o Upnp. Per utilizzare Bonjour, imposta prima alcuni listener di callback con
setDnsSdResponseListeners()
, che richiede sia WifiP2pManager.DnsSdServiceResponseListener
sia WifiP2pManager.DnsSdTxtRecordListener
. Per utilizzare Upnp, chiama
setUpnpServiceResponseListener()
, che richiede WifiP2pManager.UpnpServiceResponseListener
.
Per poter iniziare a rilevare servizi sui dispositivi locali, devi anche chiamare addServiceRequest()
. Quando il WifiP2pManager.ActionListener
che passi a questo metodo riceve un
callback riuscito, potrai quindi iniziare a individuare i servizi sui dispositivi locali chiamando il numero discoverServices()
.
Quando vengono rilevati servizi locali, ricevi una richiamata al WifiP2pManager.DnsSdServiceResponseListener
o al WifiP2pManager.UpnpServiceResponseListener
, a seconda che tu
registrati per utilizzare Bonjour o Upnp. Il callback ricevuto in entrambi i casi contiene un
Oggetto WifiP2pDevice
che rappresenta il dispositivo peer.
Utilizzo della rete
Il nuovo metodo isActiveNetworkMetered()
ti consente di
controlla se il dispositivo è attualmente connesso a una rete a consumo. Selezionando questo stato
prima di eseguire intensive transazioni di rete, puoi contribuire a gestire l'utilizzo dei dati che potrebbe comportare dei costi per gli utenti e
decidere in modo consapevole se eseguire le transazioni ora o in un secondo momento (ad esempio,
si connette alla rete Wi-Fi).
Accessibilità
API dei servizi di accessibilità
La portata delle API dei servizi di accessibilità è stata notevolmente aumentata in Android 4.1. Adesso
consente di creare servizi che monitorano e rispondono a più eventi di input, come gesti complessi.
utilizzando onGesture()
e altri
eventi di input tramite aggiunte alle classi AccessibilityEvent
, AccessibilityNodeInfo
e AccessibilityRecord
.
I servizi di accessibilità possono anche eseguire azioni per conto dell'utente, tra cui clic,
scorrimento e passaggio del testo utilizzando performAction
e setMovementGranularities
. Il metodo performGlobalAction()
consente inoltre ai servizi di eseguire azioni come Indietro, Home e aprire Recenti
App e notifiche.
Navigazione delle app personalizzabile
Quando crei un'app per Android, ora puoi personalizzare gli schemi di navigazione individuando lo stato attivo
elementi e widget di input utilizzando findFocus()
e focusSearch()
e imposta lo stato attivo
utilizzando setAccessibilityFocused()
.
Widget più accessibili
Il nuovo corso android.view.accessibility.AccessibilityNodeProvider
ti consente di:
mostrare viste personalizzate complesse ai servizi di accessibilità in modo che possano presentare le informazioni in un
più accessibile. android.view.accessibility.AccessibilityNodeProvider
consente a un utente
widget con contenuti avanzati, ad esempio una griglia di calendario, per presentare una struttura semantica logica per
completamente separati dalla struttura di layout del widget. Questa semantica
strutturale consente ai servizi di accessibilità di presentare un modello di interazione più utile per gli utenti che
con disabilità visiva.
Copy and Paste
Copia e incolla con intent
Ora puoi associare un oggetto ClipData
a un Intent
utilizzando il metodo setClipData()
.
Ciò è particolarmente utile quando si utilizza un intent per trasferire più URI content:
a un altro
ad esempio quando si condividono più documenti. Gli URI content:
forniti
in questo modo rispetterà anche i flag dell'intent per offrire accesso in lettura o scrittura, consentendoti di concedere
accesso a più URI in un intent. Quando avvii un intent ACTION_SEND
o ACTION_SEND_MULTIPLE
, gli URI forniti nell'intent sono ora
propagarsi automaticamente a ClipData
in modo che il destinatario possa avere
l'accesso concesso.
Supporto per gli stili HTML e stringa
La classe ClipData
ora supporta il testo con stili applicati (come HTML o
In stile Android
stringhe). Puoi aggiungere testo con stile HTML a ClipData
utilizzando newHtmlText()
.
Script di rendering
La funzionalità di calcolo di Renderscript è stata migliorata con le seguenti funzionalità:
- Supporto per più kernel all'interno di un unico script.
- Supporto per la lettura dall'allocazione con campionatori filtrati dal calcolo in una nuova API script
rsSample
. - Supporto di diversi livelli di precisione FP in
#pragma
. - Supporto per l'esecuzione di query su informazioni aggiuntive da oggetti RS da uno script di computing.
- Numerosi miglioramenti delle prestazioni.
Sono inoltre disponibili nuovi pragmi per definire la precisione in virgola mobile richiesta per il calcolo di Renderscript. Ciò consente di abilitare operazioni come NEON, come le operazioni matematiche vettoriali veloci un percorso della CPU che altrimenti non sarebbe possibile con lo standard IEEE 754-2008 completo.
Nota: il motore grafico sperimentale Renderscript ora è ritirato.
Animazione
Animazioni per avvio attività
Ora puoi avviare Activity
utilizzando animazioni di zoom o
le tue animazioni personalizzate. Per specificare l'animazione che preferisci, usa le API ActivityOptions
per creare un Bundle
che puoi
quindi passiamo a uno qualsiasi
metodi che avviano un'attività, ad esempio startActivity()
.
La classe ActivityOptions
include un metodo diverso per ogni
tipo di animazione che potresti voler mostrare all'apertura dell'attività:
makeScaleUpAnimation()
- Crea un'animazione che ingrandisce la finestra dell'attività da un punto di partenza specificato posizione sullo schermo e una dimensione iniziale specificata. Ad esempio, la schermata Home Android 4.1 la usa all'apertura di un'app.
makeThumbnailScaleUpAnimation()
- Crea un'animazione che ingrandisce la finestra dell'attività a partire da una data media e un'immagine in miniatura fornita. Ad esempio, la finestra App recenti in Android 4.1 lo utilizza quando torna a un'app.
makeCustomAnimation()
- Crea un'animazione definita dalle tue risorse: una che definisce l'animazione per l'apertura dell'attività e un'altra per l'attività interrotta.
Animatore del tempo
Il nuovo TimeAnimator
consente di richiamare facilmente
meccanismo di attenzione con TimeAnimator.TimeListener
che notifica
per ogni frame dell'animazione. Con questo animatore non sono previste durate, interpolazioni o impostazioni di valore degli oggetti. Il callback del listener riceve informazioni per ogni frame, tra cui
tempo totale trascorso e il tempo trascorso dal frame dell'animazione precedente.
Interfaccia utente
Notifiche
In Android 4.1 puoi creare notifiche con regioni di contenuti più grandi, anteprime di immagini di grandi dimensioni più pulsanti di azione e priorità configurabile.
Stili di notifica
Il nuovo metodo setStyle()
consente di specificare
uno dei tre nuovi stili per le notifiche, ognuno dei quali offre una regione di contenuti più ampia. A
specifica lo stile per la tua regione di contenuti di grandi dimensioni, trasmetti a setStyle()
uno dei seguenti oggetti:
Notification.BigPictureStyle
- Per le notifiche che includono un'immagine allegata di grandi dimensioni.
Notification.BigTextStyle
- Per notifiche che includono molto testo, ad esempio una sola email.
Notification.InboxStyle
- Per le notifiche che includono un elenco di stringhe, come gli snippet di più email.
Azioni di notifica
È ora supportato l'utilizzo di un massimo di due pulsanti di azione nella parte inferiore dell' messaggio di notifica, indipendentemente dal fatto che la notifica utilizzi lo stile normale o più grande.
Per aggiungere un pulsante di azione, chiama addAction()
. Questo metodo accetta tre argomenti: una risorsa accessibile per un'icona,
testo per il pulsante e un valore PendingIntent
che definisce l'azione
a cui eseguire.
Priorità
Ora puoi suggerire al sistema l'importanza della notifica per l'effetto
dell'ordine delle notifiche nell'elenco impostando
la priorità con setPriority()
. Tu
può superare questo dei cinque diversi livelli di priorità definiti dalle costanti PRIORITY_*
del corso Notification
. Il valore predefinito è PRIORITY_DEFAULT
e ci sono due livelli più alti e due più bassi.
Le notifiche con priorità elevata sono aspetti a cui gli utenti in genere vogliono rispondere rapidamente, ad esempio un nuovo messaggio immediato, un SMS o un promemoria di un evento imminente. Priorità bassa Le notifiche sono, ad esempio, eventi di calendario scaduti o promozioni di app.
Controlli per l'UI di sistema
Android 4.0 (Ice Cream Sandwich) ha aggiunto nuovi flag per controllare la visibilità dell'interfaccia utente di sistema
ad esempio per attenuare l'aspetto della barra del sistema o farla scomparire completamente sugli smartphone.
Android 4.1 aggiunge qualche altro flag che consente di controllare ulteriormente l'aspetto del sistema
Gli elementi dell'interfaccia utente e il layout dell'attività in relazione ad essi richiamando setSystemUiVisibility()
e passando i seguenti flag:
SYSTEM_UI_FLAG_FULLSCREEN
- Nascondi l'interfaccia utente di sistema non critica (ad esempio la barra di stato).
Se la tua attività utilizza la barra delle azioni in modalità overlay (di
attivando
android:windowActionBarOverlay
), questo flag nasconde anche la barra delle azioni quindi con un'animazione coordinata quando nascondi e mostra i due. SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- Imposta il layout delle attività in modo che utilizzi la stessa area dello schermo che hai a disposizione
abilitato
SYSTEM_UI_FLAG_FULLSCREEN
anche se gli elementi UI di sistema sono ancora visibili. Sebbene alcune parti del layout vengano sovrapposte UI di sistema, questa opzione è utile se la tua app spesso nasconde e mostra l'UI di sistema conSYSTEM_UI_FLAG_FULLSCREEN
, perché evita il layout da regolarsi ai nuovi limiti del layout ogni volta che l'interfaccia utente di sistema si nasconde o viene visualizzata. SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- Imposta il layout delle attività in modo che utilizzi la stessa area dello schermo che hai a disposizione
SYSTEM_UI_FLAG_HIDE_NAVIGATION
attivata (aggiunto in Android 4.0) anche se gli elementi dell'interfaccia utente di sistema sono ancora visibili. Anche se alcune parti del layout saranno a cui viene sovrapposto barra di navigazione, questa opzione è utile se la tua app spesso nasconde e mostra la barra di navigazione conSYSTEM_UI_FLAG_HIDE_NAVIGATION
, perché evita il layout regolarsi ai nuovi limiti del layout ogni volta che la barra di navigazione si nasconde o viene visualizzata. SYSTEM_UI_FLAG_LAYOUT_STABLE
- Ti consigliamo di aggiungere questo flag se usi
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
e/oSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
per assicurarti che quando chiamifitSystemWindows()
su una vista che i limiti definiti rimangono coerenti per quanto riguarda lo spazio sullo schermo disponibile. In altre parole, con questo flag impostato,fitSystemWindows()
si comporterà come se la visibilità degli elementi dell'interfaccia utente di sistema fosse invariata anche dopo aver nascosto tutta l'interfaccia utente di sistema.
Per ulteriori discussioni sugli altri flag dell'interfaccia utente di sistema correlati, consulta quelle aggiunte in Android 4.0.
Visualizzazioni remote
GridLayout
e ViewStub
sono ora rimovibili per consentirti di utilizzarle nei layout
widget di app e layout personalizzati per le notifiche.
Famiglie di caratteri
Android 4.1 aggiunge diverse altre varianti dello stile del carattere Roboto per un totale di 10 varianti. e tutti possono essere utilizzati dalle app. Ora le app hanno accesso all'insieme completo di dispositivi varianti condensate.
Il set completo di varianti di caratteri Roboto disponibili è:
- Periodici
- Corsivo
- Grassetto
- Grassetto corsivo
- Chiaro
- Corsivo chiaro
- Regolare condensato
- Corsivo ridotto
- Grassetto ridotto
- Grassetto-corsivo ridotto
Puoi applicare una qualsiasi di queste con la nuova fontFamily
in combinazione con l'attributo textStyle
.
I valori supportati per fontFamily
sono:
"sans-serif"
per Roboto normale"sans-serif-light"
per Roboto Light"sans-serif-condensed"
per Roboto Condensed
Puoi quindi applicare grassetto e/o corsivo con i valori di textStyle
"bold"
e "italic"
. Puoi applicare entrambi in questo modo: android:textStyle="bold|italic"
.
Puoi anche usare Typeface.create()
.
Ad esempio, Typeface.create("sans-serif-light", Typeface.NORMAL)
.
Framework di input
Più dispositivi di input
La nuova classe InputManager
ti consente di eseguire query
insieme di dispositivi di input attualmente connessi e che si registrano per ricevere una notifica quando un nuovo dispositivo
viene aggiunto, modificato o rimosso. Ciò è particolarmente utile se stai creando un gioco
che supporta più giocatori e vuoi sapere quanti controller sono collegati
e in caso di variazioni nel numero di controller.
Puoi eseguire query su tutti i dispositivi di input connessi chiamando
getInputDeviceIds()
. Questo restituisce
un array di numeri interi, ognuno dei quali è un ID per un diverso dispositivo di input. Puoi quindi chiamare
getInputDevice()
per acquisire
un InputDevice
per un ID dispositivo di input specificato.
Se vuoi ricevere una notifica quando nuovi dispositivi di input vengono connessi, modificati o disconnessi,
implementare l'interfaccia InputManager.InputDeviceListener
e
registralo con registerInputDeviceListener()
.
Vibrazione per i controller di input
Se i dispositivi di input collegati hanno le proprie funzionalità di vibrazione, ora puoi controllare
la vibrazione di questi dispositivi usando le API Vibrator
esistenti semplicemente
chiamando getVibrator()
su InputDevice
.
Autorizzazioni
Di seguito sono riportate le nuove autorizzazioni:
READ_EXTERNAL_STORAGE
- Fornisce l'accesso protetto in lettura allo spazio di archiviazione esterno. In Android 4.1 di per impostazione predefinita tutte le applicazioni hanno l'accesso. Questo aspetto verrà modificato in una release futura per rendere obbligatorio che le applicazioni richiedano esplicitamente accesso in lettura utilizzando questa autorizzazione. Se la tua applicazione richiede già l'accesso in scrittura, otterranno automaticamente anche l'accesso in lettura. È disponibile una nuova opzione sviluppatore per attivare l'accesso in lettura limitazione, per consentire agli sviluppatori di testare le loro applicazioni in base al comportamento di Android per il futuro.
- android.Manifest.permission.READ_USER_DICTIONARY
- Consente a un'applicazione di leggere il dizionario utente. Questa operazione dovrebbe essere richiesta solo IME o un editor di dizionari come l'app Impostazioni.
READ_CALL_LOG
- Consente a un'applicazione di leggere il registro chiamate di sistema contenente informazioni su chiamate in arrivo e in uscita.
WRITE_CALL_LOG
- Consente a un'applicazione di modificare il registro chiamate di sistema memorizzato sul telefono
- android.Manifest.permission.WRITE_USER_DICTIONARY
- Consente a un'applicazione di scrivere nel dizionario di parole dell'utente.
Funzionalità del dispositivo
Android 4.1 include una nuova dichiarazione di funzionalità per i dispositivi dedicati
alla visualizzazione dell'interfaccia utente sullo schermo di una televisione: FEATURE_TELEVISION
. Per dichiarare che la tua app richiede
un'interfaccia televisiva, dichiara questa funzionalità nel tuo file manifest con l'elemento <uses-feature>
:
<manifest ... > <uses-feature android:name="android.hardware.type.television" android:required="true" /> ... </manifest>
Questa funzionalità definisce la "televisione" in una tipica esperienza televisiva in salotto: visualizzato su uno schermo di casa, in cui l'utente è seduto lontano e la forma principale dell'input è simile a un D-pad e generalmente non attraverso il tocco o Mouse/dispositivo-pointer.