Livello API: 21
Android 5.0 (LOLLIPOP) offre nuove funzionalità a utenti e sviluppatori di app. Questo documento fornisce un'introduzione alle nuove API più importanti.
Se hai pubblicato un'app, assicurati di controllare le modifiche al comportamento di Android 5.0 da tenere presenti nell'app. Queste modifiche del comportamento potrebbero influire sulla tua app sui dispositivi Android 5.0, anche se non utilizzi nuove API o non scegli come target nuove funzionalità.
Per una panoramica generale delle nuove funzionalità della piattaforma, consulta le caratteristiche principali di Android Lollipop.
Inizia a sviluppare
Per iniziare a creare app per Android 5.0, devi prima scaricare l'SDK Android. Utilizza quindi SDK Manager per scaricare l'SDK Platform e le immagini di sistema dell'SDK per Android 5.0.
Aggiorna il livello API target
Per ottimizzare meglio la tua app per i dispositivi con Android 5.0, imposta il tuo targetSdkVersion
su "21"
, installa la tua app su un'immagine di sistema Android 5.0, testala, quindi pubblica l'app aggiornata con questa modifica.
Puoi utilizzare le API Android 5.0 e supportare anche le versioni precedenti aggiungendo al codice condizioni che controllano il livello API di sistema prima di eseguire le API non supportate da minSdkVersion
.
Per scoprire di più su come mantenere la compatibilità con le versioni precedenti, consulta Supporto di diverse versioni della piattaforma.
Per ulteriori informazioni su come funzionano i livelli API, consulta Che cos'è il livello API?
Modifiche importanti del comportamento
Se hai già pubblicato un'app per Android, tieni presente che la tua app potrebbe essere interessata dalle modifiche in Android 5.0.
Per informazioni complete, leggi la sezione Modifiche Android 5.0.
Interfaccia utente
Assistenza per Material Design
Android 5.0 supporta il nuovo stile di material design di Android. Puoi creare app con material design visivamente dinamiche e con transizioni di elementi UI naturali agli utenti. Questo tipo di assistenza include:
- Il tema Material
- Visualizza ombre
- Il widget
RecyclerView
- Animazione disegnabile ed effetti di stile
- Animazione di Material Design ed effetti di transizione delle attività
- Animatori per le proprietà delle viste in base allo stato della vista
- Widget e barre delle app personalizzabili nell'interfaccia utente con tavolozze dei colori controllate da te
- Disegni animati e non animati basati su grafica vettoriale XML
Per scoprire di più su come aggiungere la funzionalità di Material Design alla tua app, consulta Material Design.
Attività e documenti simultanei nella schermata Recenti
Nelle release precedenti, la schermata recenti poteva mostrare una sola attività per ogni app con cui l'utente interagiva più di recente. Ora l'app può aprire altre attività in base alle esigenze per
altre attività simultanee per i documenti. Questa funzionalità facilita il multitasking consentendo agli utenti di passare rapidamente tra le singole attività e i singoli documenti dalla schermata dei recenti, con un'esperienza di passaggio coerente in tutte le app.
Alcuni esempi di attività simultanee di questo tipo possono essere schede aperte in un'app del browser web, documenti in un'app di produttività, corrispondenze simultanee in
un gioco o chat in un'app di messaggistica. L'app può gestire le proprie attività
tramite il corso ActivityManager.AppTask
.
Per inserire un'interruzione logica in modo che il sistema tratti la tua attività come una nuova attività, usa FLAG_ACTIVITY_NEW_DOCUMENT
quando avvii l'attività con startActivity()
. Puoi ottenere questo comportamento anche impostando l'attributo documentLaunchMode
dell'elemento <activity> su "intoExisting"
o "always"
nel tuo manifest.
Per evitare di riempire la schermata recente, puoi impostare il numero massimo di attività dell'app che possono essere visualizzate nella schermata. A questo scopo, imposta l'attributo <application> android:maxRecents
. Al momento è possibile specificare un massimo di 50 attività per utente (25 per i dispositivi con RAM insufficiente).
Le attività nella schermata Recenti possono essere impostate in modo che rimangano persistenti dopo i riavvii. Per controllare il comportamento della persistenza, utilizza l'attributo android:persistableMode. Puoi anche modificare le proprietà visive di un'attività nella schermata Recenti, ad esempio il colore, l'etichetta e l'icona dell'attività, richiamando il metodo setTaskDescription()
.
Aggiornamenti di WebView
Android 5.0 aggiorna l'implementazione WebView
in Chromium M37, offrendo miglioramenti della sicurezza e della stabilità, nonché correzioni di bug. La stringa dello user agent predefinita per un elemento WebView
in esecuzione su Android 5.0 è stata aggiornata in modo da incorporare 37.0.0.0 come numero di versione.
Questa release introduce la classe PermissionRequest
, che consente all'app di concedere l'autorizzazione WebView
per accedere a risorse protette come fotocamera e microfono tramite API web come getUserMedia(). La tua app deve avere le autorizzazioni Android appropriate per queste risorse al fine di concedere le autorizzazioni a WebView
.
Con il nuovo metodo onShowFileChooser()
,
ora puoi utilizzare un campo di inserimento del modulo in WebView
e avviare un selettore file per selezionare immagini e file dal dispositivo Android.
Inoltre, questa release supporta gli standard aperti WebAudio, WebGL e WebRTC. Per ulteriori informazioni sulle nuove funzionalità incluse in questa release, consulta WebView per Android.
Acquisizione e condivisione dello schermo
Android 5.0 ti consente di aggiungere funzionalità di acquisizione e condivisione dello schermo alla tua app con le nuove API android.media.projection
. Questa funzionalità è utile, ad esempio, se vuoi attivare la condivisione dello schermo in un'app per videoconferenze.
Il nuovo metodo createVirtualDisplay()
consente all'app di acquisire i contenuti della schermata principale (il display predefinito) in un oggetto Surface
, che l'app potrà poi inviare attraverso la rete. L'API consente di acquisire solo contenuti dello schermo
non protetti e non l'audio di sistema. Per iniziare l'acquisizione di schermate, l'app deve prima richiedere l'autorizzazione dell'utente avviando una finestra di dialogo di acquisizione schermo utilizzando un metodo Intent
ottenuto con il metodo createScreenCaptureIntent()
.
Per un esempio di come utilizzare le nuove API, consulta la classe MediaProjectionDemo
nel progetto di esempio.
Notifiche
Notifiche schermata di blocco
Le schermate di blocco in Android 5.0 possono presentare notifiche. Gli utenti possono scegliere tramite le Impostazioni se consentire la visualizzazione di contenuti sensibili delle notifiche in una schermata di blocco sicura.
L'app può controllare il livello di dettaglio visibile quando le relative notifiche vengono visualizzate nella schermata di blocco sicura. Per controllare il livello di visibilità, chiama setVisibility()
e specifica uno di questi valori:
VISIBILITY_PRIVATE
: vengono mostrate le informazioni di base, ad esempio l'icona della notifica, ma vengono nascosti tutti i contenuti della notifica.VISIBILITY_PUBLIC
: vengono mostrati tutti i contenuti della notifica.VISIBILITY_SECRET
: Non mostra nulla, escludendo anche l'icona della notifica.
Quando il livello di visibilità è VISIBILITY_PRIVATE
, puoi anche fornire una versione oscurata dei contenuti delle notifiche che nascondono i dettagli personali. Ad esempio, un'app per SMS potrebbe mostrare una notifica che mostra "Hai 3 nuovi messaggi", ma nasconde i contenuti e i mittenti dei messaggi. Per fornire questa notifica alternativa, crea prima la notifica di sostituzione utilizzando Notification.Builder
. Quando crei l'oggetto di notifica privato, allega la notifica di sostituzione tramite il metodo setPublicVersion()
.
Metadati delle notifiche
Android 5.0 utilizza i metadati associati alle notifiche delle app
per ordinarle in modo più intelligente. Per impostare i metadati, chiama i seguenti metodi in Notification.Builder
quando crei la notifica:
setCategory()
: indica al sistema come gestire le notifiche delle app quando il dispositivo è in modalità priorità (ad esempio, se una notifica rappresenta una chiamata in arrivo, un messaggio immediato o una sveglia).setPriority()
: contrassegna la notifica come più o meno importante delle normali notifiche. Le notifiche con il campo della priorità impostato suPRIORITY_MAX
oPRIORITY_HIGH
vengono visualizzate in una piccola finestra mobile se sono presenti anche suoni o vibrazioni.addPerson()
: consente di aggiungere una o più persone pertinenti a una notifica. L'app può utilizzarlo per segnalare al sistema che deve raggruppare le notifiche delle persone specificate o per classificare le notifiche di questi utenti come più importanti.
Grafica
Supporto per OpenGL ES 3.1
Android 5.0 aggiunge interfacce Java e supporto nativo per OpenGL ES 3.1. Le nuove principali funzionalità offerte in OpenGL ES 3.1 includono:
- Shaker di calcolo
- Separa gli oggetti dello ombreggiatore
- Comandi di disegno indiretto
- Trame multicampionamento e stencil
- Miglioramenti del linguaggio di ombreggiamento
- Estensioni per modalità di fusione avanzate e debug
- Compatibilità con le versioni precedenti di OpenGL ES 2.0 e 3.0
L'interfaccia Java per OpenGL ES 3.1 su Android viene fornita con GLES31
. Quando utilizzi OpenGL ES 3.1, assicurati di dichiararlo nel file manifest con il tag <uses-feature>
e l'attributo android:glEsVersion
. Ecco alcuni esempi:
<manifest> <uses-feature android:glEsVersion="0x00030001" /> ... </manifest>
Per ulteriori informazioni sull'utilizzo di OpenGL ES, incluso come verificare la versione OpenGL ES supportata del dispositivo in fase di runtime, consulta la guida all'API OpenID ES.
Pacchetto di estensioni Android
Oltre a OpenGL ES 3.1, questa release fornisce un pacchetto di estensioni con interfacce Java e supporto nativo per funzionalità grafiche avanzate. Queste estensioni vengono trattate come un singolo pacchetto da Android. Se è presente l'estensione ANDROID_extension_pack_es31a
, l'app può presumere che siano presenti tutte le estensioni nel pacchetto e attivare le funzionalità del linguaggio di ombreggiatura con una singola istruzione #extension
.
Il pacchetto di estensioni supporta:
- Supporto garantito per lo Shader dei frammenti per buffer di archiviazione, immagini e componenti atomici dello ShaD (il supporto dello Shadr dei frammenti è facoltativo in OpenGL ES 3.1).
- Tessellation e Shaker per la geometria
- Formato di compressione delle texture ASTC (LDR)
- Interpolazione e ombreggiatura per campione
- Diverse modalità di fusione per ogni allegato colore in un buffer frame
L'interfaccia Java per il pacchetto di estensioni viene fornita con GLES31Ext
. Nel file manifest dell'app puoi dichiarare che l'app deve essere installata solo sui dispositivi che supportano il pacchetto di estensioni.
Ecco alcuni esempi:
<manifest> <uses-feature android:name=“android.hardware.opengles.aep” android:required="true" /> ... </manifest>
Contenuti multimediali
API Camera per funzionalità avanzate della fotocamera
Android 5.0 introduce la nuova API android.hardware.camera2 per facilitare l'acquisizione di foto a grana fine e l'elaborazione delle immagini. Ora puoi
accedere in modo programmatico ai dispositivi delle videocamere disponibili nel sistema con
getCameraIdList()
e connetterti a un dispositivo specifico con
openCamera()
.
Per iniziare ad acquisire le immagini, crea un CameraCaptureSession
e specifica gli oggetti Surface
per inviare le immagini acquisite.
Il CameraCaptureSession
può essere configurato per acquisire singoli scatti o più immagini in una serie di foto a raffica.
Per ricevere una notifica quando vengono acquisite nuove immagini, implementa il listener CameraCaptureSession.CaptureCallback
e impostalo nella richiesta di acquisizione. Ora, quando il sistema completa la richiesta di acquisizione delle immagini, l'ascoltatore CameraCaptureSession.CaptureCallback
riceve una chiamata a onCaptureCompleted()
, in cui vengono forniti i metadati di acquisizione delle immagini in un CaptureResult
.
La classe CameraCharacteristics
consente alla tua app
di rilevare quali funzionalità della fotocamera sono disponibili su un dispositivo. La proprietà INFO_SUPPORTED_HARDWARE_LEVEL
dell'oggetto rappresenta il livello di funzionalità della fotocamera.
- Tutti i dispositivi supportano almeno il livello hardware
INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
, che ha funzionalità quasi equivalenti a quelle dell'APICamera
deprecata. - I dispositivi che supportano il livello hardware
INFO_SUPPORTED_HARDWARE_LEVEL_FULL
sono in grado di controllare manualmente l'acquisizione e la post-elaborazione, nonché di acquisire immagini ad alta risoluzione e con frequenze fotogrammi elevate.
Per scoprire come utilizzare l'API Fotocamera aggiornata, consulta gli esempi di implementazione di Camera2Basic
e Camera2Video
in questa release.
Riproduzione audio
Questa release include le seguenti modifiche a
AudioTrack
:
- Ora la tua app può fornire dati audio in formato a virgola mobile (
ENCODING_PCM_FLOAT
). Ciò consente un intervallo dinamico più elevato, una precisione più coerente e un margine di sicurezza maggiore. L'aritmetica con virgola mobile è particolarmente utile per i calcoli intermedi. Gli endpoint di riproduzione utilizzano il formato numero intero per i dati audio e con una profondità in bit inferiore. In Android 5.0, parti della pipeline interna non sono ancora in virgola mobile. - Ora la tua app può fornire dati audio come
ByteBuffer
, nello stesso formato fornito daMediaCodec
. - L'opzione
WRITE_NON_BLOCKING
può semplificare il buffering e il multithreading per alcune app.
Controllo per la riproduzione di contenuti multimediali
Utilizza le nuove API per le notifiche e i contenuti multimediali per assicurarti che l'interfaccia utente di sistema sia a conoscenza della riproduzione dei contenuti multimediali e possa estrarre e mostrare le copertine degli album.
Ora è più facile controllare la riproduzione dei contenuti multimediali in un'interfaccia utente e in un servizio con le nuove classi
MediaSession
e
MediaController
.
La nuova classe MediaSession
sostituisce
la classe RemoteControlClient
deprecata e fornisce un
singolo insieme di metodi di callback per la gestione dei controlli di trasporto e dei pulsanti multimediali.
Se la tua app fornisce la riproduzione di contenuti multimediali e viene eseguita sulla piattaforma Android
TV o
Wear, utilizza la
classe MediaSession
per gestire i controlli di trasporto
utilizzando gli stessi metodi di callback.
Ora puoi creare la tua app controller multimediale con la nuova classe MediaController
. Questa classe fornisce
un modo sicuro per i thread per monitorare e controllare la riproduzione di contenuti multimediali dal processo di interfaccia utente della tua app.
Quando crei un controller, specifica un oggetto MediaSession.Token
in modo che l'app possa interagire con il controller MediaSession
specificato.
Con i metodi MediaController.TransportControls
,
puoi inviare comandi come play()
,
stop()
,
skipToNext()
e setRating()
per controllare la riproduzione di contenuti multimediali in quella sessione. Con il controller, puoi anche
registrare un oggetto MediaController.Callback
per
ascoltare i metadati e le modifiche di stato nella sessione.
Inoltre, con la nuova classe Notification.MediaStyle
, puoi creare notifiche avanzate che consentono il controllo di riproduzione associato a una sessione multimediale.
Navigazione di contenuti multimediali
Android 5.0 introduce la possibilità per le app di sfogliare la raccolta di contenuti multimediali di un'altra app tramite la nuova API android.media.browse. Per esporre i contenuti multimediali nella tua app, estendi la classe MediaBrowserService
. L'implementazione di MediaBrowserService
deve fornire l'accesso a un MediaSession.Token
in modo che le app possano riprodurre i contenuti multimediali forniti tramite il tuo servizio.
Per interagire con un servizio di browser multimediale, utilizza la
classe MediaBrowser
. Specifica il nome del componente per un MediaSession
quando crei un'istanza MediaBrowser
. Utilizzando l'istanza del browser, l'app può quindi connettersi al servizio associato e ottenere un oggetto MediaSession.Token
per riprodurre i contenuti esposti tramite il servizio.
Spazio di archiviazione
Selezione directory
Android 5.0 estende il Storage Access Framework per consentire agli utenti di selezionare un'intera sottostruttura della directory, concedendo alle app l'accesso in lettura/scrittura a tutti i documenti contenuti senza richiedere la conferma dell'utente per ogni elemento.
Per selezionare un sottoalbero della directory, crea e invia un intent OPEN_DOCUMENT_TREE
. Il sistema visualizza tutte le istanze DocumentsProvider
che supportano la selezione di sottoalbero, consentendo all'utente di sfogliare e selezionare una directory. L'URI restituito rappresenta l'accesso al sottoalbero selezionato. Puoi quindi utilizzare buildChildDocumentsUriUsingTree()
e buildDocumentUriUsingTree()
insieme a
query()
per esplorare il sottoalbero.
Il nuovo metodo createDocument()
consente di creare nuovi documenti o directory in qualsiasi punto
all'interno del sottoalbero. Per gestire i documenti esistenti, usa
renameDocument()
e
deleteDocument()
.
Controlla COLUMN_FLAGS
per verificare l'assistenza del fornitore per queste chiamate prima di effettuarle.
Se stai implementando DocumentsProvider
e vuoi supportare la selezione di un sottoalbero, implementa isChildDocument()
e includi FLAG_SUPPORTS_IS_CHILD
in COLUMN_FLAGS
.
Android 5.0 introduce anche nuove directory specifiche dei pacchetti sullo spazio di archiviazione condiviso in cui la tua app può inserire i file multimediali da includere in MediaStore
. Il nuovo getExternalMediaDirs()
restituisce i percorsi a queste directory su tutti i dispositivi di archiviazione condivisi. Analogamente a
getExternalFilesDir()
,
la tua app non richiede autorizzazioni aggiuntive per accedere ai percorsi restituiti. La piattaforma analizza periodicamente i nuovi contenuti multimediali in queste directory, ma puoi anche utilizzare MediaScannerConnection
per cercare esplicitamente i nuovi contenuti.
Wireless e connettività
Più connessioni di rete
Android 5.0 fornisce nuove API di networking multiplo che consentono alla tua app di analizzare dinamicamente le reti disponibili con funzionalità specifiche e di stabilire una connessione alle reti. Questa funzionalità è utile quando la tua app richiede una rete specializzata, ad esempio una rete SUPL, MMS o di fatturazione con l'operatore, oppure se vuoi inviare dati utilizzando un determinato tipo di protocollo di trasporto.
Per selezionare e connetterti a una rete in modo dinamico dalla tua app, procedi nel seguente modo:
- Crea un
ConnectivityManager
. - Utilizza la classe
NetworkRequest.Builder
per creare un oggettoNetworkRequest
e specificare le funzionalità di rete e il tipo di trasporto a cui la tua app è interessata. - Per cercare le reti adatte, chiama
requestNetwork()
oregisterNetworkCallback()
e trasmetti l'oggettoNetworkRequest
e un'implementazione diConnectivityManager.NetworkCallback
. Utilizza il metodorequestNetwork()
se, dopo il rilevamento, vuoi passare attivamente a una rete adatta; per ricevere solo notifiche per le reti analizzate senza effettuare il passaggio attivo, utilizza il metodoregisterNetworkCallback()
.
Quando il sistema rileva una rete adatta, si connette alla rete e richiama il callback onAvailable()
. Puoi utilizzare l'oggetto Network
del callback per ricevere ulteriori informazioni sulla rete o per indirizzare il traffico in modo che utilizzi la rete selezionata.
Bluetooth Low Energy
Android 4.3 ha introdotto il supporto della piattaforma per Bluetooth Low Energy (Bluetooth LE) nel ruolo centrale. In Android 5.0, un dispositivo Android ora può fungere da dispositivo periferico Bluetooth LE. Le app possono usare questa funzionalità per comunicare la loro presenza ai dispositivi nelle vicinanze. Ad esempio, puoi creare app che consentono a un dispositivo di funzionare come contapassi o di monitoraggio dello stato di salute e di comunicare i suoi dati con un altro dispositivo Bluetooth LE.
Le nuove API android.bluetooth.le
consentono alle tue app di trasmettere
annunci, cercare risposte e stabilire connessioni con i dispositivi Bluetooth
LE nelle vicinanze. Per utilizzare le nuove funzionalità pubblicitarie e di analisi, aggiungi l'autorizzazione BLUETOOTH_ADMIN
nel file manifest. Quando gli utenti aggiornano o scaricano la tua app dal Play Store,
viene chiesto loro di concedere la seguente autorizzazione all'app:
"Informazioni sulla connessione Bluetooth: consente all'app di controllare il Bluetooth,
tra cui la trasmissione o il recupero di informazioni sui dispositivi Bluetooth nelle vicinanze."
Per iniziare a fare pubblicità Bluetooth LE in modo che altri dispositivi possano rilevare la tua app, chiama startAdvertising()
e partecipa a un'implementazione della classe AdvertiseCallback
. L'oggetto callback riceve un report relativo all'esito positivo o negativo dell'operazione pubblicitaria.
Android 5.0 introduce la classe ScanFilter
in modo che la tua app possa cercare solo i tipi specifici di dispositivi a cui è interessata. Per iniziare la ricerca di dispositivi Bluetooth LE, chiama startScan()
e inserisci un elenco di filtri. Nella chiamata al metodo, devi anche fornire un'implementazione di ScanCallback
per segnalare quando viene trovato un annuncio Bluetooth LE.
Miglioramenti NFC
Android 5.0 aggiunge i seguenti miglioramenti per consentire un utilizzo più ampio e flessibile della tecnologia NFC:
- Android Beam è ora disponibile nel menu Condividi.
- La tua app può richiamare Android Beam sul dispositivo dell'utente per condividere dati
chiamando
invokeBeam()
. In questo modo, l'utente evita la necessità di mettere manualmente a contatto il dispositivo con un altro dispositivo che supporta NFC per completare il trasferimento di dati. - Puoi utilizzare il nuovo metodo
createTextRecord()
per creare un record NDEF contenente dati di testo UTF-8. - Se stai sviluppando un'app di pagamento, ora hai la possibilità di registrare dinamicamente un ID applicazione NFC (AID) chiamando il numero
registerAidsForService()
. Puoi anche usaresetPreferredService()
per impostare il servizio di emulazione della carta preferito da utilizzare quando un'attività specifica è in primo piano.
Progetto Volta
Oltre alle nuove funzionalità, Android 5.0 mette in risalto i miglioramenti della durata della batteria. Usa le nuove API e i nuovi strumenti per comprendere e ottimizzare il consumo di energia della tua app.
Pianificazione dei job
Android 5.0 fornisce una nuova API JobScheduler
che ti consente di ottimizzare la durata della batteria definendo job per l'esecuzione asincrona del sistema in un secondo momento o in condizioni specifiche, ad esempio quando il dispositivo è in carica. La pianificazione del lavoro è utile in situazioni quali:
- L'app ha un lavoro non rivolto agli utenti che puoi posticipare.
- L'app ha il lavoro che preferisci svolgere quando è collegata alla corrente.
- L'app ha un'attività che richiede l'accesso alla rete o una connessione Wi-Fi.
- L'app ha una serie di attività da eseguire in batch in base a una pianificazione regolare.
Un'unità di lavoro viene incapsulata da un oggetto JobInfo
.
Questo oggetto specifica i criteri di pianificazione.
Utilizza la classe JobInfo.Builder
per configurare la modalità di esecuzione
dell'attività pianificata. Puoi pianificare l'esecuzione dell'attività
in condizioni specifiche, ad esempio
- Avvia quando il dispositivo è in carica
- Avvia quando il dispositivo è connesso a una rete unmetered
- Avvia quando il dispositivo è inattivo
- Completa prima di una determinata scadenza o con un ritardo minimo
Ad esempio, puoi aggiungere codice come questo per eseguire l'attività su una rete senza limiti:
Kotlin
val uploadTask: JobInfo = JobInfo.Builder( jobId, serviceComponent /* JobService component */ ).run { setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) build() } val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler jobScheduler.schedule(uploadTask)
Java
JobInfo uploadTask = new JobInfo.Builder(jobId, serviceComponent /* JobService component */) .setRequiredNetworkCapabilities(JobInfo.NETWORK_TYPE_UNMETERED) .build(); JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(uploadTask);
Se l'alimentazione del dispositivo è stabile, ossia è collegato all'alimentazione da più di 2 minuti e la batteria è a livello di integrità, il sistema eseguirà qualsiasi job programmato pronto per l'esecuzione, anche se la scadenza del job non è scaduta.
Per un esempio di come utilizzare l'API JobScheduler
, consulta gli esempi di implementazione di JobSchedulerSample
in questa release.
Strumenti per sviluppatori per l'utilizzo della batteria
Il nuovo comando dumpsys batterystats
genera dati statistici interessanti sull'utilizzo della batteria su un dispositivo, organizzati per ID utente unico (UID). Le statistiche includono:
- Cronologia degli eventi relativi alla batteria
- Statistiche globali per il dispositivo
- Consumo energetico approssimativo per UID e componente di sistema
- ms mobile per app per pacchetto
- Statistiche aggregate UID di sistema
- Statistiche aggregate UID app
Utilizza l'opzione --help
per scoprire le varie opzioni per personalizzare l'output. Ad esempio, per stampare le statistiche sull'utilizzo della batteria per un determinato pacchetto di app dall'ultima ricarica del dispositivo, esegui questo comando:
$ adb shell dumpsys batterystats --charged <package-name>
Puoi utilizzare lo strumento Battery History nell'output del comando dumpsys
per generare una visualizzazione HTML degli eventi relativi all'alimentazione dai log. Queste informazioni ti consentono di comprendere e diagnosticare più facilmente eventuali problemi relativi alla batteria.
Android sul luogo di lavoro e nel settore dell'istruzione
Provisioning gestito
Android 5.0 offre nuove funzionalità per l'esecuzione di app in un ambiente aziendale. Un amministratore del dispositivo può avviare un processo di provisioning gestito per aggiungere a un dispositivo un profilo gestito co-presente ma separato, se l'utente ha già un account personale. Le app associate ai profili gestiti vengono visualizzate insieme alle app non gestite in Avvio app, nella schermata Recenti e nelle notifiche dell'utente.
Per avviare il processo di provisioning gestito, invia ACTION_PROVISION_MANAGED_PROFILE
in un Intent
. Se la chiamata ha esito positivo, il sistema attiva il callback onProfileProvisioningComplete()
.
Puoi quindi chiamare setProfileEnabled()
per attivare questo profilo gestito.
Per impostazione predefinita, solo un piccolo sottoinsieme di app è abilitato nel profilo gestito.
Puoi installare altre app nel profilo gestito chiamando il numero
enableSystemApp()
.
Se stai sviluppando un'app Avvio app, puoi utilizzare la nuova classe LauncherApps
per ottenere un elenco delle attività avviabili
per l'utente corrente ed eventuali profili gestiti associati. Avvio app può mettere in evidenza le app gestite aggiungendo un badge di lavoro all'icona disegnabile. Per recuperare l'icona con badge, chiama
getUserBadgedIcon()
.
Per informazioni su come utilizzare la nuova funzionalità, consulta l'esempio di implementazione di BasicManagedProfile
in questa release.
Proprietario del dispositivo
Android 5.0 introduce la possibilità di eseguire il deployment di un'app del proprietario del dispositivo. Il proprietario del dispositivo è un tipo specializzato di amministratore del dispositivo che ha la possibilità aggiuntiva di creare e rimuovere utenti secondari e di configurare le impostazioni globali sul dispositivo. L'app del proprietario del dispositivo può utilizzare i
metodi della classe DevicePolicyManager
per assumere
un controllo granulare della configurazione, della sicurezza e delle app sui dispositivi gestiti.
Un dispositivo può avere un solo proprietario attivo alla volta.
Per implementare e attivare il proprietario di un dispositivo, devi eseguire un trasferimento di dati NFC da un'app di programmazione al dispositivo mentre quest'ultimo è nello stato di provisioning non eseguito. Questo trasferimento di dati invia le stesse informazioni dell'intent di provisioning descritto in Provisioning gestito.
Blocco su schermo
Android 5.0 introduce una nuova API di blocco su schermo che consente di impedire temporaneamente agli utenti di abbandonare l'attività o di essere interrotti dalle notifiche. Potrebbe essere utile, ad esempio, se stai sviluppando un'app per l'istruzione per supportare requisiti di valutazione elevati su Android o un'applicazione kiosk o monouso. Una volta che l'app attiva il blocco su schermo, gli utenti non possono visualizzare notifiche, accedere ad altre app o tornare alla schermata Home finché l'app non esce dalla modalità.
Esistono due modi per attivare il blocco su schermo:
- Manualmente: gli utenti possono attivare il blocco su schermo in Impostazioni > Sicurezza > Blocco su schermo e selezionare le attività da bloccare toccando l'icona a forma di puntina verde nella schermata Recenti.
- In modo programmatico: per attivare il blocco su schermo
a livello di programmazione, chiama il numero
startLockTask()
dall'app. Se l'app richiedente non è il proprietario del dispositivo, all'utente viene chiesto di confermare. L'app del proprietario di un dispositivo può chiamare ilsetLockTaskPackages()
metodo per consentire il blocco delle app senza il passaggio di conferma dell'utente.
Quando il blocco delle attività è attivo, si verifica il seguente comportamento:
- La barra di stato è vuota e le notifiche dell'utente e le informazioni sullo stato sono nascoste.
- I pulsanti Home e App recenti sono nascosti.
- Le altre app non possono avviare nuove attività.
- L'app corrente può avviare nuove attività, a condizione che non vengano create nuove attività.
- Quando il proprietario del dispositivo richiama il blocco su schermo, l'utente rimane bloccato
sull'app finché l'app non chiama
stopLockTask()
. - Se il blocco su schermo viene attivato da un'altra app che non è proprietaria del dispositivo o direttamente dall'utente, l'utente può uscire tenendo premuti entrambi i pulsanti Indietro e Recenti.
Framework per la stampa
Visualizza PDF come bitmap
Ora puoi visualizzare le pagine dei documenti PDF in immagini bitmap da stampare utilizzando la nuova classe PdfRenderer
. Devi specificare un elemento ParcelFileDescriptor
su cui è possibile cercare (ovvero i contenuti a cui è possibile accedere in modo casuale) su cui il sistema scrive il contenuto stampabile.
La tua app può ottenere una pagina per il rendering con
openPage()
, quindi chiamare
render()
per trasformare il PdfRenderer.Page
aperto in una bitmap. Puoi anche impostare parametri aggiuntivi se vuoi convertire solo una parte del documento in un'immagine bitmap (ad esempio, per implementare il rendering a riquadri per aumentare lo zoom sul documento).
Per un esempio di come utilizzare le nuove API, consulta l'esempio PdfRendererBasic
.
Sistema
Statistiche sull'utilizzo di app
Ora puoi accedere alla cronologia di utilizzo delle app su un dispositivo Android con la
nuova API android.app.usage
. Questa API fornisce informazioni più dettagliate sull'utilizzo rispetto al metodo getRecentTasks()
deprecato.
Per utilizzare questa API, devi prima dichiarare l'autorizzazione "android.permission.PACKAGE_USAGE_STATS"
nel tuo manifest.
L'utente deve inoltre abilitare l'accesso per questa app tramite Impostazioni > Sicurezza > App
con accesso ai dati di utilizzo.
Il sistema raccoglie i dati sull'utilizzo in base alle singole app, aggregando i dati in intervalli giornalieri, settimanali, mensili e annuali. La durata massima di conservazione di questi dati da parte del sistema è la seguente:
- Dati giornalieri: 7 giorni
- Dati settimanali: 4 settimane
- Dati mensili: 6 mesi
- Dati annuali: 2 anni
Per ogni app, il sistema registra i seguenti dati:
- L'ultima volta che l'app è stata utilizzata.
- Il periodo di tempo totale in cui l'app è stata in primo piano per l'intervallo di tempo in questione (per giorno, settimana, mese o anno)
- Timestamp dell'acquisizione del momento in cui un componente (identificato da un pacchetto e dal nome dell'attività) è passato in primo piano o sullo sfondo durante un giorno
- Timestamp dell'acquisizione del momento in cui la configurazione di un dispositivo è cambiata (ad esempio quando l'orientamento del dispositivo è cambiato a causa della rotazione)
Test e accessibilità
Test e miglioramenti dell'accessibilità
Android 5.0 offre il seguente supporto per il test e l'accessibilità:
- I nuovi metodi
getWindowAnimationFrameStats()
egetWindowContentFrameStats()
acquisiscono le statistiche relative al frame per i contenuti e le animazioni delle finestre. Questi metodi consentono di scrivere test di strumentazione per valutare se un'app esegue il rendering dei frame a una frequenza di aggiornamento sufficiente per offrire un'esperienza utente fluida. - Il nuovo metodo
executeShellCommand()
ti consente di eseguire i comandi della shell dal test della strumentazione. L'esecuzione del comando è simile all'esecuzione diadb shell
da un host collegato al dispositivo, permettendoti di utilizzare strumenti basati su shell comedumpsys
,am
,content
epm
. - I servizi di accessibilità e gli strumenti di test che utilizzano le API di accessibilità (come
UiAutomator
) ora possono recuperare informazioni dettagliate sulle proprietà delle finestre sullo schermo con cui gli utenti vedenti possono interagire. Per recuperare un elenco diAccessibilityWindowInfo
oggetti, chiama il nuovo metodogetWindows()
. - La nuova classe
AccessibilityNodeInfo.AccessibilityAction
consente di definire azioni standard o personalizzate da eseguire suAccessibilityNodeInfo
. La nuova classeAccessibilityNodeInfo.AccessibilityAction
sostituisce le API correlate alle azioni precedentemente disponibili inAccessibilityNodeInfo
. - Android 5.0 offre un controllo più granulare sulla sintesi vocale nella
tua app. La nuova classe
Voice
consente all'app di utilizzare profili vocali associati a impostazioni internazionali specifiche, valutazione di qualità e latenza e parametri specifici del motore di sintesi vocale.
IME
Passaggio più semplice da una lingua di inserimento all'altra
A partire da Android 5.0, gli utenti possono passare più facilmente da un editor del metodo di input (IME) supportato dalla piattaforma. L'esecuzione dell'azione di passaggio designata (di solito toccando l'icona a forma di globo sulla tastiera software) consente di scorrere tutti questi IME. Questa modifica del comportamento viene implementata dal metodo shouldOfferSwitchingToNextInputMethod()
.
Inoltre, il framework ora verifica se il successivo IME include un meccanismo di cambio (e, quindi, se questo IME supporta il passaggio all'IME in seguito). Un IME con meccanismo di commutazione non passa a un IME senza. Questo cambiamento di comportamento viene implementato dal metodo switchToNextInputMethod()
.
Per un esempio di come utilizzare le API per il cambio IME aggiornate, consulta l'esempio di implementazione della tastiera software aggiornato in questa release. Per scoprire di più su come implementare il passaggio da un IME all'altro, consulta Creazione di un metodo di immissione.
Dichiarazioni manifest
Funzionalità richieste dichiarabili
I seguenti valori sono ora supportati nell'elemento <uses-feature>
, quindi puoi assicurarti che la tua app sia installata solo su dispositivi che forniscono le funzionalità necessarie all'app.
FEATURE_AUDIO_OUTPUT
FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING
FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR
FEATURE_CAMERA_CAPABILITY_RAW
FEATURE_CAMERA_LEVEL_FULL
FEATURE_GAMEPAD
FEATURE_LIVE_TV
FEATURE_MANAGED_USERS
FEATURE_LEANBACK
FEATURE_OPENGLES_EXTENSION_PACK
FEATURE_SECURELY_REMOVES_USERS
FEATURE_SENSOR_AMBIENT_TEMPERATURE
FEATURE_SENSOR_HEART_RATE_ECG
FEATURE_SENSOR_RELATIVE_HUMIDITY
FEATURE_VERIFIED_BOOT
FEATURE_WEBVIEW
Autorizzazioni utente
La seguente autorizzazione è ora supportata nell'elemento <uses-permission>
per dichiarare le autorizzazioni necessarie alla tua app per accedere a determinate API.
BIND_DREAM_SERVICE
: se scegli come target l'API di livello 21 e superiore, questa autorizzazione è richiesta da un servizio Daydream, per garantire che solo il sistema possa eseguire l'associazione.