de constantes são:
ACTION_CALL - indica que uma chamada telefônica deve ser realizada.
ACTION_VIEW - indica que algum dado deve ser exibido para o usuário.
ACTION_EDIT - indica que se deseja editar alguma informação.
ACTION_SENDTO - indica que se deseja enviar alguma informação.
Enquanto a Intent declara o que deve ser feito, o componente que a recebe é o responsável por definir como a ação será executada. Ou seja, para uma mesma ação, podemos ter comportamentos distintos quando ela for executada por diferentes componentes. Um exemplo disso é a ACTION_VIEW, que pode ser utilizada tanto para indicar que desejamos abrir uma página da Internet quanto para abrir informa-
ções de um contato armazenado no telefone.
Dados
Os dados de uma
Intent são representados através de uma
Uri e a
partir dela, a aplicação decide o que deve ser feito.
No primeiro exemplo de
uso de
intents criamos uma
Uri para a página que gostaríamos de visi-
tar. Outro exemplo seria criar uma Intent informando uma Uri com valor
content://contacts/people/, que abriria os contatos do telefone:
Uri uri = Uri.parse("content://contacts/people/");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
Informações extras
As informações extras são quaisquer outros dados necessários para que o componente execute a ação apropriadamente. Eles podem ser informados através dos extras da Intent.
38
Casa do Código
Capítulo 2. Entenda o funcionamento do Android
No exemplo anterior, passamos uma Uri como extra para informar o local onde
a foto deveria ser armazenada. Além disso, podemos também informar outros tipos de dados como strings, tipos primitivos, arrays e objetos serializáveis. Para incluir um dado como extra, utilizamos o método putExtra da classe Intent,
fornecendo uma string como identificador do dado e o seu respectivo valor. Re-lembre com o código abaixo, no qual o MediaStore.EXTRA_OUTPUT é o identifi-
cador da informação e a uri é o extra:
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
Categoria
A categoria, representada apenas por uma string, serve como informação adicional para auxiliar o Android na escolha de qual componente é o mais adequado para receber a Intent. Podemos adicionar várias categorias a uma Intent através do método addCategory. Assim como as ações, existem várias categorias prede-finidas, como a Intent.CATEGORY_APP_MUSIC, que, quando colocada em uma
Intent, informará ao Android que uma Activity capaz de reproduzir músicas
deve ser acionada.
2.3
Como as intents são resolvidas
As informações contidas nas Intents são utilizadas pelo Android para localizar o componente adequado, geralmente uma activity, para executar a ação desejada. Quando o nome de componente é informado, o Android inicializa exatamente aquele componente, sem necessidade de avaliar a ação ou categoria.
Por outro lado, quando o nome não é informado, é necessário consultar quais
são os componentes existentes com a habilidade de executar a ação desejada e que pertencem às categorias existentes na Intent. Adicionalmente, o Android também pode procurar por componentes capazes de resolver a Uri repassada e também de lidar com o formato dos dados, o MIME type, informado.
A pergunta que deve estar latente é: como o Android sabe ou encontra a
Activity que deve ser iniciada, apenas informando esses dados na Intent? A
resposta é que não existe mágica e em algum lugar deve estar especificado que determinadas ações podem ser resolvidas por um dado componente.
A definição de quais ações um componente está apto a responder, bem como a
quais categorias ele pertence e também quais dados ele sabe tratar, é realizada através de intent filters que são configurados no arquivo AndroidManifest.xml.
39
2.4. Construção da nossa primeira Intent
Casa do Código
No nosso primeiro exemplo já existe a declaração de um intent filter no
AndroidManifest.xml para a Activity principal da nossa aplicação:
...
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
...
Este intent filter indica que a atividade MainActivity é aquela que deve
ser iniciada ao abrir a aplicação e que também deve ser listada como uma aplicação do Android que pode ser utilizada por um usuário. Os intent filters podem
ainda declarar, além da ação e da categoria, os tipos de dados com os quais o componente é capaz de lidar, como uma imagem por exemplo:
<data android:mimeType="image/*" />
Com base nestas três informações ( action, category e data), o Android
é capaz de selecionar qual é o componente mais adequado para responder a uma
Intent implícita, comparando o que foi passado na Intent com aquilo que está
declarado nos intent filters dos aplicativos. Nossas aplicações podem definir intent filters com ações e categorias próprias ou fazer uso das já existentes para expor funcionalidades para as demais aplicações.