Nos posts anteriores desta série aprendemos
sobre o conceito de Intent, e as duas principais formas de invocar
uma Activity através de uma Intent. Agora nessa post irei mostrar
para vocês uma outra funcionalidade de uma Intent, que são Objetos
de uma Intent, estas que iram ajudar até a entender melhor o
funcionamento do AndroidManifest.xml e suas Activities.
Objetos
de uma Intent
Uma Intent pode armazenar diversos tipos de
informações, como: uma Action (ação), Data (dados), Category
(categoria) e Extras (informações extras). Estas informações
armazenadas em uma Intent são recebidas pelos componentes do Android
que têm interesse em recebê-las.
Como exemplo, temos uma Intent que solicita ao
Android a realização de uma chamada telefônica. Para que isto seja
possível, esta Intent deve declarar em seu conteúdo o nome da
Action de Telefonia e o número para o qual deseja realizar a
chamada.
Veja no trecho de código abaixo como é
simples realizar esta tarefa no Android:
/** * Declara, no construtor da Intent, a Action que será chamada. * Em nosso caso, a Action de chamadas telefônicas. */ Intent i = new Intent(Intent.ACTION_CALL); /** *Define o conteúdo a ser passado para a Action * de chamadas telefônicas. Em nosso caso, o número * de telefone para o qual desejamos ligar. */ i.setData(Uri.parse("tel:8111-1111")); // Inicia a Action definida na Intent startActivity(i);
No trecho de código acima, a Intent declara
que deseja chamar a Action que responde pelo nome Intent.ACTION_CALL.
Nesta Intent definimos também o dado que queremos passar para esta
Action e, em nosso caso, passamos o número de telefone para o qual
desejamos realizar a chamada. Ao chamar o método startActivity(),
passando a Intent como parâmetro, o Android irá receber a
solicitação e irá chamar a Action que tem o interesse de receber
este tipo de informação, no caso, a Action ACTION_CALL.
Além da Action (como exemplo, a que usamos no
trecho de código acima para chamar a Action de telefonia do Android)
e do Data (como exemplo, o número de telefone que passamos para a
Action de telefonia através do método setData()), existem outros
tipos de objetos que podemos armazenar nas Intents.
Action
Uma Action é uma String passada como parâmetro
para o construtor de uma Intent informando a ação que queremos
executar no Android. Essa String deve ser única em todo o sistema,
portanto, para que não haja conflito entre nomes de Actions
diferentes, é aconselhável o uso da mesma convenção de nomes de
pacotes do Java para nomear uma Action.
Nota
Lembre-se que
no exemplo anterior, onde usamos uma Intent para realizar uma chamada
telefônica para um número, usamos uma Action chamada ACTION_CALL
nativa do Android.
Para uma Action de cadastro de pessoas, por
exemplo, poderíamos usar o seguinte nome:
br.com.empresa.projeto.action.CADASTRO_PESSOA.
O trecho de código abaixo mostra como seria a
chamada para esta Action, no Android:
Intent i = new Intent("br.com.empresa.projeto.action.CADASTRO_PESSOA"); startActivity(i);
Veja, na tabela abaixo, algumas das Actions
nativas do Android.
Constante | Tipo de componente | Ação |
ACTION_CALL | Activity | Inicia o aplicativo de telefonia |
ACTION_EDIT | Activity | Exibe tela para edição de um determinado dado |
ACTION_MAIN
|
Activity | Abre a Activity inicial de um aplicativo |
ACTION_SYNC | Activity | Sincroniza os dados do dispositivo com os dados do servidor |
ACTION_BATTERY_LOW | Broadcast Receiver | Aviso de bateria fraca |
ACTION_HEADSET_PLUG | Broadcast Receiver | Aviso de handset plugado ou desplugado do dispositivo |
ACTION_SCREEN_ON | Broadcast Receiver | Aviso de tela acesa |
A tabela acima mostra apenas algumas das
Actions mapeadas na classe Intent. Existem diversas outras Actions
nativas e você pode ver a lista completa na documentação da classe
Intent, no site do desenvolvedor Android, através do link:
Nota
Uma Action nativa do Android muito importante
que você deve memorizar é a ACTION_MAIN. Esta Action é responsável
por definir a Activity inicial de um aplicativo, ou seja, sempre que
você definir esta Action no Intent Filter de uma Activity ela será
a Activity principal do aplicativo.
Data
O Data é uma informação a mais que podemos
definir na Intent para especificar melhor qual componente será
associado à nossa Intent. No Data podemos definir dois tipos de
informação: URI e data type. Veja novamente o exemplo de uma Intent
que utilizamos anteriormente para realizar uma chamada telefônica:
Intent i = new Intent(Intent.ACTION_CALL); i.setData(Uri.parse("tel:8111-1111")); startActivity(i);
No exemplo, ao declarar a ACTION_CALL para
realizar chamadas telefônicas, usamos justamente uma URI para
informar à esta Action o número de telefone para o qual desejamos
chamar.
A URI é definido na Intent através do método
setData(). No trecho de código acima, usamos a seguinte URI:
"tel:8111-1111"
A URI acima irá pedir para a ACTION_CALL
discar para o número 8111-1111.
Cada Action possui um formato específico de
URI, utilizado para executar ações de acordo com os dados
informados. Um outro exemplo é quando em nosso aplicativo queremos
que, quando o usuário clicar em um botão, o Browser do Android seja
aberto em uma página específica da Web. Para isto existe uma action
chamada ACTION_VIEW que, quando informamos em sua URI o endereço de
um site, o Browser será invocado e direcionado para o endereço do
site informado.
Veja um exemplo no trecho de código abaixo:
Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse("http://www.google.com.br"));
No trecho de código acima informamos para a
ACTION_VIEW a URI “http://www.google.com.br” informando que
desejamos que o Browser abra a página Web do Google.
Perceba que enquanto a Action determina a
ação a ser executada, a URI determina como deve ser feito.
A ACTION_VIEW, por exemplo, pode ser usada para diversos fins,
dependendo da URI recebida, como por exemplo, abrir uma imagem no
aplicativo de visualização de imagens do Android, abrir um arquivo
de áudio do aplicativo de Sons, mostrar os contatos armazenados o
aplicativo de Contatos do Android, etc.
Veja o exemplo de uma URI passada para a
ACTION_VIEW para mostrar os contatos armazenados no Android:
Uri uri = Uri.parse("content://contacts/people/"); Intent i = new Intent(Intent.ACTION_VIEW, uri); startActivity(i);
Além do URI, outra informação que podemos
passar no Data de uma Intent é o Data Type. O Data type especifica o
Mime Type do arquivo definido na URI e é definido através do método
setType() da Intent. Imagine, por exemplo, que através de uma Intent
você queira chamar um componente do Android para abrir um arquivo de
imagem com a extensão .JPG. Para isto, no URI da Intent você pode
especificar o caminho deste arquivo e no Data Type especificar o tipo
deste arquivo para
que o Android decida qual o melhor componente
para abri-lo. Veja o exemplo:
Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse("/caminho/do/arquivo.jpg")); i.setType("image/jpeg");Category
Uma Category (categoria) é uma String que
passamos para a Intent informando qual o componente mais adequado
para executar a ação solicitada pela Intent. O uso da Category é
aconselhável para especificar mais detalhadamente o componente que
melhor atenderia uma determinada solicitação. Veja abaixo o exemplo
da definição de uma Category em uma Intent:
Intent i = new Intent("br.com.nasemanadaprova.projeto.action.CADASTRO_PESSOA"); i.addCategory("br.com.nasemanadaprova.projeto.category.PESSOA_JURIDICA");
No exemplo acima, definimos a Action no construtor da Intent e, logo em seguida, definimos a Category através do método addCategory() da Intent.
Perceba que nossa Intent chama uma Action
responsável pelo cadastro de pessoas, chamada CADASTRO_PESSOA.
Imagine que esta Action abra uma tela com o
formulário para preenchimento dos dados da pessoa que queremos
cadastrar. Para tornar as coisas mais específicas, informamos na
Category que queremos cadastrar uma pessoa jurídica e, desta forma,
podemos ter Activities distintas para cadastro de pessoa física e
jurídica, definindo telas distintas com campos específicos de cada
caso.
Nota
Ao contrário da Action, é possível
especificar mais de uma Category em uma Intent. Para especificar mais
de uma Category, basta chamar novamente o método addCategory()
informando as demais Categories desejadas.
Extras
Extras são informações adicionais que
desejamos transmitir para o componente que irá executar a ação
definida na Intent.
Podemos passar qualquer tipo de Objeto do Java
como informação Extra. Estas informações são definidas em pares
de CHAVE / VALOR. Veja o exemplo:
/** * Define a Action de edição das informações do cadastro * de uma pessoa. */ Intent i = new Intent("br.com.nasemanadaprova.projeto.action.CADASTRO_PESSOA "); /** * Informamos o ID da pessoa cadastrada * que queremos editar suas informações. * Neste caso, estamos informando o ID 10. */ i.putExtra("id", 10L);
No exemplo acima nós definimos na Intent que queremos chamar a Action CADASTRO_PESSOA responsável pela edição das informações do cadastro de uma pessoa. Logo em seguida, através do método putExtras() .
Para ler as informações Extras através do
componente que as recebeu, basta usar o método getExtras() da
Intent. Veja o exemplo no trecho de código abaixo:
Bundle b = getIntent().getExtras(); long id = b.getLong("id");
Você deve ter notado que esse post ficou grande, comparado aos seus anteriores, fiz isso porque os assuntos Action, Data, Category e Extras pertensem ao conteúdo Objetos de uma Intent então para não subdividir esse item resolvi estender um pouco mais o post para que este ficasse completo.
Qualquer sugestão ou duvida pode deixar um
comentário.
0 comentários:
Postar um comentário