Comunicação entre Apps Android com Intents

(Last Updated On: 20 de Janeiro de 2017)

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

}

Ó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:

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!

FIQUE POR DENTRO

Content Editor at Alura and Software Developer

  • Rodrigo Ribeiro

    Bom post. O Alura tem excelentes cursos mas a trilha Android precisa ser atualizada, alguns assuntos que estão em alta hoje como Material Design, Firebase, Dagger 2, Kotlin e etc precisam ser abordados na plataforma.

    • Alex Felipe

      Oi Rodrigo, tudo bem? Obrigado pelo comentário e feedback! Eu estarei encaminhando para a equipe sua sugestão.

      Aproveitando o seu comentário, temos esse link para sugestões de curso https://feedback.userreport.com/4e3d097b-e7e6-4369-bf1c-a979ae30e570/#ideas/popular, ou seja, você pode sugerir cursos a vontade! 🙂

      Um outro ponto bem bacana é que criamos novos cursos o tempo todo! No mês passado, por exemplo, foram 11.

      Abraços.

      • Rodrigo Ribeiro

        Oi Alex Felipe, Tudo bem? Obrigado, irei enviar minhas sugestões pelo link informado. O Alura é uma excelente plataforma, ja experimentei outras mas ainda não vi nenhuma que chegue perto da quantidade e qualidade dos cursos de vocês. Apenas senti falta mesmo desses cursos na trilha Android, por isso sugeri esses tópicos.

        Abraços.

Próximo ArtigoO exemplo da 7COMm e como a Alura pode ajudar sua empresa