Livello API: 21
Android 5.0 (LOLLIPOP) offre nuove funzionalità per utenti e sviluppatori di app. Questo documento fornisce un'introduzione alle nuove API più importanti.
Se hai un'app pubblicata, assicurati di controllare le modifiche al comportamento di Android 5.0 di cui devi tenere conto nella tua app. Questi cambiamenti del comportamento potrebbero interessare la tua app sui dispositivi Android 5.0, anche se non utilizzi nuove API o scegli come target nuove funzionalità.
Per una panoramica generale sulle nuove funzionalità della piattaforma, guarda invece le caratteristiche principali di Android Lollipop.
Inizia a sviluppare
Per iniziare a creare app per Android 5.0, devi prima ottenere l'SDK Android. Quindi utilizza SDK Manager per scaricare la piattaforma SDK Android 5.0 e le immagini di sistema.
Aggiorna il livello API target
Per ottimizzare meglio la tua app per i dispositivi con Android 5.0, imposta targetSdkVersion
su"21"
, installa l'app su un'immagine di sistema Android 5.0, testala e poi pubblica l'app aggiornata con questa modifica.
Puoi utilizzare le API Android 5.0 supportando anche le versioni precedenti aggiungendo al codice condizioni per verificare il livello API di sistema prima di eseguire API non supportate da minSdkVersion
.
Per scoprire di più sul mantenimento della compatibilità con le versioni precedenti, consulta Supporto di diverse versioni della piattaforma.
Per saperne di più sul funzionamento dei livelli API, consulta Che cos'è il livello API?
Modifiche importanti al 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, consulta Modifiche ad Android 5.0.
Interfaccia utente
Supporto di Material Design
Android 5.0 aggiunge il supporto del nuovo stile di material design di Android. Puoi creare app con material design visivamente dinamiche e con transizioni di elementi UI naturali per gli utenti. Questa assistenza include:
- Il tema Material
- Visualizza ombre
- Widget
RecyclerView
- Animazioni disegnabili e effetti di stile
- Animazione di material design ed effetti di transizione delle attività
- Animatori per le proprietà della vista in base allo stato della vista
- Widget UI e barre delle app personalizzabili con tavolozze dei colori controllate da te
- Drawable animati e non animati basati su grafiche vettoriali XML
Per scoprire di più sull'aggiunta della funzionalità di material design alla tua app, visita la pagina Material Design.
Documenti e attività simultanee nella schermata Recenti
Nelle release precedenti, la
schermata delle app recenti
poteva mostrare una sola attività per ogni app con cui l'utente aveva interagito
più di recente. Ora la tua app può aprire più attività, se necessario, per altre attività contemporaneamente per i documenti. Questa funzionalità facilita il multitasking
consentendo agli utenti di passare rapidamente da una singola attività a un documento e viceversa dalla
schermata Recenti, con un'esperienza di passaggio coerente tra tutte le app.
Alcuni esempi di attività simultanee potrebbero includere schede aperte in un'app
di un browser web, documenti in un'app di produttività, corrispondenze in parallelo
in un gioco o chat in un'app di messaggistica. La tua app può gestire le proprie attività
tramite la classe ActivityManager.AppTask
.
Per inserire un'interruzione logica in modo che il sistema consideri la tua attività come una nuova
attività, utilizza FLAG_ACTIVITY_NEW_DOCUMENT
quando
avvia l'attività con startActivity()
. Puoi ottenere questo comportamento anche impostando l'attributo documentLaunchMode
dell'elemento <activity> su "intoExisting"
o "always"
nel tuo file manifest.
Per evitare di appesantire la schermata delle app recenti, puoi impostare il numero massimo di attività della tua app che possono essere visualizzate in quella schermata. Per farlo, imposta l'attributo <application> android:maxRecents
. Il valore massimo corrente che può essere specificato è 50 attività per utente (25 per i dispositivi con poca RAM).
Le attività nella schermata Recenti possono essere impostate in modo da essere conservate 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, come il colore, l'etichetta e l'icona dell'attività, richiamando il metodo setTaskDescription()
.
Aggiornamenti di WebView
Android 5.0 aggiorna l'implementazione di WebView
a Chromium M37, apportando miglioramenti alla sicurezza e alla stabilità, nonché correzioni di bug. La stringa dello user agent predefinita per un
WebView
in esecuzione su Android 5.0 è stata aggiornata per includere 37.0.0.0 come numero di versione.
Questa release introduce la classe PermissionRequest
,
che consente alla tua app di concedere l'autorizzazione WebView
per accedere a risorse protette come la fotocamera e il microfono tramite API web
come getUserMedia(). Per concedere le autorizzazioni al
WebView
, la tua app deve disporre delle autorizzazioni Android appropriate per queste risorse.
Con il nuovo metodo onShowFileChooser()
,
ora puoi utilizzare un campo del modulo di immissione in WebView
,
e avviare un selettore di file per selezionare immagini e file dal dispositivo Android.
Inoltre, questa release supporta gli standard aperti WebAudio, WebGL e WebRTC. Per scoprire di più 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 alla tua app di acquisire i contenuti della schermata principale (la visualizzazione predefinita) in un oggetto Surface
, che l'app può quindi
inviare attraverso la rete. L'API consente di acquisire solo contenuti dello schermo non protetti
e non l'audio di sistema. Per iniziare a acquisire schermate, l'app deve prima richiedere l'autorizzazione dell'utente avviando una finestra di dialogo di acquisizione dello schermo utilizzando un Intent
ottenuto tramite il metodo createScreenCaptureIntent()
.
Per un esempio di come utilizzare le nuove API, vedi la classe MediaProjectionDemo
nel progetto di esempio.
Notifiche
Notifiche nella schermata di blocco
Le schermate di blocco in Android 5.0 hanno la possibilità di mostrare le notifiche. Gli utenti possono scegliere tramite Impostazioni se consentire la visualizzazione di contenuti sensibili delle notifiche su una schermata di blocco sicura.
L'app può controllare il livello di dettaglio visibile quando le notifiche vengono
visualizzate sulla schermata di blocco sicura. Per controllare il livello di visibilità, chiama
setVisibility()
e
specifica uno di questi valori:
VISIBILITY_PRIVATE
: vengono mostrate informazioni di base, come l'icona della notifica, ma i contenuti completi della notifica vengono nascosti.VISIBILITY_PUBLIC
: mostra l'intero contenuto della notifica.VISIBILITY_SECRET
: non viene mostrato nulla, esclusa anche l'icona della notifica.
Quando il livello di visibilità è VISIBILITY_PRIVATE
, puoi fornire anche una versione oscurata dei contenuti delle notifiche che nasconda i dettagli personali. Ad esempio, un'app per SMS potrebbe mostrare una
notifica con il messaggio "Hai 3 nuovi messaggi di testo", ma nascondendo
i contenuti del messaggio e i mittenti. Per fornire questa notifica alternativa, crea prima
la notifica di sostituzione utilizzando Notification.Builder
. Quando crei l'oggetto di notifica privata, allega la notifica di sostituzione tramite il metodo setPublicVersion()
.
Metadati delle notifiche
Android 5.0 utilizza i metadati associati alle notifiche delle app
per ordinare le notifiche 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 istantaneo o una sveglia).setPriority()
: Contrassegna la notifica come più o meno importante rispetto alle notifiche normali. Le notifiche con il campo Priorità impostato suPRIORITY_MAX
oPRIORITY_HIGH
vengono visualizzate in una piccola finestra mobile se sono presenti anche suoni o vibrazione.addPerson()
: consente di aggiungere una o più persone pertinenti a una notifica. La tua app può utilizzarlo per segnalare al sistema di raggruppare le notifiche delle persone specificate o classificarle 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 principali nuove funzionalità fornite in OpenGL ES 3.1 includono:
- Shader di calcolo
- Oggetti shader separati
- Comandi di disegno indiretti
- Texture multicampione e stencil
- Miglioramenti del linguaggio di Shading
- Estensioni per il debug e le modalità di miscelazione avanzate
- Compatibilità con le versioni precedenti di OpenGL ES 2.0 e 3.0
L'interfaccia Java per OpenGL ES 3.1 su Android è 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
. Ad esempio:
<manifest> <uses-feature android:glEsVersion="0x00030001" /> ... </manifest>
Per ulteriori informazioni sull'utilizzo di OpenGL ES, incluso come controllare la versione OpenGL ES supportata dal dispositivo in fase di runtime, consulta la guida dell'API OpenGL ES.
Android Extension Pack
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 unico pacchetto da Android. Se è presente
l'estensione ANDROID_extension_pack_es31a
, l'app può
presupporre che tutte le estensioni nel pacchetto siano presenti e abilitare le funzionalità del linguaggio di ombreggiatura
con una singola istruzione #extension
.
Il pacchetto di estensioni supporta:
- Supporto garantito per il Fragment Shader per buffer di archiviazione, immagini e atomici (il supporto per Fragment Shader è facoltativo in OpenGL ES 3.1).
- Tessellatura e shader di geometria
- Formato di compressione delle texture ASTC (LDR)
- Interpolazione e ombreggiatura per campione
- Diverse modalità di fusione per ciascun allegato di colore in un buffer di fotogrammi
L'interfaccia Java per il pacchetto di estensioni è fornita con GLES31Ext
. Nel file manifest dell'app, puoi dichiarare che la tua app deve essere installata solo sui dispositivi che supportano il pacchetto di estensioni.
Ad esempio:
<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 e l'elaborazione di immagini con dettagli fini. Ora puoi
accedere in modo programmatico ai dispositivi con videocamera disponibili per il 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
a cui inviare le immagini acquisite.
CameraCaptureSession
può essere configurato per scattare singole foto o più immagini con una serie di foto a raffica.
Per ricevere una notifica quando vengono acquisite nuove immagini, implementa l'CameraCaptureSession.CaptureCallback
listener
e impostalo nella richiesta di acquisizione. Ora, quando il sistema completa la richiesta di acquisizione di immagini, il tuo ascoltatore CameraCaptureSession.CaptureCallback
riceve una chiamata a onCaptureCompleted()
, che fornisce i metadati di acquisizione delle immagini in un CaptureResult
.
La classe CameraCharacteristics
consente all'app di rilevare le funzionalità della videocamera 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à approssimativamente equivalenti a quelle dell'APICamera
ritirata. - 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 con frequenze fotogrammi elevate.
Per scoprire come utilizzare l'API aggiornata
Camera, consulta gli esempi di implementazione
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 con virgola mobile
(
ENCODING_PCM_FLOAT
). In questo modo consente un intervallo dinamico più ampio, una precisione più coerente e un margine di miglioramento. L'aritmetica in virgola mobile è particolarmente utile durante i calcoli intermedi. Gli endpoint di riproduzione utilizzano un formato intero per i dati audio e una profondità in bit inferiore. In Android 5.0, alcune 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 riproduzione contenuti multimediali
Utilizza le nuove API di notifica e contenuti multimediali per assicurarti che l'interfaccia utente del sistema sia a conoscenza della riproduzione dei contenuti multimediali e possa estrarre e mostrare le copertine degli album.
Il controllo della riproduzione dei contenuti multimediali in un'interfaccia utente e in un servizio è ora più semplice con le nuove classi MediaSession
e MediaController
.
La nuova classe MediaSession
sostituisce la classe RemoteControlClient
deprecata e fornisce un unico 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 ed è 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 lezione offre
un modo sicuro per i thread per monitorare e controllare la riproduzione di contenuti multimediali dal processo dell'interfaccia utente della tua app.
Quando crei un controller, specifica un oggetto MediaSession.Token
in modo che la tua app possa interagire con il MediaSession
specificato.
Utilizzando i metodi MediaController.TransportControls
,
puoi inviare comandi come play()
,
stop()
,
skipToNext()
e setRating()
per controllare la riproduzione dei contenuti multimediali nella sessione. Con il controller, puoi anche
registrare un oggetto MediaController.Callback
per ascoltare i metadati e le modifiche di stato nella sessione.
Inoltre, puoi creare notifiche avanzate che consentono il controllo della riproduzione associato a una sessione multimediale con il nuovo corso Notification.MediaStyle
.
Navigazione nei 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
. La tua implementazione di MediaBrowserService
dovrebbe fornire l'accesso a MediaSession.Token
per consentire alle app di 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 questa istanza del browser,
la tua app può connettersi al servizio associato e ottenere un
oggetto MediaSession.Token
per riprodurre i contenuti esposti
tramite quel servizio.
Spazio di archiviazione
Selezione della directory
Android 5.0 estende Storage Access Framework per consentire agli utenti di selezionare un intero sottoalbero di 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 di directory, crea e invia un'OPEN_DOCUMENT_TREE
intent. 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()
ti consente di creare nuovi documenti o nuove directory ovunque
nel sottoalbero. Per gestire i documenti esistenti, utilizza renameDocument()
e deleteDocument()
.
Controlla COLUMN_FLAGS
per verificare l'assistenza del fornitore per queste chiamate prima di inviarle.
Se stai implementando DocumentsProvider
e vuoi
supportare la selezione del sottoalbero, implementa isChildDocument()
e includi FLAG_SUPPORTS_IS_CHILD
nel COLUMN_FLAGS
.
Android 5.0 introduce anche nuove directory specifiche dei pacchetti nello
spazio di archiviazione condiviso in cui la tua app può inserire file multimediali da includere in
MediaStore
. Il nuovo getExternalMediaDirs()
restituisce i percorsi di 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 cerca periodicamente nuovi contenuti multimediali in queste directory, ma puoi anche utilizzare MediaScannerConnection
per cercare esplicitamente nuovi contenuti.
Wireless e connettività
Più connessioni di rete
Android 5.0 fornisce nuove API di networking multiplo che consentono alla tua app di eseguire dinamicamente la ricerca di reti disponibili con funzionalità specifiche e di stabilire una connessione con queste. 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 particolare tipo di protocollo di trasporto.
Per selezionare e connetterti a una rete in modo dinamico dalla tua app:
- Crea un
ConnectivityManager
. - Utilizza la classe
NetworkRequest.Builder
per creare un oggettoNetworkRequest
e specificare le funzionalità della rete e il tipo di trasporto di cui è interessata la tua app. - Per eseguire la scansione delle reti adatte, chiama
requestNetwork()
oregisterNetworkCallback()
e trasmetti l'oggettoNetworkRequest
e un'implementazione diConnectivityManager.NetworkCallback
. Utilizza il metodorequestNetwork()
se vuoi passare attivamente a una rete adatta dopo che viene rilevata; per ricevere solo notifiche per le reti scansionate senza passare attivamente, usa invece 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
ottenere ulteriori informazioni sulla rete o per indirizzare il traffico all'utilizzo
della 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ò fungerte da dispositivo periferico Bluetooth LE. Le app possono utilizzare questa funzionalità per segnalare la propria presenza ai dispositivi nelle vicinanze. Ad esempio, puoi creare app che consentono a un dispositivo di funzionare come pedometro o monitor della 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 dispositivi Bluetooth LE nelle vicinanze. Per utilizzare le nuove funzionalità di pubblicità e scansione, aggiungi l'autorizzazione BLUETOOTH_ADMIN
nel file manifest. Quando gli utenti aggiornano o scaricano la tua app dal Play Store,
viene loro chiesto di concedere alla tua app la seguente autorizzazione:
"Informazioni sulla connessione Bluetooth: consente all'app di controllare il Bluetooth,
inclusa la trasmissione o l'ottenimento 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 trasmetti un'implementazione della
classe AdvertiseCallback
. L'oggetto callback
riceve un report sull'esito positivo o negativo dell'operazione pubblicitaria.
Android 5.0 introduce la classe ScanFilter
in modo che l'app possa analizzare solo i tipi specifici di dispositivi a cui è interessata. Per iniziare la ricerca di dispositivi Bluetooth
LE, chiama il numero startScan()
e inserisci un elenco di filtri. Nella chiamata al metodo, devi anche fornire un'implementazione di ScanCallback
per segnalare quando viene rilevato un annuncio Bluetooth LE.
Miglioramenti NFC
Android 5.0 aggiunge questi miglioramenti per consentire un uso più ampio e flessibile della tecnologia NFC:
- Android Beam è ora disponibile nel menu Condividi.
- La tua app può invocare Android Beam sul dispositivo dell'utente per condividere i dati chiamando
invokeBeam()
. In questo modo, l'utente non deve toccare manualmente il dispositivo con un altro dispositivo con tecnologia NFC per completare il trasferimento dei 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 un ID applicazione NFC (AID) in modo dinamico chiamando il numero
registerAidsForService()
. Puoi anche utilizzaresetPreferredService()
per impostare il servizio di emulazione della scheda preferito da utilizzare quando un'attività specifica è in primo piano.
Project Volta
Oltre alle nuove funzionalità, Android 5.0 offre miglioramenti alla durata della batteria. Utilizza le nuove API e il nuovo strumento per comprendere e ottimizzare il consumo energetico della tua app.
Pianificazione dei job
Android 5.0 fornisce una nuova API JobScheduler
che consente di ottimizzare la durata della batteria definendo i job per l'esecuzione asincrona del sistema in un momento successivo o in condizioni specifiche (ad esempio quando il dispositivo è in carica). La pianificazione dei job è utile in situazioni quali:
- L'app ha attività non rivolte agli utenti che puoi posticipare.
- L'app svolge il lavoro che preferisci quando l'unità è collegata all'alimentazione.
- L'app ha un'attività che richiede l'accesso alla rete o una connessione Wi-Fi.
- L'app include una serie di attività da eseguire come batch e regolarmente.
Un'unità di lavoro è incapsulata da un oggetto JobInfo
.
Questo oggetto specifica i criteri di pianificazione.
Utilizza la classe JobInfo.Builder
per configurare l'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
- Da completare 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 misurazione:
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 il dispositivo è alimentato in modo stabile (ovvero se è stato collegato per più di 2 minuti e la batteria è a un livello di integrità), il sistema eseguirà qualsiasi job pianificato pronto per l'esecuzione, anche se la scadenza del job non è scaduta.
Per un esempio di come utilizzare l'API JobScheduler
, consulta l'esempio di implementazione di JobScheduler
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 in base all'ID utente univoco (UID). Le statistiche includono:
- Cronologia degli eventi relativi alla batteria
- Statistiche globali per il dispositivo
- Consumo approssimativo di energia per UID e componente di sistema
- ms per app mobile per pacchetto
- Statistiche aggregate dell'UID di sistema
- Statistiche aggregate dell'UID dell'app
Utilizza l'opzione --help
per conoscere le varie opzioni per
personalizzare l'output. Ad esempio, per stampare le statistiche sull'utilizzo della batteria per un determinato pacchetto dell'app dall'ultima ricarica del dispositivo, esegui questo comando:
$ adb shell dumpsys batterystats --charged <package-name>
Puoi utilizzare lo strumento Cronologia batteria nell'output del comando dumpsys
per generare una visualizzazione HTML degli eventi correlati all'alimentazione dai log. Queste informazioni ti consentono di comprendere e diagnosticare più facilmente eventuali problemi relativi alla batteria.
Android al lavoro e nell'istruzione
Provisioning gestito
Android 5.0 offre nuove funzionalità per l'esecuzione delle app in un ambiente aziendale. Un amministratore del dispositivo può avviare un processo di provisioning gestito per aggiungere un profilo gestito co-presente ma separato a un dispositivo, se l'utente ha un account personale esistente. Le app associate ai profili gestiti vengono visualizzate accanto 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 va a buon fine, il sistema attiva il callback onProfileProvisioningComplete()
.
Puoi quindi chiamare setProfileEnabled()
per attivare questo profilo gestito.
Per impostazione predefinita, nel profilo gestito è attivato solo un piccolo sottoinsieme di app.
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 di attività lanciabili
per l'utente corrente e gli 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 il badge, chiama
getUserBadgedIcon()
.
Per scoprire come utilizzare la nuova funzionalità, fai riferimento all'esempio di implementazione di BasicManagedProfile
in questa release.
Proprietario del dispositivo
Android 5.0 introduce la possibilità di eseguire il deployment dell'app del proprietario di un dispositivo. Un proprietario del dispositivo è un tipo specializzato di amministratore del dispositivo che ha la possibilità aggiuntiva di creare e rimuovere utenti secondari e di configurare 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 eseguire il deployment e attivare il proprietario di un dispositivo, devi eseguire un trasferimento di dati NFC da un'app di programmazione al dispositivo mentre questo è 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 dello schermo che consente di limitare temporaneamente la possibilità per gli utenti di uscire dall'attività o di essere interrotti dalle notifiche. Potresti usarla, ad esempio, se stai sviluppando un'app educativa per supportare requisiti di valutazione importanti su Android o un'applicazione monouso o kiosk. Una volta attivato il blocco su schermo nell'app, gli utenti non possono visualizzare le notifiche, accedere ad altre app o tornare alla schermata Home finché l'app non esce dalla modalità.
Esistono due modi per attivare il blocco schermo:
- Manualmente. Gli utenti possono attivare il blocco su schermo in Impostazioni > Sicurezza > Blocco su schermo e selezionare le attività che vogliono bloccare toccando l'icona a forma di puntina verde nella schermata Recenti.
- In modo programmatico: per attivare il blocco su schermo in modo programmatico, chiama
startLockTask()
dall'app. Se l'app che ha inviato la richiesta non è un proprietario del dispositivo, all'utente viene richiesta una conferma. Un'app di proprietà del dispositivo può chiamare il metodosetLockTaskPackages()
per consentire alle app di essere bloccate senza il passaggio di conferma dell'utente.
Quando il blocco delle attività è attivo, si verifica quanto segue:
- La barra di stato è vuota e le notifiche e le informazioni sullo stato dell'utente sono nascoste.
- I pulsanti Home e Applicazioni recenti sono nascosti.
- 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 di un dispositivo richiama il blocco su schermo, l'utente rimane bloccato
per l'app finché l'app non chiama
stopLockTask()
. - Se il blocco su schermo viene attivato da un'altra app che non è di proprietario del dispositivo o direttamente dall'utente, l'utente può uscire tenendo premuti i pulsanti Indietro e Recenti.
Cornice per la stampa
Visualizza PDF come bitmap
Ora puoi eseguire il rendering delle pagine dei documenti PDF in immagini bitmap per la stampa utilizzando la nuova classe PdfRenderer
. Devi specificare un ParcelFileDescriptor
cercabile (ovvero, i contenuti possono essere consultati in modo casuale) su cui il sistema scrive i contenuti stampabili.
La tua app può ottenere una pagina per il rendering con
openPage()
, quindi chiama
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'PdfRendererBasic
esempio.
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 sull'utilizzo più dettagliate rispetto al metodo getRecentTasks()
deprecato.
Per utilizzare questa API, devi prima dichiarare l'autorizzazione "android.permission.PACKAGE_USAGE_STATS"
nel file manifest.
L'utente deve anche abilitare l'accesso per questa app tramite Impostazioni > Sicurezza > App
con accesso ai dati di utilizzo.
Il sistema raccoglie i dati di utilizzo su base per app, aggregandoli su intervalli giornalieri, settimanali, mensili e annuali. Il sistema conserva questi dati per un periodo massimo di tempo 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
- La durata totale in cui l'app è stata in primo piano per l'intervallo di tempo in questione (per giorno, settimana, mese o anno)
- Acquisizione del timestamp quando un componente (identificato da un pacchetto e dal nome dell'attività) è spostato in primo piano o sullo sfondo durante un giorno
- Acquisizione del timestamp quando la configurazione di un dispositivo è cambiata (ad esempio quando l'orientamento del dispositivo è cambiato a causa della rotazione)
Test e accessibilità
Miglioramenti ai test e all'accessibilità
Android 5.0 aggiunge il seguente supporto per i test e l'accessibilità:
- I nuovi metodi
getWindowAnimationFrameStats()
egetWindowContentFrameStats()
registrano le statistiche dei frame per le animazioni e i contenuti delle finestre. Questi metodi consentono di scrivere test di misurazione 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, il che ti consente 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à
(ad esempio
UiAutomator
) ora possono recuperare informazioni dettagliate sulle proprietà delle finestre sullo schermo con cui gli utenti vedenti possono interagire. Per recuperare un elenco di oggettiAccessibilityWindowInfo
, chiama il nuovo metodogetWindows()
. - La nuova classe
AccessibilityNodeInfo.AccessibilityAction
ti consente di definire azioni standard o personalizzate da eseguire su unAccessibilityNodeInfo
. La nuova classeAccessibilityNodeInfo.AccessibilityAction
sostituisce le API relative alle azioni precedentemente disponibili inAccessibilityNodeInfo
. - Android 5.0 offre un controllo più granulare sulla sintesi vocale nella tua app. La nuova classe
Voice
consente alla tua app di utilizzare profili vocali associati a lingue specifiche, valutazione della qualità e della latenza e parametri specifici del motore di sintesi vocale.
IME
Passaggio più semplice tra le lingue di input
A partire da Android 5.0, gli utenti possono passare più facilmente tra tutti gli editor dei metodi di input (IME) supportati dalla piattaforma. L'esecuzione dell'azione di scambio designata (in genere toccando un'icona a forma di globo sulla tastiera virtuale) consente di scorrere tutti questi IME. Questa modifica del comportamento viene implementata con il
metodo shouldOfferSwitchingToNextInputMethod()
.
Inoltre, il framework ora controlla se l'IME successivo include un meccanismo di cambio (e, di conseguenza, se l'IME supporta il passaggio all'IME in seguito). Un IME con un meccanismo di commutazione non esegue ciclicamente a un IME senza uno. Questa
variazione di comportamento è implementata dal
metodo
switchToNextInputMethod()
.
Per un esempio di come utilizzare le API di commutazione IME aggiornate, fai riferimento all'esempio di implementazione aggiornato della tastiera software in questa release. Per scoprire di più su come implementare il passaggio da un IME all'altro, consulta la sezione Creare un metodo di inserimento.
Dichiarazioni dei file manifest
Funzionalità obbligatorie dichiarabili
I seguenti valori sono ora supportati nell'elemento
<uses-feature>
, così puoi assicurarti che la tua app sia installata solo sui dispositivi che
forniscono le funzionalità necessarie alla tua 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
Ora nell'elemento
<uses-permission>
è supportata la seguente autorizzazione per dichiarare le autorizzazioni richieste dalla tua app per accedere a determinate API.
BIND_DREAM_SERVICE
: quando scegli come target il livello API 21 e versioni successive, questa autorizzazione è richiesta da un servizio Daydream per garantire che solo il sistema possa associarsi.