Livello API: 12
Per gli sviluppatori, la piattaforma Android 3.1 (HONEYCOMB_MR1
) è disponibile come componente scaricabile per l'SDK Android. La piattaforma scaricabile include una libreria Android e un'immagine di sistema, oltre a un set di skin per emulatori e altro ancora. La piattaforma scaricabile non include librerie esterne.
Per gli sviluppatori, la piattaforma Android 3.1 è disponibile come componente scaricabile per l'SDK Android. La piattaforma scaricabile include una libreria Android e un'immagine di sistema, oltre a un set di skin per emulatori e altro ancora. Per iniziare a sviluppare o testare la versione di Android 3.1, utilizza Android SDK Manager per scaricare la piattaforma nel tuo SDK.
Panoramica dell'API
Le sezioni seguenti forniscono una panoramica tecnica delle novità per gli sviluppatori di Android 3.1, incluse le nuove funzionalità e le modifiche dell'API Framework rispetto alla versione precedente.
API USB
Android 3.1 introduce nuove e potenti API per integrare le periferiche connesse con le applicazioni in esecuzione sulla piattaforma. Le API si basano su uno stack USB (Universal Serial Bus) e sui servizi integrati nella piattaforma, compreso il supporto sia per le interazioni di host e dispositivo USB. Utilizzando le API, gli sviluppatori possono creare applicazioni in grado di scoprire, comunicare con e gestire una varietà di tipi di dispositivi connessi tramite USB.
Lo stack e le API distinguono due tipi di hardware USB di base, a seconda che il dispositivo Android funzioni come host o che l'hardware esterno funzioni come host:
- Un dispositivo USB è un componente hardware connesso che dipende dal dispositivo Android per fungere da host. Ad esempio, i dispositivi di input, i mouse e i joystick sono dispositivi USB, così come molte videocamere, hub e così via.
- Un accessorio USB è un componente hardware collegato che dispone di un controller host USB, fornisce alimentazione ed è progettato per comunicare con i dispositivi Android tramite USB. È possibile collegare una serie di periferiche come accessori, dai controller robotici ad apparecchiature musicali, cyclette e altro ancora.
Per entrambi i tipi (dispositivi USB e accessori USB), le API USB della piattaforma supportano il rilevamento tramite trasmissione di intent quando collegati o scollegati, nonché interfacce standard, endpoint e modalità di trasferimento (controllo, collettivo e interrompe).
Le API USB sono disponibili nel pacchetto android.hardware.usb
. La classe centrale è UsbManager
, che fornisce metodi helper per l'identificazione e la comunicazione con dispositivi USB e accessori USB. Le applicazioni possono acquisire un'istanza di UsbManager
e quindi eseguire una query per trovare l'elenco di dispositivi o accessori collegati per poi comunicare con questi o gestirli.
UsbManager
dichiara anche le azioni intent che il sistema trasmette per annunciare quando un dispositivo o un accessorio USB viene collegato o scollegato.
Altri corsi includono:
UsbDevice
, una classe che rappresenta hardware esterno collegato come dispositivo USB (con il dispositivo Android che funge da host).UsbAccessory
, che rappresenta l'hardware esterno collegato come host USB (con il dispositivo Android che funge da dispositivo USB).UsbInterface
eUsbEndpoint
, che forniscono l'accesso alle interfacce USB e agli endpoint standard di un dispositivo.UsbDeviceConnection
eUsbRequest
, per l'invio e la ricezione di dati e il controllo dei messaggi da o verso un dispositivo USB, in modo sincrono e asincrono.UsbConstants
, che fornisce le costanti per dichiarare tipi di endpoint, classi di dispositivi e così via.
Tieni presente che, sebbene lo stack USB sia integrato nella piattaforma, il supporto effettivo per le modalità host USB e accessori aperti su dispositivi specifici dipende dai produttori. In particolare, la modalità host si basa sull'hardware del controller USB appropriato nel dispositivo Android.
Inoltre, gli sviluppatori possono richiedere filtri su Google Play, in modo che le loro applicazioni non siano disponibili per gli utenti i cui dispositivi non forniscono il supporto USB appropriato. Per richiedere l'applicazione di filtri, aggiungi uno o entrambi gli elementi di seguito al manifest dell'applicazione, a seconda dei casi:
- Se l'applicazione deve essere visibile solo ai dispositivi che supportano la modalità host USB (connessione di dispositivi USB), dichiara questo elemento:
<uses-feature android:name="android.hardware.usb.host" android:required="true">
- Se l'applicazione deve essere visibile solo ai dispositivi che supportano accessori USB (connessione di host USB), dichiara questo elemento:
<uses-feature android:name="android.hardware.usb.accessory" android:required="true">
Per informazioni complete su come sviluppare applicazioni che interagiscano con gli accessori USB, consulta la documentazione per gli sviluppatori.
Per esaminare le applicazioni di esempio che utilizzano l'API host USB, consulta ADB Test e Missile Launcher.
API MTP/PTP
Android 3.1 mostra una nuova API MTP che consente alle applicazioni di interagire direttamente con le fotocamere collegate e altri dispositivi PTP. La nuova API consente a un'applicazione di ricevere notifiche quando i dispositivi vengono collegati e rimossi, di gestire i file e l'archiviazione su tali dispositivi e di trasferire file e metadati da e verso questi dispositivi. L'API MTP implementa il sottoinsieme PTP (Picture Transfer Protocol) della specifica MTP (Media Transfer Protocol).
L'API MTP è disponibile nel pacchetto android.mtp
e fornisce
queste classi:
MtpDevice
incapsula un dispositivo MTP collegato tramite il bus host USB. Un'applicazione può creare un'istanza di un oggetto di questo tipo e quindi utilizzare i suoi metodi per ottenere informazioni sul dispositivo e sugli oggetti archiviati al suo interno, nonché per aprire la connessione e trasferire i dati. Ecco alcuni dei metodi:getObjectHandles()
restituisce un elenco di handle per tutti gli oggetti sul dispositivo che corrispondono a un formato e a un elemento padre specificati. Per ottenere informazioni su un oggetto, un'applicazione può passare un handle agetObjectInfo()
.importFile()
consente a un'applicazione di copiare i dati per un oggetto in un file nello spazio di archiviazione esterno. Questa chiamata può bloccare per una quantità di tempo arbitraria a seconda delle dimensioni dei dati e della velocità dei dispositivi, quindi dovrebbe essere effettuata da un thread spearate.open()
consente a un'applicazione di aprire un dispositivo MTP/PTP collegato.getThumbnail()
restituisce la miniatura dell'oggetto sotto forma di array di byte.
MtpStorageInfo
contiene informazioni su un'unità di archiviazione su un dispositivo MTP, corrispondenti al set di dati StorageInfo descritto nella sezione 5.2.2 della specifica MTP. I metodi nella classe consentono a un'applicazione di ottenere la stringa descrittiva di un'unità di archiviazione, lo spazio libero, la capacità massima di archiviazione, l'ID spazio di archiviazione e l'identificatore del volume.MtpDeviceInfo
contiene informazioni su un dispositivo MTP corrispondente al set di dati DeviceInfo descritto nella sezione 5.1.1 della specifica MTP. I metodi della classe consentono alle applicazioni di ottenere il produttore, il modello, il numero di serie e la versione.MtpObjectInfo
contiene informazioni su un oggetto archiviate su un dispositivo MTP, corrispondenti al set di dati ObjectInfo descritto nella sezione 5.3.1 della specifica MTP. I metodi nella classe consentono alle applicazioni di ottenere informazioni su dimensioni, formato dei dati, tipo di associazione, data di creazione e miniature di un oggetto.MtpConstants
fornisce le costanti per dichiarare i codici dei formati file MTP, il tipo di associazione e lo stato della protezione.
Supporto di nuovi dispositivi di input ed eventi di movimento
Android 3.1 estende il sottosistema di input per supportare nuovi dispositivi di input e nuovi tipi di eventi di movimento, in tutte le viste e le finestre. Gli sviluppatori possono sfruttare queste funzionalità per consentire agli utenti di interagire con le loro applicazioni utilizzando mouse, trackball, joystick, gamepad e altri dispositivi, oltre a tastiere e touchscreen.
Per gestire l'input del mouse, della rotellina di scorrimento e della trackball, la piattaforma supporta due nuove azioni relative agli eventi di movimento:
ACTION_SCROLL
, che descrive la posizione del puntatore in cui è stato eseguito un movimento di scorrimento non touch, ad esempio tramite la rotellina del mouse. In MotionEvent, il valore degli assiAXIS_HSCROLL
eAXIS_VSCROLL
specifica il relativo movimento di scorrimento.ACTION_HOVER_MOVE
, segnala la posizione attuale del mouse quando non viene premuto alcun pulsante, nonché eventuali punti intermedi dall'ultimo eventoHOVER_MOVE
. Le notifiche di accesso e uscita tramite passaggio del mouse non sono ancora supportate.
Per supportare joystick e gamepad, la classe InputDevice
include queste nuove origini dei dispositivi di input:
SOURCE_CLASS_JOYSTICK
: il dispositivo di origine ha assi joystick.SOURCE_CLASS_BUTTON
: il dispositivo di origine è dotato di pulsanti o chiavi.SOURCE_GAMEPAD
: il dispositivo di origine dispone di pulsanti del gamepad comeKEYCODE_BUTTON_A
oKEYCODE_BUTTON_B
. ImplicaSOURCE_CLASS_BUTTON
SOURCE_JOYSTICK
: il dispositivo di origine ha assi joystick. Implica SOURCE_CLASS_JOYSTICK.
Per descrivere gli eventi di movimento da queste nuove origini, oltre a quelli provenienti da mouse e trackball, la piattaforma ora definisce i codici degli assi su MotionEvent
, in modo simile a come definisce i codici chiave su KeyEvent
. I nuovi codici di asse per joystick e controller di gioco includono AXIS_HAT_X
, AXIS_HAT_Y
, AXIS_RTRIGGER
, AXIS_ORIENTATION
, AXIS_THROTTLE
e molti altri.
Gli assi MotionEvent
esistenti sono rappresentati da AXIS_X
, AXIS_Y
,
AXIS_PRESSURE
, AXIS_SIZE
, AXIS_TOUCH_MAJOR
, AXIS_TOUCH_MINOR
, AXIS_TOOL_MAJOR
, AXIS_TOOL_MINOR
e AXIS_ORIENTATION
.
Inoltre, MotionEvent
definisce un numero di codici di assi generici che vengono utilizzati quando il framework non sa come mappare un determinato asse. Dispositivi specifici possono usare i codici generici degli assi per passare dati di movimento personalizzati alle applicazioni. Per un elenco completo degli assi e delle relative interpretazioni, consulta la documentazione della classe MotionEvent
.
La piattaforma fornisce eventi di movimento alle applicazioni in batch, quindi un singolo
evento può contenere una posizione attuale e più cosiddetti movimenti storici.
Le applicazioni devono utilizzare getHistorySize()
per ottenere il numero di campioni storici, quindi recuperare ed elaborare tutti i campioni storici in ordine utilizzando getHistoricalAxisValue()
. Successivamente, le richieste dovrebbero elaborare l'esempio
attuale utilizzando getAxisValue()
.
Alcuni assi possono essere recuperati utilizzando metodi di accesso speciali. Ad esempio,
anziché chiamare getAxisValue()
, le applicazioni possono chiamare getX()
. Gli assi con funzioni di accesso integrate includono AXIS_X
, AXIS_Y
,
AXIS_PRESSURE
, AXIS_SIZE
, AXIS_TOUCH_MAJOR
, AXIS_TOUCH_MINOR
, AXIS_TOOL_MAJOR
, AXIS_TOOL_MINOR
e AXIS_ORIENTATION
.
Ogni dispositivo di input ha un ID univoco assegnato dal sistema e può anche fornire più origini. Quando un dispositivo fornisce più origini, più di un'origine
può fornire dati dell'asse utilizzando lo stesso asse. Ad esempio, un evento touch proveniente
dall'origine del tocco utilizza l'asse X per i dati sulla posizione dello schermo, mentre un evento joystick
proveniente dall'origine del joystick utilizzerà invece l'asse X per la posizione
del joystick. Per questo motivo, è importante che le applicazioni interpretino i valori degli assi in base all'origine da cui hanno origine. Quando si gestisce un evento di movimento, le applicazioni devono utilizzare i metodi sulla classe InputDevice
per determinare gli assi supportati da un dispositivo o un'origine. In particolare, le applicazioni possono utilizzare getMotionRanges()
per eseguire query su tutti gli assi di un dispositivo o su tutti gli assi di una determinata origine del dispositivo. In entrambi i casi, le informazioni sull'intervallo per gli assi restituiti
nell'oggetto InputDevice.MotionRange
specificano l'origine di
ogni valore dell'asse.
Infine, poiché gli eventi di movimento di joystick, gamepad, mouse e trackball non sono eventi di tocco, la piattaforma aggiunge un nuovo metodo di callback per trasferirli a un View
come eventi di movimento "generici".
Nello specifico, segnala gli eventi di movimento non touch ai View
tramite una chiamata a onGenericMotionEvent()
, anziché a onTouchEvent()
.
La piattaforma invia eventi di movimento generici in modo diverso, a seconda della classe di origine dell'evento. Gli eventi SOURCE_CLASS_POINTER
vengono inseriti in View
sotto il puntatore, in modo simile al funzionamento degli eventi touch. Tutti gli altri vanno al View
attualmente attivo.
Ad esempio, questo significa che un elemento View
deve concentrarsi per
ricevere eventi del joystick. Se necessario, le applicazioni possono gestire questi eventi a livello di attività o di dialogo implementando onGenericMotionEvent()
lì.
Per esaminare un'applicazione di esempio che utilizza eventi di movimento joystick, vedi GameControllerInput e GameView.
API RTP
Android 3.1 espone un'API al suo stack RTP (Real-time Transport Protocol) integrato, che le applicazioni possono utilizzare per gestire i flussi di dati on demand o interattivi. In particolare, le app che offrono VoIP, push-to-talk, conferenze e streaming audio possono utilizzare l'API per avviare sessioni e trasmettere o ricevere stream di dati su qualsiasi rete disponibile.
L'API RTP è disponibile nel pacchetto android.net.rtp
. I corsi includono:
RtpStream
, la classe base dei flussi di dati che inviano e ricevono pacchetti di rete con payload multimediali tramite RTP.AudioStream
, una sottoclasse diRtpStream
che trasporta i payload audio su RTP.AudioGroup
, un hub audio locale per la gestione e il missaggio dell'altoparlante, del microfono e del microfono del dispositivoAudioStream
.AudioCodec
, che contiene una raccolta di codec da te definita per unAudioStream
.
Per supportare l'audioconferenza e utilizzi simili, un'applicazione crea un'istanza di due classi come endpoint per lo stream:
AudioStream
specifica un endpoint remoto ed è costituito dalla mappatura di rete e da unAudioCodec
configurato.AudioGroup
rappresenta l'endpoint locale per uno o piùAudioStream
. L'AudioGroup
mescola tutti iAudioStream
e, facoltativamente, interagisce con l'altoparlante e il microfono del dispositivo contemporaneamente.
L'utilizzo più semplice prevede un singolo endpoint remoto e un endpoint locale.
Per utilizzi più complessi, consulta le limitazioni descritte per AudioGroup
.
Per utilizzare l'API RTP, le applicazioni devono richiedere l'autorizzazione all'utente
dichiarando <uses-permission
android:name="android.permission.INTERNET">
nei file manifest. Per acquisire il microfono del dispositivo, è richiesta anche l'autorizzazione <uses-permission
android:name="android.permission.RECORD_AUDIO">
.
Widget di app ridimensionabili
A partire da Android 3.1, gli sviluppatori possono ridimensionare i widget nella schermata Home: orizzontalmente, verticalmente o su entrambi gli assi. Gli utenti tengono premuto un widget per visualizzare i punti di manipolazione di ridimensionamento, quindi trascinano quelli orizzontali e/o verticali per modificare le dimensioni della griglia di layout.
Gli sviluppatori possono ridimensionare qualsiasi widget della schermata Home definendo un attributo resizeMode
nei metadati AppWidgetProviderInfo
del widget. I valori dell'attributo resizeMode
includono "Horizontal", "vertical" e "none".
Per dichiarare un widget come ridimensionabile orizzontalmente e verticalmente, fornisci il valore
"Horizontal|vertical".
Ecco un esempio:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="294dp" android:minHeight="72dp" android:updatePeriodMillis="86400000" android:previewImage="@drawable/preview" android:initialLayout="@layout/example_appwidget" android:configure="com.example.android.ExampleAppWidgetConfigure" android:resizeMode="horizontal|vertical" > </appwidget-provider>
Per ulteriori informazioni sui widget della schermata Home, consultare la documentazione Widget app.
Framework dell'animazione
- Nuova lezione ViewPropertyAnimator
- Una nuova classe
ViewPropertyAnimator
offre agli sviluppatori un modo pratico per animare le proprietà selezionate negli oggettiView
. La classe automatizza e ottimizza l'animazione delle proprietà e semplifica la gestione di più animazioni simultanee su un oggettoView
.L'uso dell'
ViewPropertyAnimator
è semplice. Per animare le proprietà di un elementoView
, chiamaanimate()
per creare un oggettoViewPropertyAnimator
perView
. Utilizza i metodi nellaViewPropertyAnimator
per specificare quale proprietà animare e come farlo. Ad esempio, per applicare la dissolvenza diView
a trasparente, richiamaalpha(0);
. L'oggettoViewPropertyAnimator
gestisce i dettagli della configurazione della classeAnimator
sottostante, dell'avvio e del rendering dell'animazione.
- Una nuova classe
- Colore di sfondo dell'animazione
- I nuovi metodi
getBackgroundColor()
esetBackgroundColor(int)
consentono di ottenere/impostare il colore di sfondo dietro le animazioni, solo per le animazioni delle finestre. Al momento lo sfondo deve essere nero, con qualsiasi livello alfa desiderato.
- I nuovi metodi
- Recupero della frazione animata da
ViewAnimator
- Un nuovo metodo
getAnimatedFraction()
consente di ottenere la frazione attuale dell'animazione, ovvero la frazione trascorsa/interpolata utilizzata nell'aggiornamento di frame più recente, da un valoreValueAnimator
.
- Un nuovo metodo
Framework UI
- Rendering forzato di un livello
- Un nuovo metodo
buildLayer()
consente a un'applicazione forzare la creazione di un livello di una vista e il rendering della vista immediatamente. Ad esempio, un'applicazione può utilizzare questo metodo per eseguire il rendering di una vista nel suo livello prima di avviare un'animazione. Se la visualizzazione è complessa, il rendering nel livello prima di avviare l'animazione eviterà di saltare i fotogrammi.
- Un nuovo metodo
- Distanza fotocamera
- Le applicazioni possono utilizzare un nuovo metodo
setCameraDistance(float)
per impostare la distanza dalla fotocamera a una vista. Ciò consente alle applicazioni di controllare meglio le trasformazioni 3D della vista, come le rotazioni.
- Le applicazioni possono utilizzare un nuovo metodo
- Visualizzazione di una visualizzazione del calendario da un selettore di data
- Un nuovo metodo
getCalendarView()
consente di ottenere unCalendarView
da un'istanzaDatePicker
.
- Un nuovo metodo
- Ottenere i callback quando le viste vengono scollegate.
- Un nuovo
View.OnAttachStateChangeListener
ti consente di ricevere callback quando una vista è collegata o scollegata dalla relativa finestra. UtilizzaaddOnAttachStateChangeListener()
per aggiungere un listener eaddOnAttachStateChangeListener()
per rimuoverlo.
- Un nuovo
- Listener di breadcrumb del frammento, nuova firma onInflate()
- Un nuovo metodo,
setOnBreadCrumbClickListener()
, fornisce un hook per consentire alle applicazioni di intercettare i clic di breadcrumb e di eseguire le azioni necessarie prima di accedere alla voce backstack o al frammento su cui è stato fatto clic. - Nella classe
Fragment
,onInflate(attrs, savedInstanceState)
è deprecato. Usa inveceonInflate(activity, attrs, savedInstanceState)
.
- Un nuovo metodo,
- Mostra i risultati di ricerca in una nuova scheda
- Una chiave dati
EXTRA_NEW_SEARCH
per gli intentACTION_WEB_SEARCH
ti consente di aprire una ricerca in una nuova scheda del browser, anziché in una esistente.
- Una chiave dati
- Cursore di testo disegnabile
- Ora puoi specificare una risorsa da utilizzare come cursore di testo tramite il nuovo
attributo delle risorse
textCursorDrawable
.
- Ora puoi specificare una risorsa da utilizzare come cursore di testo tramite il nuovo
attributo delle risorse
- Impostazione mostrata come elemento secondario nelle viste remote
- Un nuovo metodo di convenienza,
setDisplayedChild(viewId, childIndex)
, è disponibile nelle sottoclassiRemoteViews
, per consentirti di impostare il valore secondario visualizzato nelle sottoclassiViewAnimator
eAdapterViewAnimator
, comeAdapterViewFlipper
,StackView
,ViewFlipper
eViewSwitcher
.
- Un nuovo metodo di convenienza,
- Tasti generici per gamepad e altri dispositivi di input
KeyEvent
aggiunge una serie di codici chiave generici per supportare i pulsanti del gamepad. La classe aggiunge ancheisGamepadButton(int)
e diversi altri metodi helper per lavorare con i codici chiave.
Grafica
- Aiutanti per la gestione delle bitmap
setHasAlpha(boolean)
consente a un'app di indicare che tutti i pixel di una bitmap sono noti per essere opachi (false) o che alcuni pixel potrebbero contenere valori alfa non opachi (true). Tieni presente che per alcune configurazioni (come RGB_565) questa chiamata viene ignorata, poiché non supporta i valori alfa per pixel. Ciò è inteso come suggerimento di disegno, poiché in alcuni casi una bitmap che è nota per essere opaca può richiedere un disegno più veloce rispetto a una bitmap con valori alfa non opachi per pixel.getByteCount()
ottiene le dimensioni di una bitmap in byte.getGenerationId()
consente a un'applicazione di scoprire se una bitmap è stata modificata, ad esempio per la memorizzazione nella cache.sameAs(android.graphics.Bitmap)
determina se una determinata bitmap è diversa dalla bitmap attuale per dimensioni, configurazione o dati di pixel.
- Impostazione della posizione e della rotazione della videocamera
Camera
aggiunge i due nuovi metodirotate()
esetLocation()
per il controllo della posizione della videocamera nelle trasformazioni 3D.
Rete
- Blocco del Wi-Fi ad alte prestazioni
- Un nuovo blocco Wi-Fi ad alte prestazioni consente alle applicazioni di mantenere connessioni Wi-Fi ad alte prestazioni anche quando lo schermo del dispositivo è spento. Le applicazioni che riproducono in streaming musica, video o voce per lunghi periodi di tempo possono acquisire il blocco del Wi-Fi ad alte prestazioni per garantire le prestazioni dello streaming anche quando lo schermo è spento. Poiché utilizza più energia, le applicazioni devono acquisire la connessione Wi-Fi ad alte prestazioni quando occorre una connessione attiva a lunga durata.
Per creare un blocco ad alte prestazioni, passa
WIFI_MODE_FULL_HIGH_PERF
come modalità di blocco in una chiamata acreateWifiLock()
.
- Un nuovo blocco Wi-Fi ad alte prestazioni consente alle applicazioni di mantenere connessioni Wi-Fi ad alte prestazioni anche quando lo schermo del dispositivo è spento. Le applicazioni che riproducono in streaming musica, video o voce per lunghi periodi di tempo possono acquisire il blocco del Wi-Fi ad alte prestazioni per garantire le prestazioni dello streaming anche quando lo schermo è spento. Poiché utilizza più energia, le applicazioni devono acquisire la connessione Wi-Fi ad alte prestazioni quando occorre una connessione attiva a lunga durata.
- Altre statistiche sul traffico
- Le applicazioni ora possono accedere alle statistiche su più tipi di utilizzo della rete con nuovi metodi in
TrafficStats
. Le applicazioni possono utilizzare i metodi per ottenere statistiche UDP, conteggio pacchetti, byte e segmenti di payload per la trasmissione e la ricezione TCP per un determinato UID.
- Le applicazioni ora possono accedere alle statistiche su più tipi di utilizzo della rete con nuovi metodi in
- Nome utente autenticazione SIP
- Le applicazioni ora possono ottenere e impostare il nome utente di autenticazione SIP per un profilo
utilizzando
i nuovi metodi
getAuthUserName()
esetAuthUserName()
.
- Le applicazioni ora possono ottenere e impostare il nome utente di autenticazione SIP per un profilo
utilizzando
i nuovi metodi
Gestione dei download
- Gestione dei download completati
- Le applicazioni ora possono avviare download che inviano notifiche agli utenti solo al completamento. Per avviare questo tipo di download, le applicazioni passano
VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION
al metodosetNotificationVisibility()
dell'oggetto a richiesta. - Un nuovo metodo,
addCompletedDownload()
, consente a un'applicazione di aggiungere un file al database dei download, in modo che possa essere gestito dall'applicazione Download.
- Le applicazioni ora possono avviare download che inviano notifiche agli utenti solo al completamento. Per avviare questo tipo di download, le applicazioni passano
- Mostra i download ordinati per dimensione
- Le applicazioni possono avviare l'applicazione Download in modalità ordinamento per dimensione aggiungendo il nuovo
INTENT_EXTRAS_SORT_BY_SIZE
aggiuntivo a un intentACTION_VIEW_DOWNLOADS
.
- Le applicazioni possono avviare l'applicazione Download in modalità ordinamento per dimensione aggiungendo il nuovo
Framework IME
- Ottenere una chiave valore aggiuntiva di un metodo di inserimento
InputMethodSubtype
aggiunge il metodocontainsExtraValueKey()
per verificare se è memorizzata una stringa ExtraValue per il sottotipo e il metodogetExtraValueOf()
per estrarre un valore chiave specifico dalla mappa hash ExtraValue.
Contenuti multimediali
- Nuovi formati audio in streaming
- Il framework multimediale aggiunge il supporto integrato per i contenuti ADTS AAC non elaborati, per un audio in streaming migliorato, nonché il supporto per l'audio FLAC, per contenuti audio compressi di massima qualità (senza perdita di dati). Per ulteriori informazioni, consulta il documento Formati multimediali supportati.
Avvia controlli sulle applicazioni interrotte
A partire da Android 3.1, il gestore di pacchetti del sistema tiene traccia delle applicazioni in stato di interruzione e fornisce un mezzo per controllarne l'avvio dai processi in background e da altre applicazioni.
Tieni presente che lo stato Arresto di un'applicazione non equivale allo stato Arresto di un'attività. Il sistema gestisce questi due stati di interruzione separatamente.
La piattaforma definisce due nuovi flag di intent che consentono a un mittente di specificare se l'intent deve essere autorizzato ad attivare componenti nell'applicazione interrotta.
FLAG_INCLUDE_STOPPED_PACKAGES
: includi i filtri per intent delle applicazioni interrotte nell'elenco dei potenziali target in base a cui risolvere i problemi.FLAG_EXCLUDE_STOPPED_PACKAGES
: escludi i filtri per intent delle applicazioni interrotte dall'elenco dei target potenziali.
Quando nessuno di questi flag o nessuno dei due viene definito in un intent, il comportamento predefinito prevede l'inclusione dei filtri delle applicazioni interrotte nell'elenco dei target potenziali.
Tieni presente che il sistema aggiunge FLAG_EXCLUDE_STOPPED_PACKAGES
a tutti gli intent
trasmessi. Ciò impedisce che gli annunci trasmessi dai servizi in background avvii inavvertitamente o inutilmente componenti delle applicazioni arrestate.
Un'applicazione o un servizio in background possono eseguire l'override di questo comportamento aggiungendo il flag FLAG_INCLUDE_STOPPED_PACKAGES
agli intent di trasmissione a cui è consentito attivare le applicazioni arrestate.
Le applicazioni si trovano in stato arrestato quando vengono installate per la prima volta ma non sono ancora state avviate e quando vengono arrestate manualmente dall'utente (in Gestisci applicazioni).
Notifica del primo avvio e dell'upgrade dell'applicazione
La piattaforma aggiunge una notifica migliorata del primo lancio dell'applicazione e degli upgrade tramite due nuove azioni per intent:
ACTION_PACKAGE_FIRST_LAUNCH
: inviato al pacchetto di installazione di un'applicazione al primo avvio dell'applicazione (ovvero la prima volta che l'applicazione viene spostata dallo stato interrotto). I dati contengono il nome del pacchetto.ACTION_MY_PACKAGE_REPLACED
: segnala a un'applicazione che è stata aggiornata e che una nuova versione è stata installata su una versione esistente. Viene inviato soltanto all'applicazione che è stata sostituita. Non contiene dati aggiuntivi. Per riceverla, dichiara un filtro per intent per questa azione. Puoi utilizzare l'intent per attivare il codice che consente di ripristinare l'esecuzione corretta dell'applicazione dopo un upgrade.Questo intent viene inviato direttamente all'applicazione, ma solo se è stato eseguito l'upgrade dell'applicazione mentre era avviata (non in stato arrestata).
Utilità principali
- Cache LRU
- Una nuova classe
LruCache
consente alle applicazioni di trarre vantaggio da un'efficiente memorizzazione nella cache. Le applicazioni possono utilizzare la classe per ridurre il tempo dedicato all'elaborazione o al download dei dati dalla rete, mantenendo al contempo un'adeguata quantità di memoria per i dati memorizzati nella cache.LruCache
è una cache che contiene forti riferimenti a un numero limitato di valori. Ogni volta che si accede a un valore, questo viene spostato in "head" in una coda. Quando un valore viene aggiunto a una cache completa, il valore alla fine della coda viene rimosso e potrebbe essere idoneo per la garbage collection.
- Una nuova classe
- Descrittore del file come
int
- Ora puoi ottenere il descrittore di file nativo int per un
ParcelFileDescriptor
utilizzando uno dei nuovi metodigetFd()
odetachFd()
.
- Ora puoi ottenere il descrittore di file nativo int per un
WebKit
- Cookie dello schema file
CookieManager
ora supporta i cookie che utilizzano lo schema URIfile:
. Puoi utilizzaresetAcceptFileSchemeCookies()
per abilitare/disabilitare il supporto dei cookie dello schema file prima di creare un'istanza diWebView
oCookieManager
. In un'istanzaCookieManager
, puoi verificare se i cookie dello schema file sono abilitati chiamandoallowFileSchemeCookies()
.
- Notifica della richiesta di accesso
- Per supportare le funzionalità di accesso automatico del browser introdotte in Android 3.0, il nuovo metodo
onReceivedLoginRequest()
comunica all'applicazione host che è stata elaborata una richiesta di accesso automatico per l'utente.
- Per supportare le funzionalità di accesso automatico del browser introdotte in Android 3.0, il nuovo metodo
- Classi e interfacce rimosse
- Diverse classi e interfacce sono state rimosse dall'API pubblica, dopo che in precedenza era in stato deprecato. Per ulteriori informazioni, consulta il report Differenze API.
Browser
L'applicazione browser aggiunge le seguenti funzionalità per supportare le applicazioni web:
- Supporto per la riproduzione in linea dei video incorporati nel tag
<video>
HTML5. La riproduzione avviene con accelerazione hardware, ove possibile. - Supporto del livello per gli elementi con posizione fissa per tutti i siti (dispositivi mobili e computer).
Nuove costanti delle funzionalità
La piattaforma aggiunge nuove costanti di funzionalità hardware che gli sviluppatori possono dichiarare nei manifest dell'applicazione per informare le entità esterne come Google Play del requisito dell'applicazione in merito alle nuove funzionalità hardware supportate in questa versione della piattaforma. Gli sviluppatori dichiarano queste e altre costanti
di funzionalità negli elementi manifest di <uses-feature>
.
android.hardware.usb.accessory
: l'applicazione utilizza l'API USB per comunicare con dispositivi hardware esterni collegati tramite USB e funzionare come host.android.hardware.usb.host
: l'applicazione utilizza l'API USB per comunicare con dispositivi hardware esterni collegati tramite USB e funzionare come dispositivi.
Google Play filtra le applicazioni in base alle funzionalità dichiarate negli elementi del file manifest <uses-feature>
. Per ulteriori informazioni su come dichiarare le funzionalità nel file manifest di un'applicazione, consulta la pagina relativa ai filtri di Google Play.
Report Differenze API
Per una visualizzazione dettagliata di tutte le modifiche all'API in Android 3.1 (Livello API 12), consulta il report Differenze API.
Livello API
La piattaforma Android 3.1 fornisce una versione aggiornata dell'API framework. All'API Android 3.1 viene assegnato un identificatore numero intero 12, memorizzato nel sistema stesso. Questo identificatore, chiamato "Livello API", consente al sistema di determinare correttamente se un'applicazione è compatibile con il sistema prima di installarla.
Per utilizzare nella tua applicazione le API introdotte in Android 3.1, devi compilare l'applicazione in base alla libreria Android fornita nella piattaforma SDK Android 3.1. A seconda delle esigenze, potrebbe anche essere necessario aggiungere un attributo android:minSdkVersion="12"
all'elemento <uses-sdk>
nel file manifest dell'applicazione.
Per ulteriori informazioni, consulta la sezione Che cos'è il livello API?