Você já deve ter tido problemas na hora de usar as Intents no Android, não é mesmo? Isso acontece porque talvez você ainda não tenha entendido como elas realmente funcionam e qual o momento para usa-las.

As Intents permitem que você interaja com componentes do mesmo aplicativo, bem como com componentes contribuídos por outras aplicações. Por exemplo, uma Activity pode iniciar uma Activity externa para tirar uma foto.

Então, continue lendo este artigo para entender de verdade como funcionam as Intents e para não passar sufoco na hora de usal-as:

Visão geral das Intents

As Intents são mensagens assíncronas que permitem que os componentes de um aplicativo solicitem a funcionalidade de outros componentes do Android.

Uma Intent pode conter dados dentro dela através de um Bundle. Estes dados podem ser utilizados pelo componente que está recebendo a Intent.

No Android, a reutilização de outros componentes de um aplicativo é um conceito conhecido como tarefa. Um aplicativo pode acessar outros componentes do Android para realizar uma tarefa.

Por exemplo, a partir de um componente do seu aplicativo, você pode acionar outro componente no sistema Android, que gerencia fotos, mesmo que esse componente não faça parte do seu aplicativo. Neste componente você seleciona uma foto e retorna ao aplicativo para usar a foto selecionada.

Veja o fluxo de chamada de Activities na imagem abaixo.

A estrutura de criação de uma Intent é muito simples e pode ser dividida da seguinte forma simplificada.

  • Nome do componente: Activity2.class
  • Ação: ACTION_SEND e ACTION_VIEW
  • Categoria: CATEGORY_BROWSABLE
  • Dados: www.androidpro.com.br
  • Extras

Exemplo em código Java.

// Exemplo 1
Intent intentE = new Intent(this, Activity2.class);
startActivity(i);

// Exemplo 2
Intent intentMessage = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "Olá, tudo bem?");
sendIntent.setType("text/plain");

Após criamos as Intents, precisamos inicia-las a partir da origem. Para isso, vamos utilizar um método do Context que todas as Activities estendem, o startActivity(intent).

Intent intentE = new Intent(this, Activity2.class);
startActivity(intentE);

Nos próximos tópicos vamos entrar mais em detalhes sobre os dois exemplos acima e ver qual a diferença entre eles.

Intents Explícitas

As Intents explícitas definem explicitamente o componente que deve ser chamado pelo sistema Android, usando a classe Java como identificador. As Intents explícitas são normalmente usadas dentro do próprio aplicativo, uma vez que as classes em um aplicativo são controladas pelo desenvolvedor do mesmo.

O seguinte exemplo mostra como criar uma Intent explícita e enviá-la para o sistema Android para iniciar uma Activity.

Intent intentExplicita = new Intent(this, Activity2.class);
startActivity(intentExplicita);

O fluxo de uma Intent explícita ficaria da seguinte forma como a imagem abaixo.

No momento de criar a Intent nós devemos passar basicamente dois parâmetros, o Context (origem) e a o recurso de destino. O recurso de destino pode ser tanto uma Activity quanto um Service.

Para iniciar um Service utilizando a Intent, basta seguir o exemplo anterior e utilizar o método startService(intent) para lançar a Intent.

Intent intentService = new Intent(this, Service1.class);
startService(intentService);

Intents Implícitas

As Intents implícitas especificam a ação que deve ser realizada e, opcionalmente, os dados que fornecem o conteúdo para a ação.

Se uma Intent implícita for enviada para o sistema Android, ele irá procurar por todos os componentes registrados para a ação específica e o tipo de dados enviado.

Se apenas um componente for encontrado, o Android inicia este componente diretamente. Se vários componentes forem identificados pelo Android, o usuário receberá uma caixa de diálogo de seleção e poderá decidir qual componente deve ser usado.

No exemplo abaixo, criamos a Intent e indicamos qual o tipo da ação (ACTION_VIEW) e passamos os dados que queremos enviar (URL).

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.androidpro.com.br"));

// Verifica se existem aplicativos que atendem essa Intent no Android
if (i.resolveActivity(getPackageManager()) != null) {
    startActivity(i);
}

O exemplo acima indica ao sistema Android para exibir uma página da Web.

Todos os navegadores de internet instalados no Android e que aceitam receber uma URL para exibi-la, irão aparecer como opção para o usuário.

Outro exemplo muito comum é a utilização das Intents para compartilhar conteúdos com outros aplicativos, como redes sociais.

Intent shareIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "Texto ou URL a ser compartilhada");
sendIntent.setType("text/plain");
startActivity(shareIntent);

Dessa forma, o sistema Android vai exibir para o usuário todos os aplicativos que aceitam receber um texto como conteúdo.

O que são os Intent Filters

Nós vimos que as Intents são usadas para sinalizar para o sistema Android que um determinado evento ocorreu. Muitas vezes, é passada a ação que deve ser realizada e os dados sobre os quais tal ação deve ser feita.

Por exemplo, seu aplicativo pode iniciar um componente do navegador para uma determinada URL por meio de uma Intent como vimos anteriormente.

Mas como o Android identifica os componentes que aceitam uma determinada Intent?

Um componente pode se registrar por meio de um Intent Filter para uma ação específica e dados específicos. Um Intent Filter especifica os tipos de Intents às quais uma Activity, Service ou Broadcast Receiver podem responder.

Você pode registrar seus componentes do Android por meio de Intent Filters para determinados eventos. Se um componente não define um, ele só pode ser chamado por Intents explícitas.

Veja um exemplo para registrar um componente para uma Intent. O segredo aqui é definir a ação correta, mime-type e especificar os metadados corretos.

Declarando uma Activity que recebe um texto para ser compartilhado:

<activity android:name=".CompartilhaActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

Declarando uma Activity que recebe uma URL para ser exibida:

<activity android:name=".BrowserActivitiy">
  <intent-filter>
     <action android:name="android.intent.action.VIEW" />
     <category android:name="android.intent.category.DEFAULT" />
     <data android:scheme="http"/>
  </intent-filter>
</activity>

Se um componente não definir um Intent Filter, ele só pode ser chamado por utilizando Intents explícitas.

Existem algumas Intent Filters que são muito comuns no desenvolvimento Android, você pode ver uma lista delas clicando aqui.

Trocando dados entre Activities

Como vimos, uma Intent contém certos dados de configuração, por exemplo, a ação desejada, o tipo, etc. Opcionalmente, uma Intent também pode conter dados adicionais com base em uma instância da classe Bundle que pode ser recuperada da Intent através do método getExtras().

Você também pode adicionar dados diretamente ao Bundle da Intent através dos métodos putExtra() da própria Intent. Os extras são compostos de chave/valor. A chave é sempre do tipo String. O valor você pode usar os tipos de dados primitivos (int, float, …) e objetos do tipo String, Bundle, Parceable e Serializable.

Esses dados extras podem ser passados entre os componentes de origem e destino, como por exemplo, as Activities.

Para adicionar os dados extras a uma Intent e enviar para outra Activity, faça da seguinte forma conforme exemplo abaixo.

Intent intent = new Intent(Activity1.this,Activity2.class);

Bundle b = new Bundle();
b.putString("umaString", "Olá");
intent.putExtra("stringBundle", b);
intent.putExtra("mensagem", "Mundo");
intent.putExtra("umBoolean", true);
intent.putExtra("umInteiro", 5);

startActivity(intent);

A Activity receptora pode acessar essas informações através dos métodos getAction() e getData() no objeto Intent. Este objeto Intent pode ser recuperado através do método getIntent().

Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("stringBundle");
String umaString = bundle.getString("umaString");
String mensagem = intent.getStringExtra("mensagem");

O componente que recebe a Intent pode usar também a chamada do método getIntent().getExtras() para obter os dados extras.

Agora você já tem conhecimento suficiente para não ter mais problemas com as Intents e muito menos dúvidas. Mas elas fazem parte de muitos outros Conceitos Básicos do desenvolvimento Android. Para saber mais sobre os demais conceitos básicos, assista à minha aula online GRATUITA. Nela você saberá sobre os 4 Elementos Obrigatórios do Desenvolvimento Android e os 5 Passos para Desenvolver seus Aplicativos como Profissional!

Gostou do conteúdo sobre as Intents?

Então compartilhe esse artigo com seus amigos e qualquer dúvida deixe nos comentários aqui em baixo.

Leia também


Fillipe Cordeiro
Fillipe Cordeiro

Engenheiro da computação e desenvolvedor de software a quase 10 anos, com experiência em tecnologias como Java, Python e Android. Agora, quero te ajudar a mergulhar no universo do Desenvolvimento Android.