Caratteristiche di Meduse Bean
Questo documento offre una panoramica generale delle nuove funzionalità per gli sviluppatori introdotte in Android 4.1. Queste funzionalità includono: notifiche avanzate, aggiornamenti di Android Beam per condividere file di grandi dimensioni, aggiornamenti a contenuti multimediali, individuazione di rete peer-to-peer, animazioni, nuove autorizzazioni.
Panoramica
Android 4.1 (livello API 16), noto anche come "Jelly Bean", è stato rilasciato il 9 luglio 2012. Questo articolo fornisce un'introduzione generale ad alcune delle nuove funzionalità di Android 4.1 per sviluppatori che usano Xamarin.Android. Alcune di queste nuove funzionalità introdotte sono miglioramenti alle animazioni per l'avvio di un'attività, nuovi suoni per una fotocamera e il supporto migliorato per lo spostamento dello stack di applicazioni. È ora possibile tagliare e incollare con finalità.
La stabilità delle applicazioni Android è migliorata grazie alla possibilità di isolare la dipendenza da provider di contenuti instabili. I servizi possono anche essere isolati in modo che siano accessibili solo dall'attività che li ha avviati.
È stato aggiunto il supporto per l'individuazione dei servizi di rete usando i servizi basati su DNS Bonjour, UPnP o multicast. È ora possibile che le notifiche più complete abbiano testo formattato, pulsanti di azione e immagini di grandi dimensioni.
Sono state infine aggiunte diverse nuove autorizzazioni in Android 4.1.
Requisiti
Per sviluppare applicazioni Xamarin.Android con Jelly Bean è necessario che Xamarin.Android 4.2.6 o versione successiva e Android 4.1 (livello API 16) sia installato tramite Android SDK Manager, come illustrato nella schermata seguente:
Novità
Animazioni
Le attività possono essere avviate usando animazioni di zoom o animazioni personalizzate usando la ActivityOptions
classe . Per supportare queste animazioni sono disponibili i nuovi metodi seguenti:
MakeScaleUpAnimation
: verrà creata un'animazione che aumenta le prestazioni di una finestra attività da una posizione iniziale e dalle dimensioni sullo schermo.MakeThumbnailScaleUpAnimation
: verrà creata un'animazione che aumenta da un'immagine di anteprima dalla posizione specificata sullo schermo.MakeCustomAnimation
: crea un'animazione dalle risorse nell'applicazione. È disponibile un'animazione per quando l'attività viene aperta e un'altra per quando l'attività si arresta.
La nuova TimeAnimator
classe fornisce un'interfaccia TimeAnimator.ITimeListener
che può notificare a un'applicazione ogni volta che un fotogramma cambia in un'animazione. Si consideri ad esempio l'implementazione seguente di TimeAnimator.ITimeListener
:
class MyTimeListener : Java.Lang.Object, TimeAnimator.ITimeListener
{
public void OnTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime)
{
Log.Debug("Activity1", "totalTime={0}, deltaTime={1}", totalTime, deltaTime);
}
}
E ora per usare la classe , viene creata un'istanza di TimeAnimator
e il listener è impostato:
var animator = new TimeAnimator();
animator.SetTimeListener(new MyTimeListener());
animator.Start();
Quando l'istanza TimeAnimator
è in esecuzione, richiamerà ITimeAnimator.ITimeListener
, che porterà quindi a registrare il tempo di esecuzione dell'animazione e per quanto tempo è trascorso dall'ultima chiamata del metodo.
Spostamento tra stack di applicazioni
Android 4.1 migliora lo spostamento dello stack di applicazioni introdotto in Android 3.0. Specificando la ParentName
proprietà di ActivityAttribute
, Android può aprire l'attività padre appropriata quando l'utente preme il pulsante Su sulla barra delle azioni - Android creerà un'istanza dell'attività specificata dalla ParentName
proprietà . Ciò consente alle applicazioni di mantenere una gerarchia di attività che rendono un'attività specifica.
Per la maggior parte delle applicazioni che impostano sull'attività ParentName
sono sufficienti informazioni per Android per fornire il comportamento corretto per l'esplorazione dello stack di applicazioni; Android eseguirà la sintesi dello stack back necessario creando una serie di finalità per ogni attività padre. Tuttavia, poiché si tratta di uno stack di applicazioni artificiali, ogni attività sintetica non avrà lo stato salvato che avrebbe un'attività naturale. Per fornire lo stato salvato a un'attività padre sintetica, un'attività può eseguire l'override del OnPrepareNavigationUpTaskStack
metodo . Questo metodo riceve un'istanza TaskStackBuilder
che avrà una raccolta di oggetti Intent che Android userà per creare lo stack back. L'attività può modificare queste finalità in modo che, man mano che viene creata l'attività sintetica, riceverà le informazioni sullo stato appropriate.
Per scenari più complessi, sono disponibili nuovi metodi nella classe Activity che possono essere usati per gestire il comportamento di spostamento Up e costruire lo stack back:
OnNavigateUp
– Eseguendo l'override di questo metodo è possibile eseguire un'azione personalizzata quando si preme il pulsante Su .NavigateUpTo
: la chiamata a questo metodo fa sì che l'applicazione passi dall'attività corrente all'attività specificata da una determinata finalità.ParentActivityIntent
: viene usato per ottenere una finalità che avvierà l'attività padre dell'attività corrente.ShouldUpRecreateTask
: questo metodo viene usato per eseguire query se lo stack back sintetico deve essere creato per passare a un'attività padre. Restituiscetrue
se è necessario creare lo stack sintetico.FinishAffinity
: la chiamata a questo metodo terminerà l'attività corrente e tutte le attività sottostanti nell'attività corrente con la stessa affinità di attività.OnCreateNavigateUpTaskStack
: questo metodo viene sottoposto a override quando è necessario avere il controllo completo sulla modalità di creazione dello stack sintetico.
Fotocamera
È disponibile una nuova interfaccia, Camera.IAutoFocusMoveCallback
, che può essere usata per rilevare l'avvio o l'arresto dello stato attivo automatico. Un esempio di questa nuova interfaccia può essere visualizzato nel frammento di codice seguente:
public class AutoFocusCallbackActivity : Activity, Camera.IAutoFocusCallback
{
public void OnAutoFocus(bool success, Camera camera)
{
// camera is an instance of the camera service object.
if (success)
{
// Auto focus was successful - do something here.
}
else
{
// Auto focus didn't happen for some reason - react to that here.
}
}
}
La nuova classe MediaActionSound
fornisce un set di API per la produzione di suoni per le varie azioni multimediali. Esistono diverse azioni che possono verificarsi con una fotocamera, che sono definite dall'enumerazione Android.Media.MediaActionSoundType
:
MediaActionSoundType.FocusComplete
– Questo suono che viene riprodotto quando lo stato attivo è completato.MediaActionSoundType.ShutterClick
– Questo suono verrà riprodotto quando viene scattata un'immagine ancora.MediaActionSoundType.StartVideoRecording
– Questo suono viene usato per indicare l'inizio della registrazione video.MediaActionSoundType.StopVideoRecording
– Questo suono verrà riprodotto per indicare la fine della registrazione video.
Un esempio di come usare la MediaActionSound
classe può essere visualizzato nel frammento di codice seguente:
var mediaActionPlayer = new MediaActionSound();
// Preload the sound for a shutter click.
mediaActionPlayer.Load(MediaActionSoundType.ShutterClick);
var button = FindViewById<Button>(Resource.Id.MyButton);
// Play the sound on a button click.
button.Click += (sender, args) => mediaActionPlayer.Play(MediaActionSoundType.ShutterClick);
// This releases the preloaded resources. Don’t make any calls on
// mediaActionPlayer after this.
mediaActionPlayer.Release();
Connettività
Android Beam
Android Beam è una tecnologia basata su NFC che consente a due dispositivi Android di comunicare tra loro. Android 4.1 offre un supporto migliore per il trasferimento di file di grandi dimensioni. Quando si usa il nuovo metodo NfcAdapter.SetBeamPushUris()
Android passerà tra meccanismi di trasporto alternativi (ad esempio Bluetooth) per ottenere una velocità di trasferimento veloce.
Individuazione dei servizi di rete
Android 4.1 contiene le nuove API per l'individuazione di servizi basati su DNS multicast.
Ciò consente a un'applicazione di rilevare e connettere tramite Wi-Fi ad altri dispositivi, ad esempio stampanti, fotocamere e dispositivi multimediali. Queste nuove API si trovano nel Android.Net.Nsd
pacchetto.
Per creare un servizio che può essere utilizzato da altri servizi, la NsdServiceInfo
classe viene usata per creare un oggetto che definirà le proprietà di un servizio. Questo oggetto viene quindi fornito insieme a NsdManager.RegisterService()
un'implementazione di NsdManager.ResolveListener
. Le implementazioni di NsdManager.ResolveListener
vengono usate per notificare una registrazione corretta e annullare la registrazione del servizio.
Per individuare i servizi in rete e l'implementazione di Nsd.DiscoveryListener
passato a NsdManager.discoverServices()
.
Utilizzo rete
Un nuovo metodo consente ConnectivityManager.IsActiveNetworkMetered
a un dispositivo di verificare se è connesso a una rete a consumo. Questo metodo può essere usato per gestire l'utilizzo dei dati informando accuratamente gli utenti che potrebbero essere previsti costi elevati per le operazioni dei dati.
Individuazione del servizio diretto WiFi
La WifiP2pManager
classe è stata introdotta in Android 4.0 per supportare zeroconf. Zeroconf (rete di configurazione zero) è un set di tecniche che consentono ai dispositivi (computer, stampanti, telefoni) di connettersi automaticamente alle reti, con l'intervento di operatori di rete umani o di server di configurazione speciali.
In Jelly Bean è WifiP2pManager
possibile individuare i dispositivi nelle vicinanze usando Bonjour o Upnp. Bonjour è l'implementazione di Zeroconf di Apple. Upnp è un set di protocolli di rete che supporta anche zeroconf. I metodi seguenti aggiunti a per supportare l'individuazione WiFiP2pManager
del servizio Wi-Fi:
AddLocalService()
: questo metodo viene usato per annunciare un'applicazione come servizio tramite Wi-Fi per l'individuazione da parte dei peer.AddServiceRequest(
) : questo metodo consiste nell'inviare una richiesta di individuazione del servizio al framework. Viene usato per inizializzare l'individuazione del servizio Wi-Fi.SetDnsSdResponseListeners()
: questo metodo viene usato per registrare i callback da richiamare quando si riceve una risposta alle richieste di individuazione da Bonjour.SetUpnpServiceResponseListener()
: questo metodo viene usato per registrare i callback da richiamare quando si riceve una risposta alle richieste di individuazione Upnp.
Provider di contenuto
La ContentResolver
classe ha ricevuto un nuovo metodo, AcquireUnstableContentProvider
. Questo metodo consente a un'applicazione di acquisire un provider di contenuto "instabile". In genere, quando un'applicazione acquisisce un provider di contenuti e il provider di contenuti si arresta in modo anomalo, quindi l'applicazione. Con questa chiamata al metodo, un'applicazione non si arresta in modo anomalo se il provider di contenuti si arresta in modo anomalo. Al contrario, Android.OS.DeadObjectionException
verrà generata da chiamate sul provider di contenuti per informare un'applicazione che il provider di contenuti è scomparso. Un provider di contenuti "instabile" è utile quando interagisce con i provider di contenuti di altre applicazioni. È meno probabile che il codice bug di un'altra applicazione influirà su un'altra applicazione.
Copiare e incollare con finalità
La Intent
classe può ora avere un ClipData
oggetto associato tramite la Intent.ClipData
proprietà . Questo metodo consente di trasmettere dati aggiuntivi dagli Appunti con la finalità . Un'istanza di ClipData
può contenere uno o più ClipData.Item
oggetti . ClipData.Item
's sono elementi dei tipi seguenti:
- Text : qualsiasi stringa di testo, HTML o qualsiasi stringa il cui formato è supportato dagli intervalli di stile Android predefiniti.
- Finalità : qualsiasi
Intent
oggetto. - URI : può trattarsi di qualsiasi URI, ad esempio un segnalibro HTTP o l'URI di un provider di contenuto.
Servizi isolati
Un servizio isolato è un servizio che viene eseguito nel proprio processo speciale e non dispone di autorizzazioni proprie. L'unica comunicazione con il servizio consiste nell'avviare il servizio e associarlo tramite l'API del servizio. È possibile dichiarare un servizio come isolato impostando la proprietà IsolatedProcess="true"
in ServiceAttribute
che adorna una classe di servizio.
File media
La nuova Android.Media.MediaCodec
classe fornisce un'API ai codec multimediali di basso livello. Le applicazioni possono eseguire query sul sistema per scoprire quali codec di basso livello sono disponibili nel dispositivo.
Le nuove Android.Media.Audiofx.AudioEffect
sottoclassi sono state aggiunte per supportare la pre-elaborazione audio aggiuntiva sull'audio acquisito:
Android.Media.Audiofx.AcousticEchoCanceler
: questa classe viene usata per la pre-elaborazione dell'audio per rimuovere il segnale da una parte remota da un segnale audio acquisito. Ad esempio, rimuovendo l'eco da un'applicazione di comunicazione vocale.Android.Media.Audiofx.AutomaticGainControl
: questa classe viene usata per normalizzare il segnale acquisito aumentando o abbassando un segnale di input in modo che il segnale di output sia costante.Android.Media.Audiofx.NoiseSuppressor
: questa classe rimuoverà il rumore di fondo dal segnale acquisito.
Non tutti i dispositivi supporteranno questi effetti. Il metodo AudioEffect.IsAvailable
deve essere chiamato da un'applicazione per verificare se l'effetto audio in questione è supportato nel dispositivo che esegue l'applicazione.
La MediaPlayer
classe supporta ora la riproduzione senza gap con il SetNextMediaPlayer()
metodo . Questo nuovo metodo specifica il successivo MediaPlayer da avviare al termine della riproduzione del lettore multimediale corrente.
Le nuove classi seguenti forniscono meccanismi e interfaccia utente standard per selezionare dove verranno riprodotti i supporti:
MediaRouter
: questa classe consente alle applicazioni di controllare il routing dei canali multimediali da un dispositivo a altoparlanti esterni o altri dispositivi.MediaRouterActionProvider
eMediaRouteButton
: queste classi consentono di fornire un'interfaccia utente coerente per la selezione e la riproduzione di contenuti multimediali.
Notifications
Android 4.1 consente alle applicazioni maggiore flessibilità e controllo con la visualizzazione delle notifiche. Le applicazioni possono ora visualizzare notifiche più grandi e migliori agli utenti. Un nuovo metodo consente NotificationBuilder.SetStyle()
di impostare uno dei tre nuovi stili nelle notifiche:
Notification.BigPictureStyle
: si tratta di una classe helper che genererà notifiche che includono un'immagine. L'immagine seguente mostra un esempio di notifica con un'immagine grande:
Notification.BigTextStyle
– Si tratta di una classe helper che genererà notifiche con più righe di testo, ad esempio posta elettronica. Un esempio di questo nuovo stile di notifica può essere visualizzato nello screenshot seguente:
Notification.InboxStyle
: si tratta di una classe helper che genererà notifiche che contengono un elenco di stringhe, ad esempio frammenti di codice da un messaggio di posta elettronica, come illustrato in questo screenshot:
È possibile aggiungere fino a due pulsanti di azione nella parte inferiore di un messaggio di notifica quando la notifica usa lo stile normale o più grande. Un esempio può essere visualizzato nello screenshot seguente, in cui i pulsanti di azione sono visibili nella parte inferiore della notifica:
La Notification
classe ha ricevuto nuove costanti che consentono a uno sviluppatore di specificare uno dei cinque livelli di priorità per una notifica. Questi valori possono essere impostati in una notifica usando la Priority
proprietà .
Autorizzazioni
Sono state aggiunte le nuove autorizzazioni seguenti:
READ_EXTERNAL_STORAGE
- L'applicazione richiede l'accesso in sola lettura all'archiviazione esterna. Attualmente tutte le applicazioni hanno accesso in lettura per impostazione predefinita, ma le versioni future di Android richiederanno in modo esplicito l'accesso in lettura alle applicazioni.READ_USER_DICTIONARY
- Consente l'accesso in lettura al dizionario delle parole dell'utente.READ_CALL_LOG
- Consente a un'applicazione di ottenere informazioni sulle chiamate in ingresso e in uscita leggendo il log delle chiamate.WRITE_CALL_LOG
- Consente a un'applicazione di scrivere nel registro chiamate sul telefono.WRITE_USER_DICTIONARY
- Consente a un'applicazione di scrivere nel dizionario delle parole dell'utente.
Una modifica importante da notare READ_EXTERNAL_STORAGE
: attualmente questa autorizzazione viene concessa automaticamente da Android. Le versioni future di Android richiederanno a un'applicazione di richiedere questa autorizzazione prima di concedere l'autorizzazione.
Riepilogo
Questo articolo ha introdotto alcune delle nuove API disponibili in Android 4.1 (livello API 16). Sono state evidenziate alcune modifiche per le animazioni e l'animazione del lancio di un'attività e sono state introdotte le nuove API per l'individuazione di rete di altri dispositivi usando protocolli come Bonjour o UPnP. Sono state evidenziate anche altre modifiche all'API, ad esempio la possibilità di tagliare e incollare i dati tramite finalità, la possibilità di usare servizi isolati o provider di contenuti "instabile".
In questo articolo sono stati introdotti gli aggiornamenti alle notifiche e sono state illustrate alcune delle nuove autorizzazioni introdotte con Android 4.1