Intent Filters

Os Intent Filters são a maneira que um componente tem de dizer ao Android quais são os Intents que ele é capaz de responder. Esses filtros definem quais os valores que o Android deve testar quando está procurando um componente para entregar um Intent implícito que tenha sido lançado por algum outro componente. É importante lembrar que os Intent Filters são apenas responsáveis por filtrar Intents que não tenham um alvo definido, ou seja, Intents que não sejam explícitos. Caso um Intent seja destinado a um componente específico, explicitado no campo component, o Intent será entregue a esse componente, não importa o que esteja definido nos filtros dele.

No caso de um Intent não ter um destino certo, os Intent Filters são a maneira que um componente de um aplicativo tem de informar ao sistema quais os tipos de ações ele é capaz de tratar. Um componente pode ter diversos filtros, indicando as suas diversas funções, ou até mesmo nenhum filtro, caso receba apenas Intents explícitos. Esses filtros são normalmente declarados junto à declaração do componente, no AndroidManifest. Através da declaração no XML, fica mais fácil para o Android testar os campos do Intent. A exceção a essa regra acontece quando criamos filtros para um Broadcast Receiver, mas veremos isso mais para o fim do curso, quando formos estudar esses componentes.

Um filtro declarado no AndroidManifest possui campos que se equivalem aos campos de um Intent, que são utilizados para a comparação entre o Intent e seu receptor. Ao declarar um filtro, deve-se declarar um ao mais dos seguintes campos: action, category e data. Um Intent Implícito, que vai ser testado contra esse componente, deve passar em todos os testes para ser entregue. Se pelo menos um dos filtros falhar, no caso do componente utilizar mais de um filtro, o componente não será considerado capaz de responder a esse Intent e será descartado. Vejamos agora, em detalhes, como funciona o teste de cada um desses campos dos filtros:

  • Action: Nesse primeiro teste, o importante é testar se a action descrita pelo Intent está entre as actions listadas pelo componente. Mesmo que um Intent tenha apenas uma action, um componente pode ter mais de uma action na sua lista de filtros, sendo capaz de responder a qualquer uma delas. Caso dentre essas actions listadas encontre-se a que o Intent procura, o componente passa nesse teste. Caso contrário, o componente é descartado imediatamente. Perceba que um componente que não tenha nenhuma action declarada entre seus filtros não irá receber Intents implícitos nunca, pois sempre falhará nesse teste. Até mesmo quando o Intent não declarar uma action, um componente sem filtros para esse campo será rejeitado como possível responsável.
  • Data: No teste de data, o tipo dos dados que está sendo requerido no Intent é testado contra o tipo aceitável declarado no componente. Esse teste é realizado da mesma maneira que o anterior, necessitando o casamento de pelo menos um dos elementos, declarados pelo componente, com o elemento passado pelo Intent.
  • Category: Nesse teste, a categoria que o Intent está requerendo é comparada à categoria que o componente é capaz de responder. Para um Intent ser bem sucedido num teste da category, o componente deve declarar todas as categorias pedidas pelo Intent. Se pelo menos uma não passar no teste, o Intent é rejeitado pelo componente. Caso o Intent não tenha nenhuma categoria, ele deveria passar nesse teste, porém, por restrição do Android, o filtro deve incluir a categoria android.intent.category.DEFAULT para ser capaz de receber Intents implícitos.

Agora que já vimos exemplos de todos os filtros que podem ser utilizados, vejamos, na Listagem 2, um trecho do código de um dos exemplos do Android, que demonstra alguns desses filtros implementados.

Listagem 2 - Trecho do AndroidManifest.xml do sample NotePad.

Nesse código, vemos uma Activity com três Intent Filters diferentes declarados para ela. Isso indica que essa Activity pode servir a mais de um propósito e é capaz de responder a mais de um tipo de chamado dos Intents. O primeiro Intent Filter declara que essa é a Activity principal da aplicação e que deve ser demonstrada no Launcher. Essa é outra função que os Intent Filters têm em uma aplicação. O Android, para montar a tela inicial de uma aplicação corretamente, utiliza-se de Intent Filters para descobrir qual Activity deve ser mostrada ao inicializar um aplicativo. Para entender o significado exato de cada constante utilizada nos campos dos filtros, consulte a referência ao Android Developers.

Agora que entendemos bem como funcionam os Intents, que são os principais responsáveis pela comunicação entre componentes diversos, vamos estudar um pouco como funciona essa comunicação entre Activities.

Versão 5.3 - Todos os Direitos reservados