Tudo sobre a classe Intent.

A classe Intent é um dos pilares da arquitetura do Android.

Link oficial da classe Intent: http://developer.android.com/reference/android/content/Intent.html

Essa classe permite realizar requisições que podem ser atendidas tanto pela sua própria aplicação ou por aplicações de terceiros que estejam preparadas para atender essa requisição.

Essas requisições variam de uma simples troca de Activity, para uma solicitação de leitura de código de barras de um aplicativo de terceiro.

Começando pelo simples

É raro hoje em dia encontrar um aplicativo que tenha apenas uma tela, ou seja apenas uma Activity.
Aplicativos móveis rodam em telas geralmente pequenas de modo que na maioria das vezes não conseguimos exibir todas as funcionalidades do app em uma única Activity.

Tendo esse cenário em mãos temos que saber como trocar de Activitys.

Vamos a um exemplo

Imagine um aplicativo que tenha uma tela de Login onde o usuário tem que informar e-mail e senha, após isso ele tem que pressionar o botão Entrar, para ser redirecionado para a tela de Perfil.

Analisando o cenário acima, já identificamos a necessidade da criação de duas Activitys, a Activity de Login e a Activity de Perfil.

Então por favor crie essas duas estruturas e lembre de informar ambas no AndroidManifest.xml.

Sabemos que a Activity de Login contará com um layout com dois EditText (E-mail e senha) e um Button (Entrar).

Vejamos o código desse layout:

<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" >

    <EditText
        android:id="@+id/edit_text_email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="E-mail" />

    <EditText
        android:id="@+id/edit_text_senha"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Senha" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClickEntrar"
        android:text="Entrar" />

</LinearLayout>

Repare que o botão possui a tag onClickEntrar, isso significa que ao ser pressionado o método onClickEntrar da Activity na qual este layout foi vinculado será acionado.

Vamos ver então a nossa Activity de Login:

public class LoginActivity extends Activity {
	
	public static final String KEY_INFO_LOGIN = "KEY_INFO_LOGIN";
	
	private EditText editTextEmail; 
	private EditText editTextSenha;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.login); // Vinculando o layout a uma Activity
		
		// Vinculando os EditText definidos no login.xml no nosso código Java. 
		editTextEmail = (EditText) findViewById(R.id.edit_text_email);  
		editTextSenha = (EditText) findViewById(R.id.edit_text_senha);
	}

	public void onClickEntrar(View view) { // Método será acionado quando o botão Entrar for clicado
		
		Bundle bundleInformacoes = new Bundle(); // Criamos um Bundle - Estrutura criada para trafegar dados.
		
		String email = editTextEmail.getText().toString(); // Recuperamos o valor digitado no EditText de E-mail
		
		bundleInformacoes.putString(KEY_INFO_LOGIN, email); // Colocamos o E-mail no nosso Bundle.
		
		Intent intentMudancaTela = new Intent(this, PerfilActivity.class); // Criamos uma Intent, especificando a Activity de origem (this) e a Activity de destino PerfilActivity.class
	
		intentMudancaTela.putExtras(bundleInformacoes); // Colocamos o Bundle que contem o e-mail em nossa Intent.
		
		startActivity(intentMudancaTela); // Disparamos a Intent. Após isso a Activity de perfil será chamada.
	}

}

Analisando o código acima podemos ver que vinculamos o layout XML criado logo acima a nossa Activity logo no método onCreate(Bundle savedInstance).

O ponto que merece a nossa atenção mesmo é o método onClickEntrar.

Logo na primeira linha criamos um objeto da classe Bundle.
Podemos definir essa estrutura como uma caixa onde colocamos informações importantes que desejamos enviar para a próxima Activity que irá ser chamada.

Neste bundle recém criado adicionamos o e-mail que o usuário digitou. Fazemos isso através do método putString esse método recebe dois parâmetros um deles é a String email, e o segundo é uma chave que informamos via a constante KEY_INFO_LOGIN.

Pra que essa chave?

Essa chave é utilizada no momento em que queremos recuperar o e-mail do Bundle. No caso na Activity PerfilActivity.class. Veremos como recuperar informações do Bundle mais a frente.

Atente também que o Bundle possui vários outros métodos além do putString, isso significa que ele esta apto a carregar uma grande variedade de tipos de dados.

Com o Bundle criado é a vez de criarmos a nossa Intent. Perceba que informamos no construtor da Intent a Activity de origem representada pelo this e a classe da Activity que queremos chamar no caso a PerfilActivity.class.

Após a criação da Intent vinculamos o Bundle a ela, através do método putExtras da própria Intent.

Agora é só disparar essa Intent. Fazemos isso através do método startActivity, presente na própria Activity.
Este método recebe a Intent como parâmetro e após ser executado a Activity de nome PerfilActivity.class tomara a frente da pilha de Activitys e ficará em contato com o usuário.

Um outro método muito importante que não foi exemplificado ainda mais será visto mais adiante neste artigo é o startActivityForResult(Intent intent, int requestCode); este método faz exatamente a mesma coisa que o método startActivity, no entanto ele aguarda uma resposta para a requisição da Intent.

Exemplo:

Uma Activity A chamará a Activity B usando startActivityForResult. Quando a Activity B for finalizada, ela terá a chance de enviar algum Bundle de resposta para Activity A.
Veremos exemplos deste caso mais a frente neste artigo.

Bom Agora nos resta analisar a Activity PefilActivity.

Esta Activity estará vinculada a um layout XML muito simples que contará apenas com um TextView que irá exibir o e-mail enviado pela Activity de Login.

Vejamos o código desse layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:textSize="20sp"
        android:layout_gravity="center"
        android:id="@+id/text_view_perfil"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

Agora vamos ver como ficou a nossa Activity de Perfil.

public class PerfilActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.perfil);
		
		Intent intentPassada = getIntent(); // Recupera a Intent que foi passada
		Bundle bundle = intentPassada.getExtras();  // Recupera o Bundle vinculado a esta Intent
		String email = bundle.getString(LoginActivity.KEY_INFO_LOGIN); // Recupera a String e-mail que esta dentro do bundle
		
		TextView textViewPerfil = (TextView) findViewById(R.id.text_view_perfil);
		textViewPerfil.setText(email); // Exibe o e-mail na interface gráfica via o TextView.
	}

}

Tudo acontece no método onCreate(Bundle savendInstance).
É la que pegamos a referência da Intent que chamou esta Activity, com a Intent em mãos pegamos o Bundle que estava vinculada a ela, e com o Bundle pegamos o e-mail que foi passado pela Activity anterior.

Agora você pode perceber a utilidade da constante KEY_INFO_LOGIN, ela é a chave para recuperarmos a String e-mail informada na Activity de Login.

Com a String e-mail em mãos informamos ela no nosso TextView e fim de papo.

Agora vamos estudar funcionalidades um pouco mais complexas que podemos alcançar com o auxílio da Intent.

Um jeito muito simples de compartilhar funcionalidades entre aplicativos.

Entenda a Intent como um pedido que o seu aplicativo faz para o Sistema Operacional Android.
Ao receber o pedido do seu app, o Android vai vasculhar em todos os aplicativos instalados no dispositivo e irá verificar se algum deles esta preparado para atender o que o seu aplicativo pediu.

Caso encontre algum, o mesmo será acionado.
E poderá retornar um resultado para o aplicativo que o chamou. Esse resultado pode ser qualquer coisa, uma foto, um texto, um arquivo, etc.

Mas como o Android sabe qual aplicativo consegue atender determinada Intent?

Para estar apto a atender a solicitações via Intent, o aplicativo (que deseja atender a determinada solicitação) deve informar uma IntentFilter no seu projeto.

Como o próprio nome indica, Intent é uma intenção e a IntentFilter é um filtro de intenção.

Então se você criar um aplicativo que tira fotos, e deseja compartilhar essa funcionalidade dele com outros sistemas do Android, basta declarar uma IntentFilter la no AndroidManifest.xml igual ao código abaixo:

     <activity android:name=".CameraActivity" >
            <intent-filter>
                <action android:name="android.media.action.IMAGE_CAPTURE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

Se algum aplicativo executar a Intent de foto, o seu aplicativo será acionado. Em casos onde o dispositivo tenha mais de um aplicativo capaz de gerenciar captura de imagens, aparecerá um menu onde o usuário escolherá o app de sua preferência.

OBS: No decorrer do artigo teremos exemplos de como criar Intent’s. Dentre esses exemplos demonstraremos como criar uma Intent que solicita a captura de foto.

Vejamos alguns exemplos de compartilhamento de funcionalidades via aplicativos diferentes:

A intent abaixo irá requisitar a funcionalidade de envio de e-mail.

O código abaixo mostra como criar e disparar uma Intent para o sistema operacional com o intuito de buscar algum aplicativo que envie e-mail.


Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject of email");
intent.putExtra(Intent.EXTRA_TEXT, "Body of email");
intent.setData(Uri.parse("mailto:default@recipient.com"));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Se no  dispositivo onde este app de exemplo for executado estiver instalado algum aplicativo que registrou via IntentFilter ser capaz de enviar e-mail.

O sistema capaz de enviar e-mail será iniciado e conseguiremos enviar e-mail na nossa própria aplicação sem ter a necessidade de desenvolver essa funcionalidade. Apenas utilizando um sistema de terceiro, muito provavelmente o aplicativo do GMAIL.

Outro exemplo, nesse caso a Intent que estamos iniciando executará um video do youtube.

Novamente conseguiremos usufruir da funcionalidade de exibição de video sem ter implementando código algum, apenas utilizando uma outra aplicação instalada no dispositivo.
Desta vez aparecerá a aplicação que estará preparada para receber a Intent de código Intent.ACTION_VIEW.

Essa Intent é utilizada para abrir websites. Nesse exemplo abriremos um video do Youtube.


Uri uriVideo = Uri.parse("http://www.youtube.com/watch?v=skCNLsrrtUw&feature=related");
Intent intent = new Intent(Intent.ACTION_VIEW, uriVideo);
startActivity(intent);

Outro exemplo, Agora iniciaremos um telefonema.

Através da Intent abaixo, o aplicativo de chamadas telefônicas nativo do Android será acionado. Ou eventualmente, um aplicativo de terceiro que implemente tal funcionalidade.

 Intent intent = new Intent(Intent.ACTION_CALL);
 intent.setData(Uri.parse("tel:" +numeroDoTelefone));
 startActivity(intent);

Para este exemplo utilize a tag Permission:

 <uses-permission android:name="android.permission.CALL_PHONE"/>

Outro exemplo, Agora iniciaremos a aplicação de câmera do Android.

A Intent abaixo irá procurar por um capaz de capturar imagens via câmera. Após o termino de sua utilização, a imagem capturada poderá ser tratada através do método onActivityResult da Activity que disparou a Intent.

Isto é feito porque utilizamos o método startActivityForResult para disparar essa Intent ao invés do tradicional startActivity.
Usando esse método (startActivityForResult) estamos dizendo que esperamos uma resposta para a requisição que estamos fazendo.

Vejamos o exemplo, logo abaixo o método que dispara a Intent de captura de imagem via câmera:

public void onClickCamera(View view) {
	Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
	takePictureIntent.putExtra( MediaStore.EXTRA_VIDEO_QUALITY,1);
	startActivityForResult(takePictureIntent, TAKE_PHOTO);
}

onActivityResult tratando o retorno do aplicativo de câmera:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
     super.onActivityResult(requestCode, resultCode, intent);
		if(requestCode == TAKE_PHOTO && resultCode == RESULT_OK) {	
			Bitmap thumbnail = (Bitmap)  intent.getExtras().get("data");
			imageView.setImageBitmap(thumbnail);
		}
	}

Vamos a um exemplo de um AndroidManifest.xml, para ilustrar onde deve ficar as tags referentes a permissões e a IntentFilter.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.loop.Paperwall"
    android:versionCode="1"
    android:versionName="1.0" >

 <!--
 Aqui estão as permissões logo ANTES da tag application 
Neste exemplo estou declarando  que este aplicativo irá utilizar captura de localização, chamadas telefônicas e Internet.
-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CALL_PHONE"/>

    <uses-sdk android:minSdkVersion="11" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name="MessageActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:label="@string/app_name"
            android:windowSoftInputMode="stateAlwaysHidden" >
<!-- As Intent Filters ficam aqui DENTRO da TAG da Activity -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="MainActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:label="@string/app_name"
            android:windowSoftInputMode="stateAlwaysHidden" />
    </application>

</manifest>

Novos exemplos de Intent serão adicionados nesse artigo com o passar do tempo. Fique atento!

Abraço e até a próxima.

Anúncios

, , , ,

  1. #1 by Terrance Dellapenta on Março 22, 2017 - 10:32 am

    Marvelous, what a webpage it is! This weblog gives valuable information to us, keep it up.|

  2. #2 by Carlos on Janeiro 19, 2017 - 7:38 pm

    Ótimo texto! Vai me ajudar em meus estudos.

    Estou com uma dúvida. É possível inserir uma nova tela em um app já pronto e fazer com que essa nova tela apareça primeiro? Não seria uma splashscreen, mas sim uma nova tela com botão que, ao ser clicado, levaria ao app.

    Qual o procedimento para que isso fosse possível?

    Grato

  3. #3 by Cesar on Abril 11, 2016 - 8:23 pm

    ótimo blog ,muito claro!Parabéns!!!

  4. #4 by Lucas Hocihara on Agosto 13, 2014 - 6:04 pm

    Oi, Leonardo

    Me encontrei com mais um problema. No seu último exemplo, o intent de tirar fotos, o parametro “TAKE_PHOTO” e “imagemView” não são reconhecidos pelo programa. Será que eu coloquei os métodos “onClickCamera” e “onActivityResult” nos lugares certos? Bem, eu coloquei eles no PerfilActivity.java,fora do onCreate, mas deu errado.

    Kenji.

  5. #5 by Lucas Hocihara on Agosto 12, 2014 - 7:29 pm

    Oi,Leonardo.

    Como sempre seus posts são muito bons! Parabéns de novo! Mas gostaria de saber, onde você coloca o “”, sei que é no AndroidManifest.xml, mas é dentro de que tag? Eu estou colocando no “”, mas quando clico no botão, ele diz que o programa parou.

    código a seguir:

    No PerfilActivity.java

    public void Ligar(View view) {
    Intent IntentPassada = getIntent();
    Bundle bundle = IntentPassada.getExtras();
    String telefone = bundle.getString(Login.KEY_INFO_LOGIN_TELEFONE);

    Intent intent = new Intent(Intent.ACTION_CALL);
    intent.setData(Uri.parse(“tel:” + 992872005));
    startActivity(intent);
    }

    ————————————————————————————————–

    No AndroidManifest.xml

    Se você puder me ajudar, ficaria muito grato.Muito obrigado por esta ideia de compartilhar seu conhecimento, vc não sabe o quanto eu procurei um lugar igual a esse blog! kkk

    Até mais,Kenji

    • #6 by Lucas Hocihara on Agosto 12, 2014 - 7:35 pm

      Observação: As partes que não apareceram são,respectivamente, ‘uses-permission’ e ‘intent-filter’.

      No AndroidManifest.xml

      intent-filter
      action android:name=”android.intent.action.VIEW”
      category android:name=”android.intent.category.DEFAULT”

      action android:name=”android.intent.action.SENDTO”
      category android:name=”android.intent.category.DEFAULT”

      uses-permission android:name=”android.permission.CALL_PHONE”
      intent-filter

      Desconsidere a falta de ‘>’ e ‘<', pois se eu colocasse o codigo na apareceria kkk

    • #7 by Leonardo Casasanta on Agosto 13, 2014 - 3:31 am

      Ola Lucas,

      Obrigado pelos comentários. =]

      Atualizei o final deste artigo colocando um exemplo de AndroidManifest.xml com alguns comentários.
      Veja se atende as suas necessidades. Qualquer dúvida pode postar ai.

      Abraço.

      • #8 by Lucas Hocihara on Agosto 13, 2014 - 5:33 pm

        Ah, agora entendi, muito obrigado, mais uma vez. =)

        Kenji.

  6. #9 by Leonardo Casasanta on Maio 12, 2014 - 7:50 pm

    Ola Wendell, muito obrigado pelo seu comentário! Fico muito feliz com seu feedback =]

  7. #10 by Wendell Carvalho on Maio 12, 2014 - 2:32 pm

    Cara, estou me aventurando no mundo de desenvolvimento Android e queria lhe dizer que seu blog é um oásis de informações relevantes. Sem contar a maneira bem detalhada que vc escreve os artigos. Meus parabéns e muito obrigado pela sua atitude de propagar o conhecimento.

  1. SMS no Android! | Android On Board

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

%d bloggers like this: