Intents explícitos

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda

Intents explícitos

  • Crear o proxecto: U3_20_Intents.
  • Imos comezar usando os Intents de forma explícita, primeiro chamando a unha segunda activity que imos crear nós e logo chamando á calculadora.
  • Finalmente chamaremos a distintas activities, como contactos, navegador web, etc de forma implícita.
  • En calquera dos casos imos pasar información entre as Activities, ben dende a que chama á chamada, como viceversa.
  • Como indicamos imos comezar creando unha Aplicación con 2 Activities: unha principal e outra secundaria.
  • Logo lanzaremos a calculadora do sistema.


Lanzar unha segunda Activity propia da aplicación

  • Crear o proxecto: U3_20_Intents.

Creación dunha segunda Activity

  • Pódese facer manualmente ou a través da utilidade que proporciona o IDE para crear unha Activity.

O XML do layout da Activity principal

  • Observar na liña 41 que chamamos á segunda actividade co atributo xml: android:onClick
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Dime o teu nome" />

        <EditText
            android:id="@+id/et_nome"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <CheckBox
        android:id="@+id/chk_destruir"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checked="false"
        android:text="Destruír esta activity ao chamar á 2ª" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Chamadas explícitas a intents"
        android:textColor="#00F" />

    <Button
        android:id="@+id/btn_enviar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onEnviarClick"
        android:text="Chamar 2ª Activity: Recibir Datos" />

</LinearLayout>

A clase Java a activity principal

package com.example.u3_20_intents;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;

public class U3_20_Intents extends Activity {

	public final static String NOME = "nome";

	TextView tvNome;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_u3_20__intents);
		tvNome = (TextView) findViewById(R.id.et_nome);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.u3_20__intents, menu);
		return true;
	}

	public void onEnviarClick(View view) {
		CheckBox chkDestruir = (CheckBox) findViewById(R.id.chk_destruir);

		Intent intent = new Intent(this, RecibirDatos.class);
		intent.putExtra(NOME, tvNome.getText().toString());

		startActivity(intent);

		if (chkDestruir.isChecked())
			finish();
	}

	public void finish() {
		super.finish();
		Toast.makeText(this, "Mataches a actividade principal", Toast.LENGTH_SHORT).show();
	}

}
  • Liña 14: Definimos unha constante de tipo String, chamada NOME. Observar que é pública.
  • Liña 35: Creamos un obxecto de tipo Intent. O construtor recibe 2 parámetros:
    • O primeiro parámetro é unha referencia ao contexto (a clase Activity é unha subclase de Context, por iso poñemos this).
    • O segundo parámetro é a clase que o sistema ‘intentará’ cargar (no noso caso o nome da clase asociada á Activity que desexamos cargar).
  • Liña 36: Asignamos ao intent un par CHAVE-VALOR a través do método putExtra(). Neste caso un valor String a través de NOME, definido na liña 14.
    • Tamén poderíamos non usar a constante: intent.putExtra("nome", tvNome.getText().toString())
  • Liña 38: Lanzamos a Activity
  • Liña 40-41: Se o CheckBox do Layout está marcado entón destruímos esta Activity:
    • Realizar probas marcando e desmarcando esta marca e premendo despois o botón Back da Segunda Activity..

O XML da Activity que recibe a chamada

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

    <TextView
        android:id="@+id/tv_resultado"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="resultado"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btn_pechar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:onClick="onPecharClick"
        android:text="Pechar" />

</LinearLayout>

A clase Java da Activity que recibe a chamada. Activity Secundaria.

package com.example.u3_20_intents;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class RecibirDatos extends Activity {
	String Forma_Pechar_Activity;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_recibir_datos);
		Forma_Pechar_Activity = " Premendo botonera Retroceso";

		TextView tvResultado = (TextView) findViewById(R.id.tv_resultado);

		Intent intent = getIntent();

		tvResultado.setText("Ola " + intent.getExtras().getString(U3_20_Intents.NOME));

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.recibir_datos, menu);
		return true;
	}

	public void onPecharClick(View view) {
		Forma_Pechar_Activity = " Premendo botón Pechar";

		finish();

	}

	public void finish() {
		super.finish();
		Toast.makeText(this, "Saíches da actividade secundaria: " + Forma_Pechar_Activity, Toast.LENGTH_SHORT).show();
	}

}
  • Para recuperar a información na segunda Activty hai que realizalo cando se está creando a Activity, pode ser nun método a parte chamado dende o onCreate() ou no propio onCreate();
  • Liña 11: Observar o nome da nova Clase.
  • Liña 12: Variable tipo String para gardar a forma na que se sae da segunda activity: Botón Pechar ou tecla Back.
  • Liña 18: Por defecto asignamos a esa variable que se sae da segunda Activty premendo o botón Back.
  • Liña 12: Creamos un intent onde recollemos cal foi o intent que iniciou esta Activity.
  • Liña 24: Collemos a información que viña en NOME e mostrámola nunha etiqueta de texto.
  • Liña 35-38: se se preme o botón de pechar destruirase esta Activity e cambiamos o valor da variable String.
  • Liña 42-44: Como xa se sabe da parte anterior do Cliclo de Vida dunha Activity este método (finish()) execútase cando se destrúe a Activity.

Pasar datos da actividade secundaria á principal

  • Até agora pasamos datos da actividade principal á secundaria.
  • Imos modificar a aplicación anterior, para que na secundaria se poida introducir o apelido dunha persoa e este se pase á actividade principal.
  • Ademais imos controlar na Actividade Principal se se volveu da actividade secundaria premendo o botón Pechar ou a botonera Back.


  • A continuación vanse ver os cambios introducidos no código anterior.

Pasar datos da secundaria á principal: A clase Java da Activity principal

  • A continuación vaise indicar o código que se engadiu ou modificou con respecto ao anterior.
  • Agora á actividade secundaria chámase con método startActivityForResult(intent, número). Este método indícalle que esperamos que nos devolva un resultado cando esta remate.
  • O número que lle pasamos á actividade secundaria é o que nos vai devolver esta cando se peche e así cando se volva á actividade principal, nesta, co método onActivityResult(int requestCode, int resultCode, Intent data) podemos comprobar que número nos devolve a actividade que nos pasa o control e actuar en consecuencia.



package com.example.u3_20_intents;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;

public class U3_20_Intents extends Activity {

	public final static String NOME = "com.example.NOME";
	private static final int COD_PETICION = 33;

	TextView tvNome;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_u3_20__intents);
		tvNome = (TextView) findViewById(R.id.et_nome);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.u3_20__intents, menu);
		return true;
	}

	public void onEnviarClick(View view) {
		CheckBox chkDestruir = (CheckBox) findViewById(R.id.chk_destruir);

		Intent intent = new Intent(this, RecibirDatos.class);
		intent.putExtra(NOME, tvNome.getText().toString());

		// startActivity(intent);
		startActivityForResult(intent, COD_PETICION);

		if (chkDestruir.isChecked())
			finish();
	}

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {

		if (requestCode == COD_PETICION) {
			if (resultCode == RESULT_OK) {
				if (data.hasExtra("APELIDO"))
					Toast.makeText(this, tvNome.getText() + "\nO teu apelido é: " + data.getExtras().getString("APELIDO"), Toast.LENGTH_SHORT).show();

			} else
				Toast.makeText(this, "Saíches da actividade secundaria sen premer o botón Pechar", Toast.LENGTH_SHORT).show();
		}

	}

	public void finish() {
		super.finish();
		Toast.makeText(this, "Mataches a actividade principal", Toast.LENGTH_SHORT).show();
	}

}
  • Liña 15: Creamos unha constante enteira e asinámoslle un número calquera, que se lle vai pasar á actividade secundaria cando se chame e que ela nos vai devolver cando se peche.
  • Liña 39: Comentamos o método co que chamabamos antes á actividade secundaria.
  • Liña 40: Chamamos ao intent asociado á actividade secundaria, pasándolle un número que logo nos devolverá cando esta se peche e devolva o control á actividade principal.
  • Liña 46: o método onActivityResult (int requestCode, int resultCode, Intent data) actívase cando se volve dunha actividade secundaria.
    • En requestCode: recollemos o código que nos envía esa actividade secundaria, e así controlando ese código podemos saber de que actividade secundaria se regresou á principal.
    • En resultCode: recibimos o código que nos pasaron dende a actividade secundaria:
      • public static final int RESULT_CANCELED= 0 (0x00000000). Para cando queremos indicar que na actividade secundaria se cancelou algo.
      • public static final int RESULT_OK= -1 (0xffffffff). Para cando queremos indicar que o que se tiña que facer na activity secundaria fíxose correctamente.
    • data: recibimos o intent que nos envía a clase secundaria, e que podemos ver se nos pasa algún valor do estilo CHAVE-VALOR, url, etc.
  • Liña 48: Comprobamos se á volta á actividade principal é por mor da actividade secundaria: RecibirDatos que chamamos antes co número 33.
  • Liña 49: Comprobamos se na activity secundaria se concluíu dun xeito exitoso. Se non é así, unha das razóns polas que non se puido rematar foi porque se premeu o botón Back (liña 54).
  • Liña 50: comprobamos se o intent data ten un campo APELIDO de ser así ...
  • Liña 51: ... extraemos o seu valor e amosamos a través dun Toast.

Pasar datos da secundaria á principal: O XML da activity secundaria

  • Só se engadiu un EditText.
<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" >

    <TextView
        android:id="@+id/tv_resultado"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="resultado"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/et_apelido"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:hint="Introduce o teu apelido" />

    <Button
        android:id="@+id/btn_pechar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:onClick="onPecharClick"
        android:text="Pechar" />

</LinearLayout>

Pasar datos da secundaria á principal: A clase Java da Activity secundaria

package com.example.u3_20_intents;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class RecibirDatos extends Activity {
	// String Forma_Pechar_Activity;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_recibir_datos);
		// Forma_Pechar_Activity = " Premendo botonera Retroceso";

		TextView tvResultado = (TextView) findViewById(R.id.tv_resultado);

		Intent intent = getIntent();

		tvResultado.setText("Ola " + intent.getExtras().getString(U3_20_Intents.NOME));

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.recibir_datos, menu);
		return true;
	}

	public void onPecharClick(View view) {
		// Forma_Pechar_Activity = " Premendo botón Pechar";
		EditText et_apelido = (EditText) findViewById(R.id.et_apelido);

		Intent datos_volta = new Intent();
		datos_volta.putExtra("APELIDO", et_apelido.getText().toString());
		setResult(RESULT_OK, datos_volta);
		finish();

	}

	public void finish() {
		super.finish();
		// Toast.makeText(this, "Saíches da actividade secundaria: " +
		// Forma_Pechar_Activity, Toast.LENGTH_SHORT).show();
	}

}
  • Liñas 12,18,36,48 e 49: Comentámolas pois agora na actividade principal xa somos quen de saber se o usuario premeu ou non o botón Pechar ou Back.
  • Liña 39: Creamos un novo intent.
  • Liña 40: Engadimos datos extendidos ao intent, neste caso o par: APELIDO-Valor.
  • Liña 41: setResult envíalle o resultado á activity chamadora.


Chamar a unha activity doutra aplicación: á calculadora

  • A continuación imos engadir máis código ás clases e xmls anteriores para poder chamar a unha activity doutra aplicación, neste caso do sistema.
  • Imos facelo de forma explícita.

Chamar á calculadora: o xml da activity principal.

  • Simplemente engadimos un novo botón (Liñas 44-49).
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Dime o teu nome" />

        <EditText
            android:id="@+id/et_nome"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <CheckBox
        android:id="@+id/chk_destruir"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checked="false"
        android:text="Destruír esta activity ao chamar á 2ª" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Chamadas explícitas a intents"
        android:textColor="#00F" />

    <Button
        android:id="@+id/btn_enviar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onEnviarClick"
        android:text="Chamar 2ª Activity: Recibir Datos" />

    <Button
        android:id="@+id/btn_calculadora"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onCalculadoraClick"
        android:text="Calculadora" />

</LinearLayout>

Chamar á calculadora: A clase java da activity principal.

  • Engadimos o código para procesar o evento onClick do botón (Liñas 59-65).
package com.example.u3_20_intents;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;

public class U3_20_Intents extends Activity {

	public final static String NOME = "com.example.NOME";
	private static final int COD_PETICION = 33;

	TextView tvNome;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_u3_20__intents);
		tvNome = (TextView) findViewById(R.id.et_nome);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.u3_20__intents, menu);
		return true;
	}

	public void onEnviarClick(View view) {
		CheckBox chkDestruir = (CheckBox) findViewById(R.id.chk_destruir);

		Intent intent = new Intent(this, RecibirDatos.class);
		intent.putExtra(NOME, tvNome.getText().toString());

		// startActivity(intent);
		startActivityForResult(intent, COD_PETICION);

		if (chkDestruir.isChecked())
			finish();
	}

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {

		if (requestCode == COD_PETICION) {
			if (resultCode == RESULT_OK) {
				if (data.hasExtra("APELIDO"))
					Toast.makeText(this, tvNome.getText() + "\nO teu apelido é: " + data.getExtras().getString("APELIDO"), Toast.LENGTH_SHORT).show();

			} else
				Toast.makeText(this, "Saíches da actividade secundaria sen premer o botón Pechar", Toast.LENGTH_SHORT).show();
		}

	}

	public void onCalculadoraClick(View v) {

		Intent intent = new Intent();
		intent.setClassName("com.android.calculator2", "com.android.calculator2.Calculator");

		startActivity(intent);
	}

	public void finish() {
		super.finish();
		Toast.makeText(this, "Mataches a actividade principal", Toast.LENGTH_SHORT).show();
	}

}
  • Liña 62: Nesta ocasión co método setClassName(String packageName, String className) indicámoslle no nome do paquete que contén a clase e nome da clase.



-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2015).