apresentadas pelo Android que correspondem às aplicações que são capazes de tratar a intenção informada pelo usuário. Neste exemplo, desejou-se compartilhar um texto selecionado.
Figura 2.2: Aplicações que podem responder à intenção de compartilhar
35
2.2. Conheça as Intents e Intent Filters
Casa do Código
Este é um recurso-chave no Android pois é através dele que podemos fazer com
que as aplicações colaborem entre si, disponibilizando funcionalidades que podem ser reutilizadas, sem a necessidade de importar códigos ou dependências para dentro da sua aplicação. Através de Intents é possível iniciar novas activities, como fazer uma busca e selecionar um contato do telefone, abrir a aplicação de mapas com as coordenadas de localização do GPS, abrir uma página da web, tirar fotos utilizando a câmera etc., apenas reaproveitando funcionalidades já existentes, disponibilizadas pelos aplicativos instalados
no aparelho.
Além disso, aplicativos de terceiros, assim como os nossos, podem disponibilizar novas funcionalidades acessíveis via Intents. Existem, por exemplo, aplicativos de leitura de códigos de barra que podem ser chamados pela sua aplicação para lê-los utilizando a câmera do aparelho e devolver o resultado para ser processado por um método da sua aplicação. Podemos criar e utilizar as Intents de diversas maneiras e a seguir veremos alguns exemplos. O trecho de código abaixo mostra como abrir uma página utilizando o navegador que acompanha o Android:
Uri uri = Uri.parse("http://www.android.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
Uma Uri foi criada a partir de uma string representando a URL que deseja-
mos visitar. Em seguida, instanciamos uma nova Intent informando a ação que
gostaríamos de executar ( Intent.ACTION_VIEW), juntamente com a Uri criada,
e chamamos o método startActivity da classe Activity passando a intent.
Repare que não indicamos exatamente a activity que deve ser iniciada para
abrir o site desejado. Neste caso, a nossa Intent é classificada como implícita.
Com base na ação Intent.ACTION_VIEW e o no conteúdo da Uri da Intent,
o Android decide qual é atividade mais adequada para resolver a URL informada.
Neste caso o escolhido é o navegador.
A seguir, temos um exemplo de como iniciar uma nova atividade existente na
nossa aplicação, passando no construtor da Intent a classe correspondente à atividade que deve ser iniciada.
Intent intent = new Intent(this, OutraAtividade.class);
startActivity(intent);
Diferentemente do exemplo anterior, agora nós informamos exatamente qual ati-
vidade deve ser iniciada, ou seja, agora nossa Intent é explícita. Geralmente as 36
Casa do Código
Capítulo 2. Entenda o funcionamento do Android
Intents explícitas são utilizadas apenas para interação entre componentes de uma mesma aplicação, já que é necessário conhecer o componente que deverá ser ativado, enquanto as implícitas são usadas para ativar componentes de outra aplicação, fornecendo informações adicionais, como a ação e Uri, para que o Android localize o componente adequado.
Outra característica importante é que podemos colocar informações extras na
Intent que serão utilizadas posteriormente pelo componente iniciado por ela. Para exemplificar, considere que a nossa aplicação deve tirar uma foto e armazená-la em uma pasta específica.
O Android já possui um aplicativo que realiza esta tarefa, e o que queremos é chamá-lo a partir da nossa aplicação para capturar a imagem e salvá-la em um local determinado. O código abaixo inicia a Activity de câmera do aparelho, informando o local e nome desejado para o armazenamento da imagem capturada:
/*
O exemplo considera que existe a pasta LivroDeAndroid
e que o aplicativo tem permissão de escrita.
*/
Uri uri = Uri.fromFile(
new File("/sdcard/LivroDeAndroid/hello_camera.jpg"));
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivity(intent);
Esse exemplo também utiliza Intents implícitas, pois em nenhum momento
foi indicado qual a classe de Intent deveria ser utilizada. Em resumo, uma Intent é o conjunto de informações necessárias para ativar um componente de uma aplicação. É composta basicamente de 5 informações.
Nome do Componente
O nome do componente é definido pelo nome completo da classe e o nome do pacote definido no AndroidManifest.xml que representam o componente que
deve ser o encarregado de tratar a Intent.
Quando criamos uma Intent explícita com o construtor Intent(this,
OutraAtividade.class), o nome do componente é criado automaticamente.
37
2.2. Conheça as Intents e Intent Filters
Casa do Código
No entanto, também é possível defini-lo de forma programática, utilizando os métodos setComponent(), setClass() ou setClassName() da classe Intent.
Ação
A ação é uma string que define o que deve ser realizado. Existem diversas ações genéricas no Android, disponibilizadas como constantes na classe Intent.
Alguns exemplos