Intent e Intent-Filter Android Studio Tutorial

Intent e Intent-Filter



No post desta semana utilizaremos um aplicativo simples para mostrar a funcionalidade das classes Intent e IntentFilter que são o coração do Android, mas antes de irmos para a prática falaremos um pouco de ambas.

Intent

A classe Intent (“intenção em português”) representa uma ação que a aplicação executará, pode-se dizer que a Intent representa a intenção da aplicação de realizar alguma tarefa. Isto é, a mensagem é enviada ao sistema operacional que irá decidir o que fazer em seguida.
Uma intente pode ser utilizada para abrir uma tela:

Intent intent = new Intent(this, Tela2.class);
startActivity(intent);

ou

Intent intent = new Intent(“ABRIR_TELA”);
startActivity(intent);
(Este Segundo exemplo será melhor explicado no tópico sobre IntentFilter).

O browser (em um endereço específico):

Uri uri  = Uri.parse(“www.gooogle.com.br”);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
requer a permissão:
<uses-permission android:name=”android.permission.INTERNET” >

Efetuar uma ligação:

Uri uri = Uri.parse(“tel:66778899”);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
requer a permissão:
<uses-permission android:name=”android.permission.CALL_PHONE” >

Ver um contado da agenda:

Uri uri = Uri.parse(“content://com.android.contacts/contacs/1”);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

requer a permissão:
<uses-permission android:name=”android.permission.READ_CONTACTS” >

Ou todos os contados:

Uri uri = Uri.parse(“contente://com.android.contacts/contacts”);
Intent intent = new Intent(Intent.ACTION_PICK, uri);
startActvity(intent);

Iniciar algum processamento em segundo plano utilizando classes como BroadcastReceiver e Service que serão vistas em postagens futuras e muito mais. É possível também retornar o resultado de uma activity aberta com a intente com o método startActivityForResult(intente, codigo);

IntentFilter

A classe IntentFilter (“em português filtro de intenções”) serve para filtrar as ações de uma intent mapeando-as de acordo com a tarefa a ser executada. No segundo exemplo de intent usado para abrir uma tela informamos uma String coma ação ABRIR_TELA no construtor da classe Intent ao invés do contexto e da classe que representa a activity (tela) a ser aberta. Você deve estar se perguntando como saber qual activity será executada? Provavelmente alguém terá de configurar a ação ABRIR_TELA para que algo seja executado.

Veja o código xml da activity principal que mostra a configuração do intente-filter:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

No código estão definidas a ação MAIN e a categoria LAUNCHER.

A ação define o que a intente deseja fazer, nos exemplos de intent mostramos a ação Intent.ACTION_VIEW utilizada para mostrar algo na tela.
A categoria é usada em conjunto com a ação para descobrir o que a intente deseja realizar, por exemplo, a ação MAIN define a tela configurada como principal, ou seja, a primeira tela mostrada sempre que a aplicação for iniciada da mesma forma que o método public static void main (String[] args) do Java.
A categoria LAUNCHER define que a aplicação será iniciada manualmente pelo usuário e será visível na tela inicial do sistema.

Obs.: Toda ação precisa, por padrão, ter uma categoria definida, por exemplo, se definir a ação ABRIR_TELA e executar o código:

Intent intent = new Intent(“ABRIR_TELA”);
startActivity(intent);

Vai se deparar com este erro no logcat: “No Activity found to Handle Intent ...”.

Sempre que se executa uma ação com a intent, por padrão a intente define a categoria como DEFAULT, se está categoria não estiver mapeada na tag intente-filter a intente não executará.

Agora vamos a prática, crie um novo projeto e  na tela new android application (caso esteja usando o eclipse) digite as informações como na imagem abaixo:

Altera o arquivo activity_main.xml de acordo com as informações abaixo:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="2dp"
    android:gravity="center" >

    <Button
        android:id="@+id/abrirTela"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_abrir_tela" />

    <Button
        android:id="@+id/abrirTela2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_abrir_tela_2" />

    <Button
        android:id="@+id/abrirTela3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_abrir_tela_3" />
   
    <Button
        android:id="@+id/abrirBrowser"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_abrir_browser" />
   
    <Button
        android:id="@+id/verContatoAgenda"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_ver_contato_agenda" />
   
    <Button
        android:id="@+id/verAgenda"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_ver_agenda" />
   
    <Button
        android:id="@+id/fazerChamada"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_fazer_chamada" />

</LinearLayout>

Modifique o arquivo strings.xml da pasta resources de acordo com a imagem abaixo:


Na classe MainActivity adicione os seguintes métodos:

Método da Interface OnClickListener

Retorna o texto da TelaTeste ao clicar o botão abrir tela 3

Inicializa os botãos da tela diretamente com o método setOnClickListener

Obs.: no método inicializarComponentes não instanciamos em nenhum momento a classe Button, pois o únco atributo a ser utilizado é o onclick que pose ser utilizado diretamente do método findViewById(id do botão);

Código da classe tela exemplo:



Obs2.: No método oncreate da tela exemplo chamamos o método setResult(codigo, intent) que recebe os parâmetros código, que informa se a activity vai retornar alguma informação ou não e a intent com a mensagem a ser retornada. Neste exemplo utilizamos como código o número diretamente, mas poderíamos utilizar uma constante padrão do android como RESULT_OK;

Arquivo manifest do projeto com as permissões necessárias e a configuração da tag intent-filter:

Arquivo AndroidManifest.xml

Inscreva-se para receber


1 comentários:

.