Partilhar via


Jelly Bean Destaques

Este documento fornecerá uma visão geral de alto nível dos novos recursos para desenvolvedores que foram introduzidos no Android 4.1. Esses recursos incluem: notificações aprimoradas, atualizações para o Android Beam para compartilhar arquivos grandes, atualizações para multimídia, descoberta de rede ponto a ponto, animações, novas permissões.

Visão geral

Android 4.1 (API Nível 16), também conhecido como "Jelly Bean", foi lançado em 9 de julho de 2012. Este artigo fornecerá uma introdução de alto nível a alguns dos novos recursos do Android 4.1 para desenvolvedores que usam o Xamarin.Android. Alguns desses novos recursos introduzidos são aprimoramentos em animações para iniciar uma atividade, novos sons para uma câmera e suporte aprimorado para navegação de pilha de aplicativos. Agora é possível cortar e colar com intenção.

A estabilidade dos aplicativos Android é melhorada com a capacidade de isolar a dependência de provedores de conteúdo instáveis. Os serviços também podem ser isolados para que sejam acessíveis apenas pela atividade que os iniciou.

Foi adicionado suporte para descoberta de serviço de rede usando Bonjour, UPnP ou serviços baseados em DNS de multicast. Agora é possível notificações mais ricas que têm texto formatado, botões de ação e imagens grandes.

Finalmente, várias novas permissões foram adicionadas no Android 4.1.

Requisitos

Para desenvolver aplicativos Xamarin.Android usando Jelly Bean requer Xamarin.Android 4.2.6 ou superior e Android 4.1 (API Nível 16) ser instalado através do Android SDK Manager, como mostrado na captura de tela a seguir:

Selecionando o Android 4.1 no Android SDK Manager

What's New

Animações

As atividades podem ser iniciadas usando animações de zoom ou animações personalizadas usando a ActivityOptions classe. Os novos métodos a seguir são fornecidos para oferecer suporte a essas animações:

  • MakeScaleUpAnimation – Isso criará uma animação que amplia uma janela de atividade a partir de uma posição inicial e tamanho na tela.
  • MakeThumbnailScaleUpAnimation – Isso criará uma animação que aumenta a escala a partir de uma imagem em miniatura da posição especificada na tela.
  • MakeCustomAnimation – Isso cria uma animação a partir de recursos no aplicativo. Há uma animação para quando a atividade é aberta e outra para quando a atividade para.

A nova TimeAnimator classe fornece uma interface TimeAnimator.ITimeListener que pode notificar um aplicativo sempre que um quadro é alterado em uma animação. Por exemplo, considere a seguinte implementação de 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 agora para usar a classe, uma instância de TimeAnimator é criada e o ouvinte é definido:

var animator = new TimeAnimator();
animator.SetTimeListener(new MyTimeListener());
animator.Start();

À medida que a TimeAnimator instância estiver sendo executada, ela invocará ITimeAnimator.ITimeListener, que registrará em log quanto tempo o animador está em execução e há quanto tempo ele passou desde a última vez que o método foi invocado.

Navegação de pilha de aplicativos

Android 4.1 melhora a navegação da pilha de aplicativos que foi introduzida no Android 3.0. Ao especificar a ParentName propriedade do , o ActivityAttributeAndroid pode abrir a Atividade pai adequada quando o usuário pressiona o botão Para cima na barra de ações - o Android instanciará a Atividade especificada pela ParentName propriedade. Isso permite que os aplicativos preservem a hierarquia de atividades que fazem uma determinada tarefa.

Para a maioria dos aplicativos, a configuração da ParentName atividade é suficiente para que o Android forneça o comportamento correto para navegar na pilha de aplicativos; O Android sintetizará a pilha traseira necessária criando uma série de intenções para cada atividade pai. No entanto, como esta é uma pilha de aplicação artificial, cada atividade sintética não terá o estado salvo que uma atividade natural teria. Para fornecer o estado salvo para uma atividade pai sintética, uma atividade pode substituir o OnPrepareNavigationUpTaskStack método. Esse método recebe uma TaskStackBuilder instância que terá uma coleção de objetos Intent que o Android usará para criar a pilha traseira. A atividade pode modificar essas intenções para que, à medida que a atividade sintética é criada, ela receba as informações de estado adequadas.

Para cenários mais complexos, há novos métodos na classe Activity que podem ser usados para manipular o comportamento da navegação Up e construir a pilha traseira:

  • OnNavigateUp – Ao substituir este método é possível executar uma ação personalizada quando o botão Para cima é pressionado.
  • NavigateUpTo – Chamar esse método fará com que o aplicativo navegue da atividade atual para a atividade especificada por uma determinada intenção.
  • ParentActivityIntent – Isso é usado para obter uma Intenção que iniciará a atividade pai da atividade atual.
  • ShouldUpRecreateTask – Este método é usado para consultar se a pilha traseira sintética deve ser criada para navegar até uma atividade pai. Retorna true se a pilha sintética deve ser criada.
  • FinishAffinity – Chamar este método irá terminar a atividade atual e todas as atividades abaixo dela na tarefa atual que têm a mesma afinidade de tarefa.
  • OnCreateNavigateUpTaskStack – Este método é substituído quando é necessário ter controle completo sobre como a pilha sintética é criada.

Câmera

Há uma nova interface, Camera.IAutoFocusMoveCallback, que pode ser usada para detectar quando o foco automático começou ou parou de se mover. Um exemplo dessa nova interface pode ser visto no trecho a seguir:

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.
        }
    }
}

A nova classe MediaActionSound fornece um conjunto de APIs para produzir sons para as várias ações de mídia. Existem várias ações que podem ocorrer com uma câmera, estas são definidas pelo enum Android.Media.MediaActionSoundType:

  • MediaActionSoundType.FocusComplete – Este som que é tocado quando o foco foi concluído.
  • MediaActionSoundType.ShutterClick – Este som será reproduzido quando uma imagem estática for tirada.
  • MediaActionSoundType.StartVideoRecording – Este som é usado para indicar o início da gravação de vídeo.
  • MediaActionSoundType.StopVideoRecording – Este som será reproduzido para indicar o final da gravação de vídeo.

Um exemplo de como usar a MediaActionSound classe pode ser visto no trecho a seguir:

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();

Conectividade

Beam do Android

O Android Beam é uma tecnologia baseada em NFC que permite que dois dispositivos Android se comuniquem entre si. Android 4.1 fornece melhor suporte para a transferência de arquivos grandes. Ao usar o novo método NfcAdapter.SetBeamPushUris() , o Android alternará entre mecanismos de transporte alternativos (como Bluetooth) para alcançar uma velocidade de transferência rápida.

Descoberta de serviços de rede

O Android 4.1 contém novas APIs para descoberta de serviço baseado em DNS de multicast. Isso permite que um aplicativo detecte e se conecte por Wi-Fi a outros dispositivos, como impressoras, câmeras e dispositivos de mídia. Essas novas APIs estão no Android.Net.Nsd pacote.

Para criar um serviço que pode ser consumido por outros serviços, a NsdServiceInfo classe é usada para criar um objeto que definirá as propriedades de um serviço. Esse objeto é então fornecido junto NsdManager.RegisterService() com uma implementação do NsdManager.ResolveListener. As implementações de NsdManager.ResolveListener são usadas para notificar de um registro bem-sucedido e para cancelar o registro do serviço.

Para descobrir serviços na rede, e implementação de Nsd.DiscoveryListener passado para NsdManager.discoverServices().

Uso de Rede

Um novo método, ConnectivityManager.IsActiveNetworkMetered permite que um dispositivo verifique se ele está conectado a uma rede limitada. Esse método pode ser usado para ajudar a gerenciar o uso de dados, informando com precisão aos usuários que pode haver cobranças caras por operações de dados.

Descoberta de serviço WiFi Direct

A WifiP2pManager classe foi introduzida no Android 4.0 para suportar zeroconf. Zeroconf (rede de configuração zero) é um conjunto de técnicas que permite que dispositivos (computadores, impressoras, telefones) se conectem a redes automaticamente, com a intervenção de operadores de rede humanos ou servidores de configuração especial.

Em Jelly Bean, WifiP2pManager pode descobrir dispositivos próximos usando Bonjour ou Upnp. Bonjour é a implementação do zeroconf pela Apple. Upnp é um conjunto de protocolos de rede que também suporta zeroconf. Os seguintes métodos adicionados ao para oferecer suporte à WiFiP2pManager descoberta de serviço Wi-Fi:

  • AddLocalService() – Este método é usado para anunciar um aplicativo como um serviço via Wi-Fi para descoberta por pares.
  • AddServiceRequest( ) – Esse método é enviar uma solicitação de descoberta de serviço para a estrutura. Ele é usado para inicializar a descoberta do serviço Wi-Fi.
  • SetDnsSdResponseListeners() – Este método é usado para registrar retornos de chamada a serem invocados ao receber uma resposta a solicitações de descoberta do Bonjour.
  • SetUpnpServiceResponseListener() – Este método é usado para registrar retornos de chamada a serem invocados ao receber uma resposta a solicitações de descoberta Upnp.

Provedores de conteúdo

A ContentResolver turma recebeu um novo método, AcquireUnstableContentProvider. Esse método permite que um aplicativo adquira um provedor de conteúdo "instável". Normalmente, quando um aplicativo adquire um provedor de conteúdo e esse provedor de conteúdo falha, o aplicativo também o será. Com essa chamada de método, um aplicativo não falhará se o provedor de conteúdo falhar. Em vez disso, Android.OS.DeadObjectionException será lançado de chamadas no provedor de conteúdo para informar a um aplicativo que o provedor de conteúdo desapareceu. Um provedor de conteúdo "instável" é útil ao interagir com provedores de conteúdo de outros aplicativos – é menos provável que o código com bugs de outro aplicativo afete outro aplicativo.

Copiar e colar com intenções

A Intent classe agora pode ter um ClipData objeto associado a ela por meio da Intent.ClipData propriedade. Esse método permite que dados extras da área de transferência sejam transmitidos com a intenção. Uma instância de ClipData pode conter um ou mais ClipData.Itemarquivos . ClipData.Item's são itens dos seguintes tipos:

  • Texto – Esta é qualquer cadeia de caracteres de texto, HTML ou qualquer cadeia de caracteres cujo formato é suportado pelas extensões de estilo Android integradas.
  • Intenção – Qualquer Intent objeto.
  • Uri – Pode ser qualquer URI, como um indicador HTTP ou o URI para um provedor de conteúdo.

Serviços Isolados

Um serviço isolado é um serviço que é executado sob seu próprio processo especial e não tem permissões próprias. A única comunicação com o serviço é ao iniciar o serviço e vinculá-lo por meio da API do serviço. É possível declarar um serviço como isolado definindo a propriedade IsolatedProcess="true" no que adorna uma ServiceAttribute classe de serviço.

Mídia

A nova Android.Media.MediaCodec classe fornece uma API para codecs de mídia de baixo nível. Os aplicativos podem consultar o sistema para descobrir quais codecs de baixo nível estão disponíveis no dispositivo.

As novas Android.Media.Audiofx.AudioEffect subclasses foram adicionadas para oferecer suporte ao pré-processamento de áudio adicional no áudio capturado:

  • Android.Media.Audiofx.AcousticEchoCanceler – Esta classe é usada para pré-processamento de áudio para remover o sinal de uma parte remota de um sinal de áudio capturado. Por exemplo, removendo o eco de um aplicativo de comunicação de voz.
  • Android.Media.Audiofx.AutomaticGainControl – Esta classe é usada para normalizar o sinal capturado, aumentando ou diminuindo um sinal de entrada para que o sinal de saída seja constante.
  • Android.Media.Audiofx.NoiseSuppressor – Esta classe irá remover o ruído de fundo do sinal capturado.

Nem todos os dispositivos suportarão esses efeitos. O método AudioEffect.IsAvailable deve ser chamado por um aplicativo para ver se o efeito de áudio em questão é suportado no dispositivo que executa o aplicativo.

A MediaPlayer classe agora oferece suporte à reprodução sem lacunas com o SetNextMediaPlayer() método. Esse novo método especifica o próximo MediaPlayer a ser iniciado quando o media player atual terminar sua reprodução.

As novas classes a seguir fornecem mecanismos padrão e interface do usuário para selecionar onde a mídia será reproduzida:

  • MediaRouter – Esta classe permite que os aplicativos controlem o roteamento de canais de mídia de um dispositivo para alto-falantes externos ou outros dispositivos.
  • MediaRouterActionProvider e MediaRouteButton – Essas classes ajudam a fornecer uma interface do usuário consistente para selecionar e reproduzir mídia.

Notificações

O Android 4.1 permite aos aplicativos mais flexibilidade e controle com a exibição de notificações. Os aplicativos agora podem mostrar notificações maiores e melhores aos usuários. Um novo método, NotificationBuilder.SetStyle() permite que um dos três novos estilos sejam definidos nas notificações:

  • Notification.BigPictureStyle – Esta é uma classe auxiliar que irá gerar notificações que terão uma imagem neles. A imagem a seguir mostra um exemplo de notificação com uma imagem grande:

Captura de tela de exemplo de uma notificação BigPictureStyle

  • Notification.BigTextStyle – Esta é uma classe auxiliar que irá gerar notificações que terão várias linhas de texto, como e-mail. Um exemplo desse novo estilo de notificação pode ser visto na captura de tela a seguir:

Captura de tela de exemplo de uma notificação BigTextStyle

  • Notification.InboxStyle – Esta é uma classe auxiliar que irá gerar notificações que contêm uma lista de cadeias de caracteres, como trechos de uma mensagem de email, como mostrado nesta captura de tela:

Captura de tela de exemplo de uma notificação Notification.InboxStyle

É possível adicionar até dois botões de ação na parte inferior de uma mensagem de notificação quando a notificação estiver usando o estilo normal ou maior. Um exemplo disso pode ser visto na captura de tela a seguir, onde os botões de ação são visíveis na parte inferior da notificação:

Captura de tela de exemplo dos botões de ação exibidos abaixo de uma mensagem de notificação

A Notification classe recebeu novas constantes que permitem que um desenvolvedor especifique um dos cinco níveis de prioridade para uma notificação. Eles podem ser definidos em uma notificação usando a Priority propriedade.

Permissões

As seguintes novas permissões foram adicionadas:

  • READ_EXTERNAL_STORAGE - O aplicativo requer acesso somente leitura ao armazenamento externo. Atualmente, todos os aplicativos têm acesso de leitura por padrão, mas versões futuras do Android exigirão que os aplicativos solicitem explicitamente acesso de leitura.
  • READ_USER_DICTIONARY - Permite um acesso de leitura ao dicionário de palavras do usuário.
  • READ_CALL_LOG - Permite que um aplicativo obtenha informações sobre chamadas recebidas e realizadas através da leitura do registro de chamadas.
  • WRITE_CALL_LOG - Permite que um aplicativo escreva no registro de chamadas no telefone.
  • WRITE_USER_DICTIONARY - Permite que um aplicativo escreva no dicionário de palavras do usuário.

Uma mudança importante a ser observada READ_EXTERNAL_STORAGE – atualmente essa permissão é concedida automaticamente pelo Android. Versões futuras do Android exigirão um aplicativo para solicitar essa permissão antes de conceder a permissão.

Resumo

Este artigo apresentou algumas das novas APIs que estão disponíveis no Android 4.1 (API Nível 16). Ele destacou algumas das mudanças para animações e animar o lançamento de uma atividade, e introduziu as novas APIs para descoberta de rede de outros dispositivos usando protocolos como Bonjour ou UPnP. Outras mudanças na API também foram destacadas, como a capacidade de cortar e colar dados por meio de intenções, a capacidade de usar serviços isolados ou provedores de conteúdo "instáveis".

Este artigo, em seguida, passou a introduzir as atualizações para notificações, e discutiu algumas das novas permissões que foram introduzidas com o Android 4.1