Comunicação entre Apps Android com Intents

Comunicação entre Apps Android com Intents
Alex Felipe
Alex Felipe

Compartilhe

No post anterior, havíamos criado uma lista de cursos e por fim, fizemos com que a lista fosse uma lista personalizada, e o resultado foi o seguinte:

tela-lista-personalizada2

Porém, seria bem interessante se ao tocarmos em um item da lista, nesse caso um curso, abri-se a página da Alura com as informações do curso que eu fiz. Mas como podemos fazer isso? Bom, primeiro precisamos fazer com que cada curso saiba qual é a sua URL, então vamos adicionar o atributo que representará a URL na classe Curso:


public class Curso {

private String nome; 
private String descricao;
private EstadoAtual estado;
private Categoria categoria;
private String url;

//métodos

}
Banner da promoção da black friday, com os dizeres: A Black Friday Alura está chegando. Faça parte da Lista VIP, receba o maior desconto do ano em primeira mão e garanta bônus exclusivos. Quero ser VIP

Ótimo, agora basta apenas fazer a ação que, ao tocarmos em um item da lista, abra o navegador com a URL do curso da Alura. E como fazemos para reconhecer um toque em alguma View do Android? Utilizamos listeners! Então vamos implementar um listener para a ListView:


public class ListaDeCursosActivity extends AppCompatActivity {

@Override protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); //código

ListView listaDeCursos = (ListView) findViewById(R.id.lista);

listaDeCursos.setOnClickListener();

}

//métodos

}

Observe que estamos implementando um click listener na ListView, ou seja, esse listener está escutando apenas a lista. Dessa forma, não conseguimos identificar o item que tocamos, e não é isso que queremos! Para resolver esse detalhe precisamos utilizar um listener que reconhece cada item da ListView que é setOnItemClickListener():


listaDeCursos.setOnClickListener();

Agora precisamos fazer a implementação desse listener a partir da interface AdapterView.OnItemClickListener:


listaDeCursos.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {}

});

Para pegarmos um item da lista, nesse caso um curso, podemos utilizar o parâmetro parent, e então, chamarmos o método getItemAtPosition() passando o parâmetro position que é justamente a posição que se encontra o curso tocado!


listaDeCursos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
     @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        Curso curso = (Curso) parent.getItemAtPosition(position); 
        Log.i("Curso clicado", curso.getNome());
        Log.i("posição do curso", String.valueOf(position));
        } });

Vamos testar a nossa App e verificar se está funcionando:

 I/Curso clicado: Java I/posição do curso: 0 I/Curso clicado: HTML e CSS I/posição do curso: 1 I/Curso clicado: Android I/posição do curso: 2

Funcionando conforme o esperado! Então agora só falta implementarmos a ação para que abra o navegador com a url do curso. Mas como podemos fazer isso? No Android, todas as vezes que queremos nos comunicar com alguma App externa, nesse caso o navegador, precisamos utilizar a classe [Intent](http://developer.android.com/intl/pt-br/reference/android/content/Intent.html):


Intent intent = new Intent();

Porém, precisamos falar qual é a nossa intenção ao chamar a Intent, nesse caso, queremos fazer com que alguém, que saiba lidar com URL do site do curso, seja chamado pelo Android e resolva essa URL para nós.

Para indicarmos essa intenção, utilizamos as categorias da própria classe Intent que são constantes que permite verificar se alguma App instalada no dispositivo atende à categoria especificada, nesse caso usaremos a constante ACTION_VIEW da própria Intent:


Intent intent = new Intent(Intent.ACTION_VIEW);

Mas perceba que ainda não passamos a URL que precisa ser tratada, e como faremos isso? Simples! Basta apenas utilizar o método estático parse da classe Uri enviando a URL do curso, e então, mandamos como segundo parâmetro da instância da Intent:


Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(curso.getUrl()));

Por fim, pedimos para que uma Activity que saiba resolver essa nossa intenção (Intent) seja iniciada com o método startActivity():


listaDeCursos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
     @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
         Curso curso = (Curso) parent.getItemAtPosition(position);
         Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(curso.getUrl())); startActivity(intent); 
         }
    });

Testando a nossa App, ao clicar no curso de Java que contém a URL: https://www.alura.com.br/curso-online-primeiros-passos-com-java, temos o seguinte resultado:

lista-de-apps

Perceba que ele lista todas as Apps que resolvem essa URL, pois utilizamos a categoria ACTION_VIEW que é uma categoria genérica que chama qualquer tipo de App que saiba lidar com a intenção que estamos enviando, nesse caso, foi uma URL com o protocolo HTTP.

Escolhendo uma das Apps sugeridas, nesse caso o Google Chrome, podemos verificar o resultado para essa Intent:

abrindo-pagina

Excelente! Agora eu posso verificar o conteúdo do curso que eu fiz apenas com um único toque!

Vimos que, quando precisamos nos comunicar com outras Apps do Android, podemos utilizar a classe Intent que nos permite utilizar uma categoria e a informação que queremos que seja resolvida, nesse caso, utilizamos a categoria ACTION_VIEW que é uma categoria mais genérica que vai chamar todas as Apps capazes de resolver a URL que enviamos por meio da classe Uri.

E aí, o que achou da forma que nos comunicamos com outras Apps no Android? Quer aprender mais sobre Android? Que tal dar uma olhada nos nossos cursos de Android na Alura? Além de Intents, são abordados diversos assuntos para que você crie sua própria App Android!

Alex Felipe
Alex Felipe

Alex é instrutor e desenvolvedor e possui experiência em Java, Kotlin, Android. Atualmente cria conteúdo no canal https://www.youtube.com/@AlexFelipeDev.

Veja outros artigos sobre Mobile