Android 8.0 (livello API 26) introduce una serie di nuove funzioni per utenti e sviluppatori. Questo documento mette in evidenza le novità per gli sviluppatori.
Assicurati di controllare anche Modifiche del comportamento di Android 8.0 per scoprire di più sulle aree in cui la piattaforma cambia ciò potrebbe influire sulle tue app.
Esperienza utente
Modalità Picture in picture
Picture in picture in Android 8.0.
Android 8.0 (livello API 26) consente l'avvio delle attività in modalità Picture in picture (PIP). PIP è un tipo speciale di modalità multi-finestra utilizzata principalmente per la riproduzione video. La modalità PIP era inizialmente disponibile per Solo Android TV; Android 8.0 rende disponibile la funzionalità su altri dispositivi Android.
Quando un'attività è in modalità PIP, è nello stato di pausa, ma dovrebbe
continuano a mostrare contenuti. Per questo motivo, devi assicurarti che la tua app
non mette in pausa la riproduzione nei suoi onPause()
. Devi invece mettere in pausa il video tra onStop()
e riprendere la riproduzione tra onStart()
. Per ulteriori informazioni, vedi
Multi-finestra
Ciclo di vita.
Per specificare che per la tua attività è possibile usare la modalità PIP, imposta
android:supportsPictureInPicture
su true nel manifest.
A partire da Android 8.0, PIP non richiede
Attributo manifest android:resizeableActivity
.
Tuttavia, devi impostare
android:resizeableActivity
su "true" se la tua attività supporta altre
modalità multi-finestra).
Android 8.0 (livello API 26) introduce un nuovo oggetto, PictureInPictureParams
,
che passi ai metodi PIP per specificare il comportamento di un'attività
in modalità PIP. Questo oggetto specifica proprietà come
le proporzioni preferite per l'attività.
I metodi PIP esistenti descritti in Aggiunta Ora la modalità Picture in picture utilizzata su tutti i dispositivi Android, non solo su Android TV. Inoltre, Android 8.0 offre i seguenti metodi per supportare Modalità PIP:
Activity.enterPictureInPictureMode(PictureInPictureParams args)
: Imposta l'attività in modalità Picture in picture. Le proporzioni dell'attività e altre impostazioni di configurazione sono specificate da args. Eventuali campi in args sono vuoti, il sistema utilizza i valori impostati l'ultima volta chiamatoActivity.setPictureInPictureParams()
.L'attività specificata viene posizionata in un angolo dello schermo. il resto la schermata mostra l'attività precedente presente sullo schermo. L'attività che entra in modalità PIP passa allo stato di pausa, ma rimane a iniziare. Se l'utente tocca l'attività PIP, il sistema mostra un menu per l'utente con cui interagire; gli eventi no touch raggiungono l'attività mentre è nello stato PIP.
-
Activity.setPictureInPictureParams()
: Aggiorna le impostazioni di configurazione PIP di un'attività. Se l'attività è attualmente in modalità PIP, le impostazioni sono aggiornate; Ciò è utile se le proporzioni dell'attività cambiano. Se l'attività non è in modalità PIP, queste impostazioni di configurazione vengono utilizzate indipendentementeenterPictureInPictureMode()
metodo che chiami.
Notifiche
In Android 8.0 (livello API 26), abbiamo riprogettato le notifiche per forniscono un modo più semplice e più coerente per gestire il comportamento delle notifiche e impostazioni. Queste modifiche includono:
- Canali di notifica: Android 8.0 introduce Canali di notifica che consentono di creare un canale personalizzabile dall'utente per ciascun tipo di notifica che vuoi visualizzare. L'interfaccia utente si riferisce ai canali di notifica come categorie di notifica. Per ulteriori informazioni per implementare i canali di notifica, consulta Gestione canali di notifica.
- Indicatori di notifica: Android 8.0 introduce il supporto per la visualizzazione punti o badge sulle icone in Avvio applicazioni. Gli indicatori di notifica riflettono Presenza di notifiche che l'utente non ha ancora ignorato o in seguito a un'azione. Per informazioni su come utilizzare gli indicatori di notifica, vedi Notifica badge.
- Posticipo: gli utenti possono posticipare le notifiche e farle scomparire per un determinato periodo di tempo prima di riapparire. Le notifiche riappaiono con il lo stesso livello di importanza con cui sono apparsi per la prima volta. Le app possono rimuovere o aggiornare una notifica posticipata, ma l'aggiornamento di una notifica posticipata non causa affinché riappaia.
- Timeout notifiche: puoi impostare un timeout durante la creazione di un
tramite
setTimeoutAfter()
. Puoi utilizzare questo metodo per specificare un periodo di tempo trascorso il quale una notifica deve essere annullato. Se necessario, puoi annullare una notifica prima del è trascorso il tempo di timeout specificato. - Impostazioni di notifica: puoi chiamare
setSettingsText()
per impostare il testo che viene visualizzato quando crei un link al impostazioni di notifica da una notifica utilizzando IntenzioneNotification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES
. Il sistema potrebbe fornire i seguenti extra allo scopo di filtrare le impostazioni che la tua app deve mostrare agli utenti:EXTRA_CHANNEL_ID
,NOTIFICATION_TAG
eNOTIFICATION_ID
. - Ignorare le notifiche: gli utenti possono ignorare le notifiche autonomamente.
le app possono rimuoverle in modo programmatico. Puoi stabilire quando una notifica
viene ignorato e perché viene ignorato implementando
onNotificationRemoved()
dal metodoNotificationListenerService
corso. - Colori di sfondo: puoi impostare e attivare un colore di sfondo per un
notifica. Dovresti usare questa funzione nelle notifiche soltanto per
attività in corso che sono fondamentali per una rapida occhiata all'utente. Per
Ad esempio, puoi impostare un colore di sfondo per le notifiche relative a
indicazioni stradali o una telefonata in corso. Puoi anche impostare
il colore di sfondo desiderato utilizzando
setColor()
. In questo modo consente di utilizzaresetColorized()
per attivare l'utilizzo di un colore di sfondo per una notifica. - Stile dei messaggi. In Android 8.0, le notifiche che utilizzano lo
Visualizzazione dei corsi
MessagingStyle
più contenuti nella loro forma compressa. Dovresti usare loMessagingStyle
corso per notifiche relative ai messaggi. Puoi utilizzare anche MetodoaddHistoricMessage()
per fornire contesto a una conversazione aggiungendo messaggi storici alle notifiche relative ai messaggi.
![Un menu di notifica con pressione prolungata in Android 8.0 (livello API 26).](https://developer.android.google.cn/static/images/about/versions/oreo/notification-long-press.png?authuser=0000&hl=it)
Gli utenti possono premere a lungo sulle icone di Avvio applicazioni per visualizzare in Android 8.0.
Framework di compilazione automatica
La creazione degli account, l'accesso e le transazioni con carta di credito richiedono tempo e sono soggetti a errori. Gli utenti possono essere facilmente infastiditi dalle app che richiedono questi tipi di attività ripetitive.
Android 8.0 (livello API 26) consente la compilazione di moduli, ad esempio l'accesso e i moduli per carte di credito, con l'introduzione del framework di compilazione automatica. Le app nuove ed esistenti funzionano con il framework di compilazione automatica dopo l'attivazione da parte dell'utente la compilazione automatica.
Puoi intraprendere alcune azioni per ottimizzare il funzionamento della tua app con il framework. Per ulteriori informazioni, consulta la Panoramica sul framework di compilazione automatica.
Caratteri scaricabili
Android 8.0 (livello API 26) e Android Support Library 26 consentono di richiedere caratteri da un dell'applicazione provider di servizi di terze parti anziché raggruppare i caratteri nell'APK o lasciare che Caratteri per il download di APK. Questa funzionalità riduce le dimensioni dell'APK, aumenta l'app percentuale di successo dell'installazione e consente a più app di condividere lo stesso carattere.
Per ulteriori informazioni sul download dei caratteri, consulta Caratteri scaricabili.
Caratteri in XML
Android 8.0 (livello API 26) introduce una nuova funzionalità, Caratteri in XML, che
consente di usare i caratteri come risorse. Ciò significa che non è necessario raggruppare i caratteri
come asset. I caratteri vengono compilati in un file R
e vengono automaticamente
disponibili nel sistema come risorsa. Puoi quindi accedere a questi caratteri con
di un nuovo tipo di risorsa, font
.
La libreria di supporto 26 fornisce il supporto completo per questa funzionalità sui dispositivi con l'API 14 e versioni successive.
Per ulteriori informazioni sull'utilizzo dei caratteri come risorse e sul recupero dei caratteri di sistema, consulta Caratteri in XML.
Ridimensionamento automatico della visualizzazione di testo
Android 8.0 (livello API 26) consente di impostare le dimensioni dell'espansione del testo automaticamente in base alle dimensioni dell'elemento TextView. Ciò significa che è più facile ottimizzare le dimensioni del testo su schermi diversi o con contenuti dinamici. Per ulteriori informazioni sul ridimensionamento automatico di TextView in Android 8.0, consulta la sezione Auto dimensionamento della TextView.
Icone adattive
Android 8.0 (livello API 26) introduce le icone Avvio app adattive. Le icone adattive supportano le immagini e possono mostrare una varietà di forme su diversi modelli di dispositivi. Per scoprire come creare icone adattive, consulta la sezione Icone adattive guida.
Gestione dei colori
Gli sviluppatori Android di app di imaging possono ora sfruttare i nuovi dispositivi che dispongono di un display con colori ad ampia gamma. Per visualizzare un ampio gamut immagini, le app dovranno attivare un flag nel file manifest (per attività) e caricare bitmap con un profilo cromatico largo incorporato (AdobeRGB, foto professionale RGB, DCI-P3 e così via).
API WebView
Android 8.0 fornisce diverse API per aiutarti a gestire
gli oggetti WebView
che mostrano contenuti web nella tua app.
Queste API, che migliorano la stabilità e la sicurezza della tua app, includono
seguenti:
- API Version
- API Google Navigazione sicura
- API Terminazione Handle
- API Renderer Importance
Per saperne di più su come utilizzare queste API, consulta Gestione dei componenti WebView.
Il corso WebView
ora include un'API Navigazione sicura per migliorare la sicurezza
della navigazione sul web. Per ulteriori informazioni, vedi
API Google Navigazione sicura.
Blocco di scorciatoie e widget
Android 8.0 (livello API 26) introduce il blocco in-app delle scorciatoie e widget. Nella tua app, puoi creare widget e scorciatoie fissati per Avvio app supportate, soggette all'autorizzazione dell'utente.
Per ulteriori informazioni, consulta Bloccare scorciatoie e widget guida alle funzionalità.
Proporzioni massime dello schermo
Android 8.0 (livello API 26) apporta modifiche alla configurazione delle proporzioni massime di un'app.
Innanzitutto, Android 8.0 introduce maxAspectRatio, che che puoi utilizzare per impostare le proporzioni massime della tua app. Inoltre, in Android 8.0 e versioni successive, il le proporzioni massime predefinite sono le proporzioni native del dispositivo su cui è in esecuzione l'app.
Per ulteriori informazioni sulla dichiarazione delle proporzioni massime, consulta Supporto di più schermi.
Supporto di più display
A partire da Android 8.0 (livello API 26), la piattaforma offre supporta più display. Se un'attività supporta la modalità multi-finestra e è in esecuzione su un dispositivo con più display, gli utenti possono spostare l'attività da un display all'altro. Quando un'app avvia un'attività, l'app puoi specificare su quale display deve essere eseguita l'attività.
Nota: se un'attività supporta modalità multi-finestra, Android 8.0 abilita automaticamente su più display per quell'attività. Devi testare l'app per assicurarsi che funzioni adeguatamente in un ambiente multi-display.
È possibile riprendere una sola attività alla volta, anche se ha più display. L'attività con lo stato attivo è nello stato Ripresa. tutte le altre attività visibili vengono messe in pausa, ma non vengono interrotte. Per ulteriori informazioni del ciclo di vita delle attività quando sono visibili diverse attività, consulta la sezione Multi-finestra Ciclo di vita.
Quando un utente sposta un'attività da un display all'altro, il sistema ridimensiona l'attività e apporta modifiche al runtime, se necessario. Le tue attività può gestire autonomamente la modifica della configurazione oppure può consentire al sistema eliminare il processo contenente la tua attività e ricrearlo con il nuovo dimensioni. Per ulteriori informazioni, vedi Gestione della configurazione Modifiche.
ActivityOptions
offre due nuovi metodi per supportare
più display:
setLaunchDisplayId()
- Specifica su quale display deve essere mostrata l'attività quando viene avviata.
getLaunchDisplayId()
- Mostra la visualizzazione corrente dell'avvio dell'attività.
La shell ADB è stata estesa per supportare più display.
Ora puoi usare il comando shell start
per avviare un'attività,
e specificare il target dell'attività:
adb shell start <activity_name> --display <display_id>
Margini e spaziatura interna di layout unificati
Android 8.0 (livello API 26) ti consente di specificare più facilmente situazioni in cui lati opposti
di un elemento View
usano lo stesso margine o spaziatura interna.
In particolare, ora puoi utilizzare i seguenti attributi nel tuo file XML di layout
file:
-
layout_marginVertical
, che definiscelayout_marginTop
elayout_marginBottom
. -
layout_marginHorizontal
, che definiscelayout_marginLeft
elayout_marginRight
. -
paddingVertical
, che definiscepaddingTop
epaddingBottom
. -
paddingHorizontal
, che definiscepaddingLeft
epaddingRight
.
Nota: se personalizzi la logica della tua app per
supportano diverse
lingue e culture, inclusa la direzione del testo, tieni presente che questi
non influenzano i valori di
layout_marginStart
,
layout_marginEnd
,
paddingStart
oppure
paddingEnd
. Puoi impostare questi valori personalmente, oltre a
i nuovi attributi di layout verticale e orizzontale, per creare un comportamento del layout
dipende dalla direzione del testo.
Acquisizione del puntatore
Alcune app, come i giochi, il desktop remoto e i client di virtualizzazione, traggono vantaggio dal controllo del puntatore del mouse. L'acquisizione del puntatore è una nuova funzionalità di Android 8.0 (livello API 26) che offre questo controllo fornendo tutti gli eventi del mouse a una visualizzazione mirata nell'app.
A partire da Android 8.0, un View
nella tua app può richiedere
acquisizione del puntatore e definisci un listener per elaborare gli eventi del puntatore acquisiti. La
il puntatore del mouse è nascosto in questa modalità. La vista può rilasciare l'acquisizione del puntatore
quando non sono più necessarie
le informazioni del mouse. Il sistema può anche rilasciare
acquisizione del puntatore quando la vista perde lo stato attivo, ad esempio quando l'utente apre
un'altra app.
Per informazioni su come usare questa funzione nella tua app, vedi Acquisizione del puntatore.
Categorie di app
Android 8.0 (livello API 26) consente a ogni app di dichiarare una categoria adatta
quando pertinenti. Queste categorie vengono usate per raggruppare app simili
scopo o funzione quando li si presenta agli utenti, ad esempio per l'utilizzo dei dati, l'utilizzo della batteria o
Utilizzo dello spazio di archiviazione. Puoi definire una categoria per la tua app impostando la
Attributo android:appCategory
in <application>
.
Avvio app di Android TV
Android 8.0 (livello API 26) include una nuova Esperienza nella schermata Home di Android TV, disponibile con l'emulatore Android TV e l'immagine del dispositivo Nexus Player per Android 8.0. La nuova schermata Home organizza contenuti video in righe corrispondenti ai canali, ognuna con i programmi di un'app all'interno del sistema. Le app possono pubblicare più canali e gli utenti possono configurare i canali a loro disposizione vuoi vedere nella schermata Home. La schermata Home di Android TV include anche la riga Cosa guardare, che con programmi delle app, in base alle abitudini di visualizzazione dell'utente. Le app possono inoltre fornire Anteprime video, che vengono riprodotte automaticamente quando un utente si concentra su un programma. Le API per i canali e i programmi che popolano fanno parte delle API TvProvider, che sono distribuite come Supporta il modulo Libreria con Android 8.0.
Set di animazioni
A partire da Android 8.0 (livello API 26), l'API AnimatorSet
supporta la ricerca e la riproduzione in
inversa. La ricerca ti consente di impostare la posizione dell'animazione impostata su una specifica
in un determinato momento. La riproduzione invertita è utile se l'app include animazioni
per le azioni che possono essere annullate. Invece di definire due animazioni separate
di serie, puoi eseguire la stessa sequenza al contrario.
Input e navigazione
Cluster di navigazione con tastiera
Se un'attività nella tua app utilizza una gerarchia di visualizzazioni complessa, come quella nella Nella Figura 2, considera la possibilità di organizzare gruppi di elementi UI in cluster per semplificare la navigazione da tastiera. Gli utenti possono premere Meta + Tab o Ricerca + Tab Chromebook, per passare da un cluster all'altro. Buoni esempi di I cluster includono: riquadri laterali, barre di navigazione, aree di contenuti principali ed elementi che potrebbero contenere molti elementi secondari.
![Un'attività di esempio che include cinque cluster di navigazione che l'utente
possono navigare usando la scorciatoia del cluster di navigazione da tastiera. I cluster
vengono visualizzati nella seguente disposizione: riquadro superiore, riquadro laterale sinistro, contenuti principali
riquadro inferiore e pulsante di azione mobile.](https://developer.android.google.cn/static/images/about/versions/oreo/keyboard-navigation-clusters.png?authuser=0000&hl=it)
Per creare un elemento View
o ViewGroup
per un cluster, imposta
.
android:keyboardNavigationCluster
a
true
nel file XML di layout dell'elemento o trasmetti true
in setKeyboardNavigationCluster()
nella logica UI della tua app.
Nota: i cluster non possono essere nidificati, anche se non sono nidificati.
i cluster possono apparire a livelli diversi della gerarchia. Se tenti di
cluster Nest, il framework tratta solo i primi
Elemento ViewGroup
come cluster.
Sui dispositivi dotati di touchscreen, puoi impostare un cluster designato
ViewGroup
oggetto
Elemento android:touchscreenBlocksFocus
da true
a
consentire l'accesso e l'uscita da un cluster solo al cluster. In questo caso
configurazione in un cluster, gli utenti non possono usare il tasto Tab o i tasti Freccia
entrare o uscire dal cluster; deve premere il pulsante di navigazione del cluster,
combinazione di tastiere.
Visualizza lo stato attivo predefinito
In Android 8.0 (livello API 26), puoi assegnare il View
che dovrebbe
riceve lo stato attivo dopo che è stata ripresa un'attività (ri)creata e l'utente preme
tasto di navigazione da tastiera, come il tasto Tab. Per applicare questa impostazione "attivata per impostazione predefinita"
dell'impostazione, imposta un elemento View
android:focusedByDefault
a true
in
il file XML di layout contenente l'elemento UI oppure passa true
a
setFocusedByDefault()
nel tuo
della logica UI dell'app.
Output vocale
Le attività e i servizi possono utilizzare istanze di
TextToSpeech
per dettare e pronunciare i contenuti. Dati aggiornati
Android 8.0 (livello API 26), la tua app può ottenere informazioni più precise sui tempi
su quando un motore di sintesi vocale inizia a pronunciare singole parole sintetizzate,
purché il motore fornisca queste informazioni. Puoi usare questa funzionalità
per richiamare l'attenzione su parole specifiche mentre parla il motore di sintesi vocale
che li rappresentano.
Per utilizzare questi miglioramenti del motore di sintesi vocale nella tua app, registra un
di UtteranceProgressListener
. Nell'ambito della
procedura di registrazione, includi un gestore
onRangeStart()
.
Il motore di sintesi vocale chiama
rangeStart()
per registrare
il momento in cui si prevede la riproduzione audio di un intervallo specifico di testo
per iniziare. Quando viene avviata la riproduzione dell'audio per quell'intervallo di testo, lo stato
onRangeStart()
. L'app può quindi rispondere a questo callback, ad esempio
evidenziare l'intervallo di testo associato alla frase.
Per ulteriori informazioni sul monitoraggio dell'avanzamento della riproduzione di una sintesi vocale
di ricerca, consulta la classe UtteranceProgressListener
riferimento.
Sistema
Nuovi rilevatori StrictMode
Android 8.0 (livello API 26) aggiunge tre nuovi rilevatori StrictMode per aiutare a identificare potenziali bug nella tua app:
detectUnbufferedIo()
rileverà quando la tua app legge o scrive dati senza buffering, il che può influire drasticamente le prestazioni dei dispositivi.- Azione che
detectContentUriWithoutPermission()
eseguirà rileva quando la tua app dimentica accidentalmente di concedere autorizzazioni a un'altra app quando avviando un'attività esterna alla tua app. detectUntaggedSockets()
rileverà quando la tua app esegue traffico di rete senzasetThreadStatsTag(int)
per codificare il traffico per il debug scopi.
Dati memorizzati nella cache
Android 8.0 (livello API 26) offre indicazioni e comportamenti migliori in merito ai dati memorizzati nella cache. Ciascuna
all'app viene ora assegnata una quota di spazio su disco per i dati memorizzati nella cache, come restituito
getCacheQuotaBytes(UUID)
.
Quando il sistema ha bisogno di liberare spazio su disco, inizia eliminando i file memorizzati nella cache dalle app che superano la quota allocata. Di conseguenza, se conservi i tuoi dati memorizzati nella cache quota allocata, i file memorizzati nella cache saranno tra gli ultimi sul sistema a essere cancellati necessaria. Quando il sistema decide quali file memorizzati nella cache eliminare all'interno dell'app, considera per primi i file meno recenti (in base all'ora di modifica).
Sono inoltre disponibili due nuovi comportamenti che puoi attivare in base alla directory per controllare In che modo il sistema libera i dati memorizzati nella cache:
StorageManager.setCacheBehaviorAtomic()
può essere utilizzato per indicare che una directory e i suoi contenuti debbano essere eliminati come una singola unità atomica.setCacheBehaviorTombstone(File, boolean)
può essere utilizzato per indicare che, anziché eliminare i file all'interno di una directory, vengano troncati in modo da avere una dimensione pari a 0 byte senza modificare la lunghezza del testo, lasciando intatto il file vuoto.
Infine, se devi allocare spazio su disco per file di grandi dimensioni, valuta la possibilità di utilizzare
API allocateBytes(FileDescriptor, long)
, che si cancellerà automaticamente
file memorizzati nella cache appartenenti ad altre app (se necessario) per soddisfare la tua richiesta. Nel decidere se
sul dispositivo abbia spazio su disco sufficiente per contenere i nuovi dati, chiama
getAllocatableBytes(UUID)
anziché utilizzare
getUsableSpace()
, poiché la prima prenderà in considerazione eventuali copie memorizzate nella cache
che il sistema è disposto a cancellare per tuo conto.
Pagina del fornitore di contenuti
Abbiamo aggiornato i fornitori di contenuti in modo da includere il supporto del caricamento di del set di dati, una pagina alla volta. Ad esempio, un'app di fotografia con molte migliaia di le immagini possono interrogare un sottoinsieme di dati da presentare in una pagina. Ogni pagina dei risultati restituiti da un fornitore di contenuti è rappresentato da un unico cursore . Sia il client che il provider devono implementare il paging per poter utilizzare questa funzionalità.
Per informazioni dettagliate sulle modifiche ai fornitori di contenuti, consulta
ContentProvider
e
ContentProviderClient
.
Richieste di aggiornamento dei contenuti
Le ContentProvider
e
ContentResolver
di corsi ora includono un
refresh()
, che consente ai clienti di scoprire più facilmente se
le informazioni richieste siano aggiornate.
Puoi aggiungere una logica di aggiornamento dei contenuti personalizzata estendendo
ContentProvider
. Assicurati di sostituire il valore
refresh()
metodo da restituire
true
, per indicare ai clienti del tuo provider che hai tentato
per aggiornare autonomamente i dati.
L'app client può richiedere esplicitamente contenuti aggiornati chiamando un
di questo metodo, chiamato anche
refresh()
. Quando chiami
passa l'URI dei dati da aggiornare.
Nota:dato che potresti richiedere dati tramite una rete,
dovresti richiamare refresh()
da
lato client solo se esiste un indicatore significativo che i contenuti sono obsoleti.
Il motivo più comune per eseguire questo tipo di aggiornamento dei contenuti è in risposta al
un'opzione scorri per aggiornare
che richiede esplicitamente all'interfaccia utente corrente di visualizzare contenuti aggiornati.
Miglioramenti a JobScheduler
Android 8.0 (livello API 26) introduce una serie di miglioramenti a JobScheduler
. Questi miglioramenti semplificano
per rispettare le nuove prestazioni
limiti di esecuzione, poiché in genere puoi usare i job pianificati
i servizi in background o i broadcast receiver impliciti, ora soggetti a limitazioni.
Gli aggiornamenti di JobScheduler
includono:
-
Ora puoi associare una coda di lavoro a un lavoro pianificato. Per aggiungere un elemento di lavoro a
la coda di un job, richiama
JobScheduler.enqueue()
Quando il job è in esecuzione, può rimuovere il lavoro in sospeso dalla coda ed elaborarlo. Questa funzionalità gestisce molti dei casi d'uso che in precedenza avrebbero dovuto per avviare un servizio in background, in particolare i servizi che implementanoIntentService
. -
Android
Support Library 26.0.0 introduce una nuova classe
JobIntentService
, che offre lo stesso comeIntentService
ma utilizza i job invece di con Android 8.0 (livello API 26) o versioni successive. -
Ora puoi chiamare
JobInfo.Builder.setClipData()
per associareClipData
a un job. Questa opzione abilita di associare le concessioni di autorizzazioni URI a un job, in modo simile a come queste possono essere propagate aContext.startService()
. Puoi anche utilizzare le concessioni di autorizzazioni URI con gli intent nelle code di lavoro. -
I job pianificati ora supportano diversi nuovi vincoli:
JobInfo.isRequireStorageNotLow()
- Il job non viene eseguito se lo spazio di archiviazione disponibile sul dispositivo è in esaurimento.
JobInfo.isRequireBatteryNotLow()
- Il lavoro non viene eseguito se il livello della batteria è pari o inferiore a soglia; questo è il livello al quale il dispositivo mostra lo stato Batteria in esaurimento finestra di dialogo di avviso.
NETWORK_TYPE_METERED
- Il job richiede una connessione di rete a consumo, come la maggior parte della rete dati piani.
Datastore personalizzato
Android 8.0 (livello API 26) ti consente di fornire un datastore personalizzato in base alle tue preferenze, essere utili se l'app archivia le preferenze in un database cloud o locale oppure se le preferenze sono specifiche per dispositivo. Per ulteriori informazioni di implementazione del datastore, fai riferimento Archivio di dati personalizzati.
Miglioramenti dei contenuti multimediali
Volumeshaper
È disponibile un nuovo corso VolumeShaper
. Utilizza le funzionalità di
per eseguire brevi transizioni automatiche del volume come dissolvenze in entrata, dissolvenze in uscita e dissolvenze incrociate.
Consulta Controllo dell'ampiezza con VolumeShaper
per saperne di più.
Miglioramenti della messa a fuoco audio
Le app audio condividono l'output audio su un dispositivo richiedendo e abbandonando lo stato attivo dell'audio.
Un'app gestisce le modifiche dello stato attivo avviando o interrompendo la riproduzione o riducendo il volume.
È disponibile un nuovo corso AudioFocusRequest
. Se usi questa classe come parametro
requestAudioFocus()
,
le app hanno nuove funzionalità per gestire le modifiche al focus audio:
attenuazione automatica e
aumento della messa a fuoco in ritardo.
Metriche relative ai media
Un nuovo metodo getMetrics()
restituisce un PersistableBundle
contenente il codice di configurazione
e le informazioni sulle prestazioni, espresse come mappa di attributi e valori.
Il metodo getMetrics()
è definito per queste classi multimediali:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
Le metriche vengono raccolte separatamente per ogni istanza e vengono mantenute per tutta la durata dell'istanza. Se non sono disponibili metriche, il metodo restituisce null. Le metriche effettive restituite dipendono dalla classe.
Media player
A partire da Android 8.0 (livello API 26), MediaPlayer può riprodurre Con protezione DRM e contenuti multimediali criptati a livello di campione HLS.
Android 8.0 introduce un nuovo modello sovraccarico
il comando seekTo()
che fornisce dati
per la ricerca di un frame. Include un secondo parametro che specifica una modalità di ricerca:
SEEK_PREVIOUS_SYNC
sposta la posizione dei contenuti multimediali in un frame di sincronizzazione (o tasto) associati a un'origine dati che si trova subito prima o in un dato momento.SEEK_NEXT_SYNC
sposta la posizione dei contenuti multimediali in un frame di sincronizzazione (o chiave) associato con un'origine dati che si trova subito dopo o in un dato momento.SEEK_CLOSEST_SYNC
sposta la posizione dei contenuti multimediali in un frame di sincronizzazione (o tasto) associati a un'origine dati più vicina a o in quel momento specifico.SEEK_CLOSEST
sposta la posizione dell'elemento multimediale in un frame (non necessariamente una sincronizzazione) o il frame chiave) associati a un'origine dati più vicina o in un dato momento.
Quando la ricerca continua, le app dovrebbero usare una qualsiasi delle modalità SEEK_
anziché SEEK_CLOSEST
, che funziona relativamente più lentamente ma può essere più precisa.
MediaRecorder
- MediaRecorder ora supporta il formato MPEG2_TS, utile per
streaming:
Kotlin
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
Java
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
MediaMuxer
ora può gestire un numero qualsiasi di stream audio e video. Non hai più limitazioni a una traccia audio e/o a una traccia video. UsaaddTrack()
per mixare tutte le tracce che vuoi.MediaMuxer
può anche aggiungere una o più tracce di metadati contenenti per frame definito dall'utente informazioni. Il formato dei metadati è definito dalla tua applicazione. La la traccia di metadati è supportata solo per i container MP4.
I metadati possono essere utili per l'elaborazione offline. Ad esempio, gli indicatori del giroscopio il sensore potrebbe essere usato per la stabilizzazione dei video.
Quando aggiungi una traccia di metadati, il formato MIME della traccia deve iniziare con il prefisso
"application/". Scrivere metadati equivale a scrivere dati video/audio, ad eccezione del
che i dati non provengano da un MediaCodec
. L'app trasmette invece
ByteBuffer
con un timestamp associato al valore
Metodo writeSampleData()
.
Il timestamp deve trovarsi nella stessa base temporale delle tracce video e audio.
Il file MP4 generato utilizza il criterio TextMetaDataSampleEntry
definito nella sezione
12.3.3.2 dell'ISOBMFF per segnalare il formato MIME dei metadati. Quando usi MediaExtractor
per estrarre il file con la traccia di metadati, il MIME
dei metadati verrà estratto in MediaFormat
.
Accesso ai file multimediali migliorato
La
Storage Access Framework (SAF) consente alle app di esporre una
DocumentsProvider
, che può fornire accesso ai file
in un'origine dati ad altre app. Infatti, un
il fornitore di documenti può anche fornire accesso ai file
che risiedono nello spazio di archiviazione di rete o che utilizzano un protocollo come
MTP (Media Transfer Protocol).
Tuttavia, l'accesso a file multimediali di grandi dimensioni da un'origine dati remota introduce alcuni sfide:
- I lettori multimediali richiedono l'accesso ricercabile a un file da un fornitore di documenti. Se un file multimediale di grandi dimensioni si trova su un'origine dati remota, il fornitore di documenti deve recuperare tutti i dati in anticipo e creare uno snapshot come descrittore del file. Il media player non può riprodurre il file senza il file descrittore, quindi la riproduzione non può iniziare finché il fornitore dei documenti non termina scaricare il file.
- I gestori delle raccolte multimediali, come le app di foto, devono attraversare una serie di accesso agli URI per raggiungere contenuti multimediali memorizzati su una scheda SD esterna tramite cartelle. Questo modello di accesso rende le operazioni di massa sui contenuti multimediali, come spostare, copiare ed eliminare... è piuttosto lento.
- I gestori della raccolta multimediale non possono determinare la posizione di un documento a causa della sua URI. Di conseguenza, per questi tipi di app è difficile consentire agli utenti di scegliere. dove salvare un file multimediale.
Android 8.0 risolve tutte queste sfide migliorando il livello di accesso allo spazio di archiviazione .
Fornitori di documenti personalizzati
A partire da Android 8.0, Storage Access Framework consente documenti personalizzati provider per creare descrittori di file ricercabili per i file che risiedono in un un'origine dati remota. SAF può aprire un file per ottenere un file nativo ricercabile descrittore. SAF invia quindi richieste di byte discreti ai documenti o il provider di servizi di terze parti. Questa funzionalità consente a un fornitore di documenti di restituire l'intervallo esatto di byte richiesti da un'app di media player invece di memorizzare nella cache l'intera in anticipo.
Per utilizzare questa funzione, devi chiamare il nuovo
StorageManager.openProxyFileDescriptor()
. La
Il metodo openProxyFileDescriptor()
accetta un oggetto ProxyFileDescriptorCallback
come callback. La SAF richiama
il callback ogni volta che un'applicazione client esegue operazioni sui file
descrittore del file restituito dal fornitore dei documenti.
Accesso diretto ai documenti
A partire da Android 8.0 (livello API 26), puoi utilizzare
getDocumentUri()
metodo per
ottieni un URI che fa riferimento allo stesso documento del mediaUri
specificato.
Tuttavia, poiché l'URI restituito è supportato da un
DocumentsProvider
, i gestori della raccolta multimediale possono accedere
direttamente il documento, senza dover attraversare
albero di directory mirate.
Di conseguenza, i gestori dei media possono eseguire operazioni con i file sul documento.
in modo molto più rapido.
Attenzione: il metodo getDocumentUri()
consente di individuare solo i file multimediali. le app non vengono concesse
per accedere a quei file. Per scoprire di più su come ottenere l'accesso
l'autorizzazione per i file multimediali, consulta la documentazione di riferimento.
Percorsi dei documenti
Quando utilizzi Storage Access Framework in Android 8.0 (livello API 26), puoi utilizzare
Metodo findDocumentPath()
, disponibile in entrambi
DocumentsContract
e
DocumentsProvider
, per determinare il percorso dalla radice di un file system data la
ID. Il metodo restituisce questo percorso in un
DocumentsContract.Path
oggetto. Nei casi in cui un file
sistema ha più percorsi definiti per lo stesso documento, il metodo restituisce
percorso utilizzato più spesso per raggiungere il documento con l'ID specificato.
Questa funzionalità è particolarmente utile nei seguenti scenari:
- La tua app utilizza l'opzione "Salva con nome" una finestra di dialogo che mostra la posizione documento specifico.
- La tua app mostra le cartelle in una visualizzazione dei risultati di ricerca e deve caricare il file secondario documenti che si trovano all'interno di una determinata cartella se l'utente seleziona tale .
Nota:se la tua app è autorizzata ad accedere solo ad alcuni documenti
nel percorso, il valore restituito di findDocumentPath()
include solo
le cartelle e i documenti a cui l'app può accedere.
Monitoraggio della riproduzione audio
Il servizio di sistema AudioManager
gestisce un elenco
AudioPlaybackConfiguration
oggetti attivi, ognuno dei quali
contiene informazioni su una determinata sessione di riproduzione audio. La tua app può
recupera l'insieme di configurazioni attualmente attive richiamando
getActivePlaybackConfigurations()
.
A partire da Android 8.0 (livello API 26), puoi registrare un callback per avvisare
la tua app quando uno o più
AudioPlaybackConfiguration
oggetti sono stati modificati. Per farlo,
chiama registerAudioPlaybackCallback()
, passando un'istanza
AudioManager.AudioPlaybackCallback
. La
AudioManager.AudioPlaybackCallback
corso contiene il
Metodo onPlaybackConfigChanged()
, che il sistema chiama quando l'audio
modifiche alla configurazione di riproduzione.
Connettività
Sensibile al Wi-Fi
Android 8.0 (livello API 26) aggiunge il supporto per Wi-Fi Aware, che si basa sul specifica NAN (Awareness Networking). Sui dispositivi con L'hardware, le app e i dispositivi nelle vicinanze che utilizzano Wi-Fi Aware possono rilevare e comunicare tramite Wi-Fi senza un punto di accesso a internet. Stiamo lavorando con il nostro hardware per rendere disponibile la tecnologia Wi-Fi Aware sui dispositivi il prima possibile. Per Per informazioni su come integrare Wi-Fi Aware nella tua app, vedi Wi-Fi Aware.
Bluetooth
Android 8.0 (livello API 26) arricchisce il supporto Bluetooth della piattaforma aggiungendo quanto segue: caratteristiche:
- Supporto per lo standard AVRCP 1.4, che consente la navigazione nelle raccolte di brani.
- Supporto dello standard BLE (Bluetooth Low-Energy) 5.0.
- Integrazione del codec LDAC di Sony nello stack Bluetooth.
Accoppiamento dispositivo associato
Android 8.0 (livello API 26) fornisce API che consentono di personalizzare finestra di dialogo per la richiesta di accoppiamento durante il tentativo di accoppiamento con dispositivi associati tramite Bluetooth, BLE e Wi-Fi. Per ulteriori informazioni, vedi Dispositivo associato Accoppiamento.
Per ulteriori informazioni sull'uso del Bluetooth su Android, vedi Guida al Bluetooth. Per modifiche al Bluetooth specifiche per Android 8.0 (livello API 26), consulta le Bluetooth della Pagina Modifiche del comportamento di Android 8.0.
Condivisione
Condivisione intelligente
Android 8.0 (livello API 26) apprende informazioni sugli utenti condivisione personalizzata preferenze e comprende meglio ogni tipo di contenuto che è app con cui condividere contenuti. Ad esempio, se un utente scatta la foto di uno scontrino, Android 8.0 può suggerire un'app per il monitoraggio delle spese; se l'utente scatta un selfie, un social media un'app può gestire meglio l'immagine. Android 8.0 apprende automaticamente tutte queste in base all'esperienza utente preferenze personalizzate.
La condivisione intelligente funziona per tipi di contenuti diversi da image
, ad esempio
audio
, video
, text
e URL
ecc.
Per attivare la condivisione intelligente, aggiungi un massimo di tre ArrayList
annotazioni di stringa per l'intent che condivide i contenuti. Le annotazioni devono
descrivono i componenti o gli argomenti principali dei contenuti. Il seguente esempio di codice
mostra come aggiungere annotazioni all'intent:
Kotlin
val annotations: ArrayList<String> = arrayListOf( "topic1", "topic2", "topic3" ) intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations )
Java
ArrayList<String> annotations = new ArrayList<>(); annotations.add("topic1"); annotations.add("topic2"); annotations.add("topic3"); intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations );
Per informazioni dettagliate sulle annotazioni di condivisione intelligente, consulta
EXTRA_CONTENT_ANNOTATIONS
.
Classificazione del testo
Sui dispositivi compatibili, le app possono usare un nuovo classificatore di testo per controllare se:
la stringa corrisponde a un tipo di entità classificatore noto e ottiene la selezione suggerita
alternative. Le entità riconosciute dal sistema includono indirizzi, URL,
numeri di telefono e indirizzi email. Per ulteriori informazioni, vedi
TextClassifier
.
Accessibilità
Android 8.0 (livello API 26) supporta diverse nuove funzioni di accessibilità per sviluppatori che creano i propri servizi di accessibilità:
- Una nuova categoria di volume per la regolazione accessibilità volume.
- Impronta gesti come meccanismo di immissione.
- Supporto multilingue sintesi vocale.
- Una piattaforma basata su hardware accessibilità scorciatoia per accedere rapidamente a un servizio di accessibilità preferito.
- Supporto per continua gesti o sequenze di battute programmatiche.
- Un accessibilità pulsante per richiamare una delle numerose funzioni di accessibilità abilitate (disponibile solo sui dispositivi che utilizzano un'area di navigazione sottoposta a rendering software).
- Standardizzati valori di intervallo unilaterali.
- Diverse funzionalità per elaborazione il testo più facilmente, inclusi il testo dei suggerimenti e le posizioni del testo sullo schermo caratteri.
Sicurezza e privacy
Autorizzazioni
Android 8.0 (livello API 26) introduce diverse nuove autorizzazioni relative alla telefonia:
- Lo
L'autorizzazione
ANSWER_PHONE_CALLS
consente alla tua app di rispondere per effettuare chiamate in arrivo in modo programmatico. Per gestire una telefonata in arrivo la tua app, puoi usareacceptRingingCall()
. - Lo
L'autorizzazione
READ_PHONE_NUMBERS
concede alla tua app l'accesso in lettura a i numeri di telefono memorizzati sul dispositivo.
Queste autorizzazioni sono entrambe classificate come
pericoloso
e fanno parte del
PHONE
:
gruppo di autorizzazioni.
Nuove API per il rilevamento e l'accesso agli account
Android 8.0 (livello API 26) introduce diversi miglioramenti alla modalità le app hanno accesso agli account utente. Per gli account che gestisce, gli utenti possono usare i propri criteri per decidere se nascondere gli account, o rivelare gli account a un'app. Il sistema Android monitora le applicazioni che possono per accedere a un determinato account.
Nelle versioni precedenti di Android, le app che volevano monitorare l'elenco di
account utente dovevano ricevere aggiornamenti su tutti gli account, inclusi gli account con
tipi non correlati. Android 8.0 aggiunge
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
che consente alle app di specificare un elenco di tipi di account
per i quali ricevere le modifiche apportate all'account.
Modifiche all'API
AccountManager offre sei nuovi metodi per aiutare gli autenticatori a gestire le diverse le app possono vedere un account:
setAccountVisibility(android.accounts.Account, java.lang.String, int)
: Imposta il livello di visibilità per un account utente e un pacchetto specifici combinazione.-
getAccountVisibility(android.accounts.Account, java.lang.String)
: Consente di acquisire il livello di visibilità per un account utente e un pacchetto specifici combinazione. -
getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String)
: Consente agli autenticatori di ottenere gli account e i livelli di visibilità un dato pacchetto. -
getPackagesAndVisibilityForAccount(android.accounts.Account)
: Consente agli autenticatori di ottenere i valori di visibilità archiviati per un determinato account. -
addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map<java.lang.String, java.lang.Integer>)
: Consente agli autenticatori di inizializzare i valori di visibilità di un account. -
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
: Aggiunge un listenerOnAccountsUpdateListener
allaAccountManager
oggetto. Il sistema chiama questo listener ogni volta che cambia l'elenco di account sul dispositivo.
Android 8.0 (livello API 26) introduce due valori speciali del nome del pacchetto per specificare la visibilità
per applicazioni che non erano state impostate utilizzando
setAccountVisibility(android.accounts.Account, java.lang.String, int)
. La
PACKAGE_NAME_KEY_LEGACY_VISIBLE
il valore di visibilità viene applicato alle app con
GET_ACCOUNTS
e le versioni target
Android precedente ad Android 8.0 o la cui
le firme corrispondono all'autenticatore che ha come target qualsiasi versione di Android.
PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE
fornisce un valore di visibilità predefinito
app che non erano state impostate in precedenza e per cui
PACKAGE_NAME_KEY_LEGACY_VISIBLE
non è
applicabile.
Per ulteriori informazioni sulle nuove API di accesso e rilevamento degli account, consulta
riferimento per
AccountManager
e
OnAccountsUpdateListener
.
Test
Test della strumentazione
Android 8.0 (livello API 26) offre le seguenti opzioni di supporto aggiuntivo per test di strumentazione.
Esegui su processi dell'app non predefiniti
Ora puoi specificare che un determinato test di strumentazione deve essere eseguito una procedura esterna a quella predefinita dell'app. Questa configurazione è utile se la tua app contiene più attività eseguite in processi diversi.
Per definire una strumentazione di processo non predefinita, vai al file manifest
file, quindi al file
<instrumentation>
. Aggiungi il parametro
android:targetProcess
e impostarne il valore su uno tra
le seguenti:
- Il nome di un particolare processo.
- Un elenco di nomi di processi separati da virgole.
- Un carattere jolly (
"*"
), che consente l'esecuzione della strumentazione rispetto a qualsiasi processo avviato che esegue il codice nel pacchetto specificato l'attributoandroid:targetPackage
.
Mentre il test della strumentazione è in esecuzione, puoi controllare quale processo
è in corso il test chiamando getProcessName()
.
Segnala i risultati durante un test
Ora puoi segnalare i risultati mentre il test della strumentazione è in esecuzione,
anziché in seguito, chiamando addResults()
.
Simulazioni di intent per i test
Per semplificare la creazione di test isolati e indipendenti dell'interfaccia utente per
attività, Android 8.0 (livello API 26) introduce la
onStartActivity()
. Esegui l'override di questo metodo in una sottoclasse personalizzata
Instrumentation.ActivityMonitor
corso per gestire una determinata
l'intent chiamato dalla classe di test.
Quando la classe di test richiama l'intent, il metodo restituisce uno stub
Instrumentation.ActivityResult
oggetto anziché l'esecuzione
l'intento stesso. Utilizzando questa logica di intent fittizio nei tuoi test, puoi concentrarti
su come la tua attività si prepara e gestisce l'intenzione che passi a un
a un'attività diversa o a un'app completamente diversa.
Runtime e Strumenti
Ottimizzazioni della piattaforma
Android 8.0 (livello API 26) porta il runtime e altre ottimizzazioni sulla piattaforma che comportano una serie di miglioramenti delle prestazioni. Queste ottimizzazioni includono la garbage collection a compattazione simultanee, un uso più efficiente della memoria e della località del codice.
Queste ottimizzazioni portano a tempi di avvio più rapidi e prestazioni migliori sia nel Sistema operativo e app.
Supporto del linguaggio Java aggiornato
Android 8.0 (livello API 26) aggiunge il supporto per diverse API Java OpenJDK aggiuntive:
java.time
di OpenJDK 8.java.nio.file
ejava.lang.invoke
di OpenJDK 7.
Per saperne di più sui corsi e sui metodi di queste nuove di pacchetti, consulta la documentazione di riferimento dell'API.
Se desideri Utilizzare le funzionalità del linguaggio Java 8 in Android Studio, dovresti scarica l'ultima versione di anteprima.
API ICU4J per Android Framework aggiornate
Android 8.0 (livello API 26) estende la
Framework Android ICU4J
API, un sottoinsieme delle API ICU4J, che gli sviluppatori di app possono
da utilizzare nel pacchetto android.icu
. Queste API utilizzano i dati di localizzazione
presente sul dispositivo, così puoi ridurre l'utilizzo dell'APK non compilando il
Le librerie ICU4J nell'APK.
Tabella 1. Versioni di ICU, CLDR e Unicode utilizzate su Android.
Livello API Android | Versione ICU | Versione CLDR | Versione Unicode |
---|---|---|---|
Android 7.0 (livello API 24), Android 7.1 (livello API 25) | 56 | 28 | 8.0 |
Android 8.0 (livello API 26) | 58,2 | 30.0.3 | 9.0 |
Per ulteriori informazioni sull'internazionalizzazione su Android, tra cui: Per assistenza di ICU4J, vedi Internazionalizzazione su Android.
Android Enterprise
Sono state introdotte nuove funzionalità e API aziendali per i dispositivi in esecuzione Android 8.0 (livello API 26). I punti salienti includono:
- I profili di lavoro su dispositivi completamente gestiti consentono alle aziende di separare il lavoro dal i dati personali e al contempo gestire entrambi.
- La delega API consente ai proprietari di dispositivi e profili di assegnare l'app e la gestione dei container ad altre applicazioni.
- Miglioramenti dell'esperienza utente nel flusso di provisioning (inclusi i nuovi opzioni di personalizzazione) diminuiscono i tempi di configurazione.
- Nuovi controlli per Bluetooth, Wi-Fi, backup e sicurezza consentono alle aziende per gestire più elementi del dispositivo. Il logging delle attività di rete aiuta le aziende a monitorare problemi di sicurezza.
Per scoprire di più su queste e altre nuove API e funzionalità di Android Enterprise, vedi Android in azienda.