API per Android 4.1

Livello API: 16

Android 4.1 (JELLY_BEAN) è un progresso della piattaforma che offre un'esperienza utente migliorata e prestazioni elevate. Aggiunge nuove funzionalità per utenti e app sviluppatori. Questo documento fornisce un'introduzione alle nuove e utili API per gli sviluppatori di app.

In qualità di sviluppatore di app, Android 4.1 è disponibile per te tramite Gestore SDK come immagine di sistema che puoi nell'emulatore Android e in una piattaforma SDK su cui puoi creare la tua app. Dovresti scarica l'immagine di sistema e la piattaforma appena possibile per creare e testare il tuo su Android 4.1.

Per ottimizzare meglio la tua app per i dispositivi con Android 4.1, devi impostare targetSdkVersion su "16", installalo su un'immagine di sistema Android 4.1, testarlo, quindi pubblicare un aggiornamento con questa modifica.

Tu possono utilizzare le API in Android 4.1 e al contempo supportare le versioni precedenti aggiungendo condizioni al codice che controllano il livello API di sistema prima di eseguirlo API non supportate dal tuo minSdkVersion. Per scoprire di più su mantenendo la compatibilità con le versioni precedenti, leggi l'articolo Creazione di una compatibilità con le versioni precedenti UI.

Ulteriori informazioni su come funzionano i livelli API sono disponibili nella pagina Che cos'è l'API Livello?

Componenti dell'app

Servizi isolati

Specificando android:isolatedProcess="true" nel tag <service>, la tua Service verrà eseguita in un proprio processo ID utente isolato, privo di autorizzazioni proprie.

Gestione della memoria

Le nuove costanti ComponentCallbacks2, come TRIM_MEMORY_RUNNING_LOW e TRIM_MEMORY_RUNNING_CRITICAL, forniscono il primo piano elabora altre informazioni stato della memoria prima che il sistema chiami onLowMemory().

Il nuovo metodo getMyMemoryState(ActivityManager.RunningAppProcessInfo) ti consente di: per recuperare lo stato generale della memoria.

Fornitori di contenuti

Un nuovo metodo, acquireUnstableContentProviderClient(), ti consente di accedere a un ContentProviderClient che potrebbe essere "instabile" in modo che l'app non abbia un arresto anomalo del fornitore di contenuti. È utile quando interagisci con i fornitori di contenuti in un dell'app.

Sfondi animati

Nuovo protocollo per intent per avviare direttamente l'attività di anteprima dello sfondo animato in modo che tu possa aiutarti gli utenti possono selezionare facilmente il tuo sfondo animato senza costringerli a uscire la tua app e spostati nel selettore di sfondi Home.

Per avviare il selettore di sfondi animati, chiama startActivity() con un Intent utilizzando ACTION_CHANGE_LIVE_WALLPAPER e un extra che specifica il tuo sfondo animato ComponentName come stringa in EXTRA_LIVE_WALLPAPER_COMPONENT.

Navigazione dello stack di app

Android 4.1 semplifica l'implementazione dei pattern di progettazione appropriati per Navigazione veloce. Non devi fare altro che aggiungere android:parentActivityName a ogni elemento <activity> in del file manifest. Il sistema utilizza queste informazioni per aprire l'attività appropriata quando l'utente Preme il pulsante Su nella barra delle azioni (e termina l'attività corrente). Quindi se dichiarare android:parentActivityName per ogni attività, non è necessario il metodo onOptionsItemSelected() per gestire i clic eventi visibili sull'icona dell'app della barra delle azioni: il sistema ora gestisce l'evento e riprende o crei l'attività appropriata.

Ciò è particolarmente efficace per i casi in cui l'utente avvia una delle attività dell'app attraverso un "approfondimento" come un intento di una notifica o un intento un'app diversa (come descritto nella guida alla progettazione per Navigare tra le app). Quando l'utente inserisce la tua attività in questo modo, la tua app potrebbe non avere naturalmente uno stack attività che possono essere riprese man mano che l'utente sale. Tuttavia, quando fornisci l'attributo android:parentActivityName per le tue attività, il sistema riconosce se l'app contiene già uno stack di attività principali e, in caso contrario, genera un back stack sintetico contenente tutte le attività principali.

Nota:quando l'utente inserisce un'attività approfondita nella tua app e viene creata una nuova attività per l'app, in realtà il sistema inserisce lo stack di attività principali nell'attività. Di conseguenza, se premi il pulsante Indietro puoi anche tornare indietro nello stack di attività.

Quando il sistema crea un back stack sintetico per la tua app, crea un elemento Intent di base per creare una nuova istanza dell'attività di ogni genitore. Quindi non c'è stato salvato per le attività principali come previsto per la navigazione naturale dell'utente alla ogni attività. Se una delle attività principali mostra normalmente un'interfaccia utente che dipende contesto dell'utente, mancano queste informazioni e dovresti fornirle quando utente scorre l'elenco filtri. Ad esempio, se l'utente sta visualizzando un album di un'app di musica, la navigazione verso l'alto potrebbe portarli a un'attività che elenca tutti gli album di un genere musicale. In questo caso, se è necessario creare lo stack, è necessario informare il publisher principale attività a quale genere appartiene l'album corrente, in modo che il genitore possa visualizzare l'elenco appropriato se l'utente proviene effettivamente da quell'attività. Fornire queste informazioni a un genitore sintetico attività, devi eseguire l'override del metodo onPrepareNavigateUpTaskStack(). Questo ti fornisce un oggetto TaskStackBuilder creato dal sistema per sintetizza le attività principali. TaskStackBuilder contiene Intent oggetti che il sistema utilizza per creare ciascuna attività principale. Nel tuo implementazione di onPrepareNavigateUpTaskStack(), puoi modificare il Intent appropriato in Aggiungere altri dati che l'attività del genitore può utilizzare per determinare il contesto e la visualizzazione appropriati l'interfaccia utente appropriata.

Quando il sistema crea l'elemento TaskStackBuilder, aggiunge gli oggetti Intent utilizzati per creare le attività padre nella relativa logica dall'alto dell'albero delle attività. Pertanto, l'ultimo Intent aggiunto all'array interno è l'elemento padre diretto dell'attività corrente. Se vuoi modificare Intent per l'attività principale dell'attività, devi prima determinare la lunghezza dell'array con getIntentCount() e passiamo su editIntentAt().

Se la struttura della tua app è più complessa, esistono diverse altre API disponibili che ti consentono di gestire il comportamento della navigazione personalizzare completamente il back stack sintetico. Alcune delle API che offrono funzionalità aggiuntive di controllo includono:

onNavigateUp()
Sostituisci questa impostazione per eseguire un'azione personalizzata quando l'utente preme il pulsante Su.
navigateUpTo(Intent)
Chiama questo numero per terminare l'attività in corso e andare all'attività indicata dal fornito Intent. Se l'attività è presente nello stack esistente, ma non è il genitore più prossimo, tutte le altre attività tra l'attività corrente e anche l'attività specificata con l'intento è terminata.
getParentActivityIntent()
Chiama questo per ottenere il Intent che darà inizio alla logica principale per l'attività corrente.
shouldUpRecreateTask(Intent)
Chiama questo pulsante per chiedere se è necessario creare un back stack sintetico per navigare verso l'alto. Restituisce true se è necessario creare uno stack sintetico, false se lo stack appropriato esiste già.
finishAffinity()
Chiama questo numero per completare l'attività corrente e tutte le attività principali con la stessa di affinità delle attività collegate all'attività corrente. Se sostituisci i comportamenti predefiniti, come onNavigateUp(), devi chiamare questo metodo quando Creare un back stack sintetico durante la navigazione in alto.
onCreateNavigateUpTaskStack
Esegui l'override di questa opzione se devi avere il controllo completo del modo in cui viene creato lo stack di attività sintetiche. Se vuoi semplicemente aggiungere alcuni dati extra agli intent per il tuo back stack, devi invece eseguire l'override di onPrepareNavigateUpTaskStack()

Tuttavia, la maggior parte delle app non ha bisogno di utilizzare queste API o implementare onPrepareNavigateUpTaskStack(), ma può ottenere il comportamento corretto semplicemente aggiungendo android:parentActivityName a ogni elemento <activity>.

Multimediale

Codec multimediali

La classe MediaCodec fornisce accesso a codec multimediali di basso livello per la codifica e decodificare i contenuti multimediali. Puoi creare un'istanza di MediaCodec chiamando createEncoderByType() per codificare i contenuti multimediali o chiamando createDecoderByType() per decodificarli. Ciascuno di questi prendono un tipo MIME per il tipo di contenuto multimediale che vuoi codificare o decodificare, ad esempio "video/3gpp" o "audio/vorbis".

Con un'istanza di MediaCodec creata, puoi quindi chiamare configure() per specificare proprietà come il formato multimediale o se i contenuti sono criptati o meno.

Che tu voglia codificare o decodificare i tuoi contenuti multimediali, il resto del processo è lo stesso dopo crea MediaCodec. Prima chiama getInputBuffers() per ottenere un array di input ByteBuffer e getOutputBuffers() per ottenere un array di oggetti ByteBuffer di output.

Quando tutto è pronto per la codifica o la decodifica, chiama dequeueInputBuffer() per ottenere la posizione di indice di ByteBuffer (dall'array di buffer di input) da utilizzare per il feed nella tua origine contenuti multimediali. Dopo aver compilato il ByteBuffer con i contenuti multimediali di origine, ritira la proprietà del buffer chiamando queueInputBuffer().

Allo stesso modo per il buffer di output, chiama dequeueOutputBuffer() per ottenere la posizione di indice di ByteBuffer dove riceverai i risultati. Dopo aver letto l'output da ByteBuffer, svincolare la proprietà chiamando il numero releaseOutputBuffer().

Puoi gestire i dati multimediali criptati nei codec chiamando queueSecureInputBuffer() in combinazione con le API MediaCrypto, invece del normale queueInputBuffer().

Per ulteriori informazioni su come utilizzare i codec, consulta la documentazione di MediaCodec.

Registra audio al momento del segnale

Il nuovo metodo startRecording() consente iniziare una registrazione audio in base a un segnale definito da un MediaSyncEvent. Il MediaSyncEvent specifica una sessione audio (ad esempio uno definito da MediaPlayer), che, una volta completato, attiva il registratore audio per iniziare a registrare. Ad esempio, puoi utilizzare questa funzionalità riprodurrà un segnale audio che indica l'inizio di una sessione di registrazione e inizia automaticamente, così non devi sincronizzare manualmente il tono e l'inizio di registrazione.

Tracce di testo temporizzate

L'MediaPlayer ora gestisce le tracce di testo in banda e fuori banda. Le tracce di testo in banda sono disponibili come traccia di testo all'interno di un'origine multimediale MP4 o 3GPP. Testo fuori banda È possibile aggiungere tracce come origine di testo esterna con il metodo addTimedTextSource(). Dopo tutto il testo esterno vengono aggiunte le sorgenti delle tracce, occorre chiamare getTrackInfo() per ottenere l'elenco aggiornato di tutti i canali disponibili in un'origine dati.

Per impostare la traccia da usare con MediaPlayer, devi: chiama selectTrack(), utilizzando l'indice della traccia che vuoi utilizzare.

Per ricevere una notifica quando la traccia di testo è pronta per la riproduzione, implementa il metodo Interfaccia e tessera MediaPlayer.OnTimedTextListener a setOnTimedTextListener().

Effetti audio

Il corso AudioEffect ora supporta audio aggiuntivo tipi di pre-elaborazione durante l'acquisizione dell'audio:

  • AEC (Acoustic Echo Canceler) con AcousticEchoCanceler rimuove il contributo del segnale ricevuto dall'utente remoto dal segnale audio acquisito.
  • Controllo automatico del guadagno (AGC) con AutomaticGainControl normalizza automaticamente l'output del segnale acquisito.
  • Soppressore del rumore (NS) con NoiseSuppressor rimuove il rumore di fondo dal segnale acquisito.

Puoi applicare questi effetti del pre-processore all'audio acquisito con un AudioRecord utilizzando una delle AudioEffect le sottoclassi del deployment.

Nota:non è garantito che tutti i dispositivi supportino queste funzionalità pertanto devi sempre verificare la disponibilità chiamando isAvailable() sul classe degli effetti audio.

Riproduzione senza interruzioni

Ora puoi eseguire la riproduzione senza interruzioni tra due MediaPlayer oggetti. In qualsiasi momento prima del termine del tuo primo MediaPlayer, chiama setNextMediaPlayer() e Android prova ad avviare il secondo giocatore nel momento in cui si ferma il primo.

Router multimediale. Le nuove API MediaRouter, MediaRouteActionProvider e MediaRouteButton forniscono meccanismi standard e UI per scegliere dove riprodurre i contenuti multimediali.

Fotocamera

Movimento automatico della messa a fuoco

La nuova interfaccia Camera.AutoFocusMoveCallback consente di ascoltare per le modifiche al movimento della messa a fuoco automatica. Puoi registrare la tua interfaccia con setAutoFocusMoveCallback(). Poi, quando la videocamera è in modalità di messa a fuoco automatica continua (FOCUS_MODE_CONTINUOUS_VIDEO o FOCUS_MODE_CONTINUOUS_PICTURE), riceverai una chiamata a onAutoFocusMoving(), che indica se la messa a fuoco automatica è stata avviata o si è interrotta.

Suoni fotocamera

La classe MediaActionSound fornisce un semplice set di API per generare i suoni standard generati dalla videocamera o da altre azioni multimediali. Dovresti usare queste API per giocare l'audio appropriato quando crei un'immagine statica o una videocamera personalizzata.

Per riprodurre un suono, crea semplicemente un'istanza di un oggetto MediaActionSound, richiama load() per precaricare l'audio desiderato, poi allo al momento opportuno, chiama il numero play().

Connettività

Android Beam

Android BeamTM ora supporta trasferimenti di payload di grandi dimensioni tramite Bluetooth. Quando definisci i dati di trasferire con il nuovo setBeamPushUris() o la nuova interfaccia di callback NfcAdapter.CreateBeamUrisCallback, Android passa il trasferimento dei dati a Bluetooth o un altro mezzo di trasporto alternativo raggiungere velocità di trasferimento più elevate. Ciò è particolarmente utile per i payload di grandi dimensioni, come file audio e non richiede l'accoppiamento visibile tra i dispositivi. Non è richiesto alcun intervento aggiuntivo da parte tua la tua app per sfruttare i trasferimenti tramite Bluetooth.

Il metodo setBeamPushUris() richiede un array di Uri oggetti che specificano i dati che vuoi trasferire dalla tua app. In alternativa, puoi implementare NfcAdapter.CreateBeamUrisCallback , che puoi specificare per la tua attività chiamando setBeamPushUrisCallback().

Quando utilizzi il interfaccia di callback, il sistema chiama il metodo createBeamUris() dell'interfaccia quando l'utente esegue una condivisione con Android Beam, in modo che tu possa definire gli URI da condividere al momento della condivisione. Questo è utile se gli URI da condividere possono variare a seconda del contesto dell'utente all'interno attività fisica, mentre la chiamata al numero setBeamPushUris() è utile quando gli URI da condividere non cambiano e puoi definirli in modo sicuro.

Rilevamento servizi di rete

Android 4.1 aggiunge il supporto per il rilevamento dei servizi basato su DNS multicast, che consente di trovare e connettersi a servizi offerti da dispositivi peer tramite Wi-Fi, come dispositivi mobili, stampanti, fotocamere, lettori multimediali e altri dispositivi registrati sulla rete locale.

Il nuovo pacchetto android.net.nsd contiene le nuove API che consentono di trasmettere i tuoi servizi sulla rete locale, rilevare dispositivi locali sulla rete e connettersi ai dispositivi.

Per registrare il servizio, devi prima creare un NsdServiceInfo e definire le varie proprietà del servizio con metodi come setServiceName(), setServiceType() e setPort().

Poi devi implementare NsdManager.RegistrationListener e la passiamo a registerService() con NsdServiceInfo.

Per scoprire i servizi sulla rete, implementa NsdManager.DiscoveryListener e passalo a discoverServices().

Quando il tuo NsdManager.DiscoveryListener viene richiamato sui servizi trovato, devi risolvere il servizio chiamando resolveService(), ha passato un implementazione di NsdManager.ResolveListener che riceve un oggetto NsdServiceInfo che contiene informazioni rilevato e ti consente di avviare la connessione.

Rilevamento del servizio P2P Wi-Fi

Le API Wi-Fi P2P sono state migliorate in Android 4.1 per supportare il rilevamento dei servizi di pre-associazione in WifiP2pManager. In questo modo puoi scoprire e filtrare le vicinanze dispositivi da parte di servizi che usano Wi-Fi P2P prima di connettersi a un dispositivo, mentre il Servizio di rete Rilevamento consente di rilevare un servizio su una rete connessa esistente (ad esempio una rete Wi-Fi locale) Google Cloud).

Trasmettere la tua app come servizio tramite Wi-Fi in modo che altri dispositivi possano rilevare la tua app e connettiti, chiama addLocalService() con un WifiP2pServiceInfo che descrive i servizi dell'app.

Per avviare il rilevamento di dispositivi nelle vicinanze tramite Wi-Fi, devi prima decidere se comunicare tramite Bonjour o Upnp. Per utilizzare Bonjour, imposta prima alcuni listener di callback con setDnsSdResponseListeners(), che richiede sia WifiP2pManager.DnsSdServiceResponseListener sia WifiP2pManager.DnsSdTxtRecordListener. Per utilizzare Upnp, chiama setUpnpServiceResponseListener(), che richiede WifiP2pManager.UpnpServiceResponseListener.

Per poter iniziare a rilevare servizi sui dispositivi locali, devi anche chiamare addServiceRequest(). Quando il WifiP2pManager.ActionListener che passi a questo metodo riceve un callback riuscito, potrai quindi iniziare a individuare i servizi sui dispositivi locali chiamando il numero discoverServices().

Quando vengono rilevati servizi locali, ricevi una richiamata al WifiP2pManager.DnsSdServiceResponseListener o al WifiP2pManager.UpnpServiceResponseListener, a seconda che tu registrati per utilizzare Bonjour o Upnp. Il callback ricevuto in entrambi i casi contiene un Oggetto WifiP2pDevice che rappresenta il dispositivo peer.

Utilizzo della rete

Il nuovo metodo isActiveNetworkMetered() ti consente di controlla se il dispositivo è attualmente connesso a una rete a consumo. Selezionando questo stato prima di eseguire intensive transazioni di rete, puoi contribuire a gestire l'utilizzo dei dati che potrebbe comportare dei costi per gli utenti e decidere in modo consapevole se eseguire le transazioni ora o in un secondo momento (ad esempio, si connette alla rete Wi-Fi).

Accessibilità

API dei servizi di accessibilità

La portata delle API dei servizi di accessibilità è stata notevolmente aumentata in Android 4.1. Adesso consente di creare servizi che monitorano e rispondono a più eventi di input, come gesti complessi. utilizzando onGesture() e altri eventi di input tramite aggiunte alle classi AccessibilityEvent, AccessibilityNodeInfo e AccessibilityRecord.

I servizi di accessibilità possono anche eseguire azioni per conto dell'utente, tra cui clic, scorrimento e passaggio del testo utilizzando performAction e setMovementGranularities. Il metodo performGlobalAction() consente inoltre ai servizi di eseguire azioni come Indietro, Home e aprire Recenti App e notifiche.

Navigazione delle app personalizzabile

Quando crei un'app per Android, ora puoi personalizzare gli schemi di navigazione individuando lo stato attivo elementi e widget di input utilizzando findFocus() e focusSearch() e imposta lo stato attivo utilizzando setAccessibilityFocused().

Widget più accessibili

Il nuovo corso android.view.accessibility.AccessibilityNodeProvider ti consente di: mostrare viste personalizzate complesse ai servizi di accessibilità in modo che possano presentare le informazioni in un più accessibile. android.view.accessibility.AccessibilityNodeProvider consente a un utente widget con contenuti avanzati, ad esempio una griglia di calendario, per presentare una struttura semantica logica per completamente separati dalla struttura di layout del widget. Questa semantica strutturale consente ai servizi di accessibilità di presentare un modello di interazione più utile per gli utenti che con disabilità visiva.

Copy and Paste

Copia e incolla con intent

Ora puoi associare un oggetto ClipData a un Intent utilizzando il metodo setClipData(). Ciò è particolarmente utile quando si utilizza un intent per trasferire più URI content: a un altro ad esempio quando si condividono più documenti. Gli URI content: forniti in questo modo rispetterà anche i flag dell'intent per offrire accesso in lettura o scrittura, consentendoti di concedere accesso a più URI in un intent. Quando avvii un intent ACTION_SEND o ACTION_SEND_MULTIPLE, gli URI forniti nell'intent sono ora propagarsi automaticamente a ClipData in modo che il destinatario possa avere l'accesso concesso.

Supporto per gli stili HTML e stringa

La classe ClipData ora supporta il testo con stili applicati (come HTML o In stile Android stringhe). Puoi aggiungere testo con stile HTML a ClipData utilizzando newHtmlText().

Script di rendering

La funzionalità di calcolo di Renderscript è stata migliorata con le seguenti funzionalità:

  • Supporto per più kernel all'interno di un unico script.
  • Supporto per la lettura dall'allocazione con campionatori filtrati dal calcolo in una nuova API script rsSample.
  • Supporto di diversi livelli di precisione FP in #pragma.
  • Supporto per l'esecuzione di query su informazioni aggiuntive da oggetti RS da uno script di computing.
  • Numerosi miglioramenti delle prestazioni.

Sono inoltre disponibili nuovi pragmi per definire la precisione in virgola mobile richiesta per il calcolo di Renderscript. Ciò consente di abilitare operazioni come NEON, come le operazioni matematiche vettoriali veloci un percorso della CPU che altrimenti non sarebbe possibile con lo standard IEEE 754-2008 completo.

Nota: il motore grafico sperimentale Renderscript ora è ritirato.

Animazione

Animazioni per avvio attività

Ora puoi avviare Activity utilizzando animazioni di zoom o le tue animazioni personalizzate. Per specificare l'animazione che preferisci, usa le API ActivityOptions per creare un Bundle che puoi quindi passiamo a uno qualsiasi metodi che avviano un'attività, ad esempio startActivity().

La classe ActivityOptions include un metodo diverso per ogni tipo di animazione che potresti voler mostrare all'apertura dell'attività:

makeScaleUpAnimation()
Crea un'animazione che ingrandisce la finestra dell'attività da un punto di partenza specificato posizione sullo schermo e una dimensione iniziale specificata. Ad esempio, la schermata Home Android 4.1 la usa all'apertura di un'app.
makeThumbnailScaleUpAnimation()
Crea un'animazione che ingrandisce la finestra dell'attività a partire da una data media e un'immagine in miniatura fornita. Ad esempio, la finestra App recenti in Android 4.1 lo utilizza quando torna a un'app.
makeCustomAnimation()
Crea un'animazione definita dalle tue risorse: una che definisce l'animazione per l'apertura dell'attività e un'altra per l'attività interrotta.

Animatore del tempo

Il nuovo TimeAnimator consente di richiamare facilmente meccanismo di attenzione con TimeAnimator.TimeListener che notifica per ogni frame dell'animazione. Con questo animatore non sono previste durate, interpolazioni o impostazioni di valore degli oggetti. Il callback del listener riceve informazioni per ogni frame, tra cui tempo totale trascorso e il tempo trascorso dal frame dell'animazione precedente.

Interfaccia utente

Notifiche

In Android 4.1 puoi creare notifiche con regioni di contenuti più grandi, anteprime di immagini di grandi dimensioni più pulsanti di azione e priorità configurabile.

Stili di notifica

Il nuovo metodo setStyle() consente di specificare uno dei tre nuovi stili per le notifiche, ognuno dei quali offre una regione di contenuti più ampia. A specifica lo stile per la tua regione di contenuti di grandi dimensioni, trasmetti a setStyle() uno dei seguenti oggetti:

Notification.BigPictureStyle
Per le notifiche che includono un'immagine allegata di grandi dimensioni.
Notification.BigTextStyle
Per notifiche che includono molto testo, ad esempio una sola email.
Notification.InboxStyle
Per le notifiche che includono un elenco di stringhe, come gli snippet di più email.
Azioni di notifica

È ora supportato l'utilizzo di un massimo di due pulsanti di azione nella parte inferiore dell' messaggio di notifica, indipendentemente dal fatto che la notifica utilizzi lo stile normale o più grande.

Per aggiungere un pulsante di azione, chiama addAction(). Questo metodo accetta tre argomenti: una risorsa accessibile per un'icona, testo per il pulsante e un valore PendingIntent che definisce l'azione a cui eseguire.

Priorità

Ora puoi suggerire al sistema l'importanza della notifica per l'effetto dell'ordine delle notifiche nell'elenco impostando la priorità con setPriority(). Tu può superare questo dei cinque diversi livelli di priorità definiti dalle costanti PRIORITY_* del corso Notification. Il valore predefinito è PRIORITY_DEFAULT e ci sono due livelli più alti e due più bassi.

Le notifiche con priorità elevata sono aspetti a cui gli utenti in genere vogliono rispondere rapidamente, ad esempio un nuovo messaggio immediato, un SMS o un promemoria di un evento imminente. Priorità bassa Le notifiche sono, ad esempio, eventi di calendario scaduti o promozioni di app.

Controlli per l'UI di sistema

Android 4.0 (Ice Cream Sandwich) ha aggiunto nuovi flag per controllare la visibilità dell'interfaccia utente di sistema ad esempio per attenuare l'aspetto della barra del sistema o farla scomparire completamente sugli smartphone. Android 4.1 aggiunge qualche altro flag che consente di controllare ulteriormente l'aspetto del sistema Gli elementi dell'interfaccia utente e il layout dell'attività in relazione ad essi richiamando setSystemUiVisibility() e passando i seguenti flag:

SYSTEM_UI_FLAG_FULLSCREEN
Nascondi l'interfaccia utente di sistema non critica (ad esempio la barra di stato). Se la tua attività utilizza la barra delle azioni in modalità overlay (di attivando android:windowActionBarOverlay), questo flag nasconde anche la barra delle azioni quindi con un'animazione coordinata quando nascondi e mostra i due.
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
Imposta il layout delle attività in modo che utilizzi la stessa area dello schermo che hai a disposizione abilitato SYSTEM_UI_FLAG_FULLSCREEN anche se gli elementi UI di sistema sono ancora visibili. Sebbene alcune parti del layout vengano sovrapposte UI di sistema, questa opzione è utile se la tua app spesso nasconde e mostra l'UI di sistema con SYSTEM_UI_FLAG_FULLSCREEN, perché evita il layout da regolarsi ai nuovi limiti del layout ogni volta che l'interfaccia utente di sistema si nasconde o viene visualizzata.
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
Imposta il layout delle attività in modo che utilizzi la stessa area dello schermo che hai a disposizione SYSTEM_UI_FLAG_HIDE_NAVIGATION attivata (aggiunto in Android 4.0) anche se gli elementi dell'interfaccia utente di sistema sono ancora visibili. Anche se alcune parti del layout saranno a cui viene sovrapposto barra di navigazione, questa opzione è utile se la tua app spesso nasconde e mostra la barra di navigazione con SYSTEM_UI_FLAG_HIDE_NAVIGATION, perché evita il layout regolarsi ai nuovi limiti del layout ogni volta che la barra di navigazione si nasconde o viene visualizzata.
SYSTEM_UI_FLAG_LAYOUT_STABLE
Ti consigliamo di aggiungere questo flag se usi SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN e/o SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION per assicurarti che quando chiami fitSystemWindows() su una vista che i limiti definiti rimangono coerenti per quanto riguarda lo spazio sullo schermo disponibile. In altre parole, con questo flag impostato, fitSystemWindows() si comporterà come se la visibilità degli elementi dell'interfaccia utente di sistema fosse invariata anche dopo aver nascosto tutta l'interfaccia utente di sistema.

Per ulteriori discussioni sugli altri flag dell'interfaccia utente di sistema correlati, consulta quelle aggiunte in Android 4.0.

Visualizzazioni remote

GridLayout e ViewStub sono ora rimovibili per consentirti di utilizzarle nei layout widget di app e layout personalizzati per le notifiche.

Famiglie di caratteri

Android 4.1 aggiunge diverse altre varianti dello stile del carattere Roboto per un totale di 10 varianti. e tutti possono essere utilizzati dalle app. Ora le app hanno accesso all'insieme completo di dispositivi varianti condensate.

Il set completo di varianti di caratteri Roboto disponibili è:

  • Periodici
  • Corsivo
  • Grassetto
  • Grassetto corsivo
  • Chiaro
  • Corsivo chiaro
  • Regolare condensato
  • Corsivo ridotto
  • Grassetto ridotto
  • Grassetto-corsivo ridotto

Puoi applicare una qualsiasi di queste con la nuova fontFamily in combinazione con l'attributo textStyle.

I valori supportati per fontFamily sono:

  • "sans-serif" per Roboto normale
  • "sans-serif-light" per Roboto Light
  • "sans-serif-condensed" per Roboto Condensed

Puoi quindi applicare grassetto e/o corsivo con i valori di textStyle "bold" e "italic". Puoi applicare entrambi in questo modo: android:textStyle="bold|italic".

Puoi anche usare Typeface.create(). Ad esempio, Typeface.create("sans-serif-light", Typeface.NORMAL).

Framework di input

Più dispositivi di input

La nuova classe InputManager ti consente di eseguire query insieme di dispositivi di input attualmente connessi e che si registrano per ricevere una notifica quando un nuovo dispositivo viene aggiunto, modificato o rimosso. Ciò è particolarmente utile se stai creando un gioco che supporta più giocatori e vuoi sapere quanti controller sono collegati e in caso di variazioni nel numero di controller.

Puoi eseguire query su tutti i dispositivi di input connessi chiamando getInputDeviceIds(). Questo restituisce un array di numeri interi, ognuno dei quali è un ID per un diverso dispositivo di input. Puoi quindi chiamare getInputDevice() per acquisire un InputDevice per un ID dispositivo di input specificato.

Se vuoi ricevere una notifica quando nuovi dispositivi di input vengono connessi, modificati o disconnessi, implementare l'interfaccia InputManager.InputDeviceListener e registralo con registerInputDeviceListener().

Vibrazione per i controller di input

Se i dispositivi di input collegati hanno le proprie funzionalità di vibrazione, ora puoi controllare la vibrazione di questi dispositivi usando le API Vibrator esistenti semplicemente chiamando getVibrator() su InputDevice.

Autorizzazioni

Di seguito sono riportate le nuove autorizzazioni:

READ_EXTERNAL_STORAGE
Fornisce l'accesso protetto in lettura allo spazio di archiviazione esterno. In Android 4.1 di per impostazione predefinita tutte le applicazioni hanno l'accesso. Questo aspetto verrà modificato in una release futura per rendere obbligatorio che le applicazioni richiedano esplicitamente accesso in lettura utilizzando questa autorizzazione. Se la tua applicazione richiede già l'accesso in scrittura, otterranno automaticamente anche l'accesso in lettura. È disponibile una nuova opzione sviluppatore per attivare l'accesso in lettura limitazione, per consentire agli sviluppatori di testare le loro applicazioni in base al comportamento di Android per il futuro.
android.Manifest.permission.READ_USER_DICTIONARY
Consente a un'applicazione di leggere il dizionario utente. Questa operazione dovrebbe essere richiesta solo IME o un editor di dizionari come l'app Impostazioni.
READ_CALL_LOG
Consente a un'applicazione di leggere il registro chiamate di sistema contenente informazioni su chiamate in arrivo e in uscita.
WRITE_CALL_LOG
Consente a un'applicazione di modificare il registro chiamate di sistema memorizzato sul telefono
android.Manifest.permission.WRITE_USER_DICTIONARY
Consente a un'applicazione di scrivere nel dizionario di parole dell'utente.

Funzionalità del dispositivo

Android 4.1 include una nuova dichiarazione di funzionalità per i dispositivi dedicati alla visualizzazione dell'interfaccia utente sullo schermo di una televisione: FEATURE_TELEVISION. Per dichiarare che la tua app richiede un'interfaccia televisiva, dichiara questa funzionalità nel tuo file manifest con l'elemento <uses-feature>:

<manifest ... >
    <uses-feature android:name="android.hardware.type.television"
                  android:required="true" />
    ...
</manifest>

Questa funzionalità definisce la "televisione" in una tipica esperienza televisiva in salotto: visualizzato su uno schermo di casa, in cui l'utente è seduto lontano e la forma principale dell'input è simile a un D-pad e generalmente non attraverso il tocco o Mouse/dispositivo-pointer.