Intents explícitos

De MediaWiki
Saltar a: navegación, buscar

Intents explícitos

  • Como comentamos anteriormente os intents explícitos son a forma que temos de 'chamar', ou sexa 'abrir' outra activity polo seu nome.
O seu nome está definido no arquivo AndroidManifiest.xml pero se estamos nun proxecto e queremos chamar a activities definidas dentro do mesmo, tamén podemos facer uso do nome da clase da forma: NomeClaseActivity.class (o veremos nos exemplos).



  • 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.

Caso Práctico 1: Lanzar unha segunda Activity propia da aplicación

Se non o temos creado antes, crearemos un novo paquete de nome: Intents como un subpaquete do teu paquete principal.



  • Dentro do paquete Intents crear unha nova 'Empty Activity' de nome: UD03_01_Intents de tipo Launcher e sen compatibilidade.
Modifica o arquivo AndroidManifiest.xml e engade unha label á activity como xa vimos na creación do proxecto base.



  • Dentro do paquete Intents crear unha nova 'Empty Activity' de nome: UD03_01_Segunda_Intents no Launcher e sen compatibilidade.
Modifica o arquivo AndroidManifiest.xml e engade unha label á activity como xa vimos na creación do proxecto base.
Como xa comentamos anteriormente ao desmarcar a opción Launcher leva consigo que no arquivo AndroidManifiest.xml non se cre sección 'Intent-filter' como vemos na seguinte imaxe:
PDM Intents 1.jpg




  • Esta práctica vai constar de dúas activities na que unha delas chamará a outra:

O XML do layout da Activity principal

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    xmlns:app="http://schemas.android.com/apk/res-auto"
  4.    xmlns:tools="http://schemas.android.com/tools"
  5.    android:layout_width="match_parent"
  6.    android:layout_height="match_parent"
  7.    tools:context=".Intents.UD03_01_A1_Intents">
  8.  
  9.     <TextView
  10.        android:id="@+id/tvNome_UD03_01_A1_Intent"
  11.        android:layout_width="wrap_content"
  12.        android:layout_height="wrap_content"
  13.        android:layout_marginStart="8dp"
  14.        android:layout_marginTop="8dp"
  15.        android:text="Dime o teu nome:"
  16.        android:textSize="18sp"
  17.        app:layout_constraintStart_toStartOf="parent"
  18.        app:layout_constraintTop_toTopOf="@+id/etNome_UD03_01_A1_Intents" />
  19.  
  20.     <EditText
  21.        android:id="@+id/etNome_UD03_01_A1_Intents"
  22.        android:layout_width="wrap_content"
  23.        android:layout_height="wrap_content"
  24.        android:layout_marginStart="8dp"
  25.        android:layout_marginTop="8dp"
  26.        android:ems="10"
  27.        android:inputType="textPersonName"
  28.        android:hint="Nome a enviar"
  29.        app:layout_constraintStart_toEndOf="@+id/tvNome_UD03_01_A1_Intent"
  30.        app:layout_constraintTop_toTopOf="parent" />
  31.  
  32.     <CheckBox
  33.        android:id="@+id/ckDestruir_UD03_01_A1_Intents"
  34.        android:layout_width="wrap_content"
  35.        android:layout_height="wrap_content"
  36.        android:layout_marginEnd="8dp"
  37.        android:layout_marginStart="8dp"
  38.        android:layout_marginTop="48dp"
  39.        android:text="Destruír esta activity ao chamar á segunda"
  40.        android:textSize="14sp"
  41.        app:layout_constraintEnd_toEndOf="parent"
  42.        app:layout_constraintStart_toStartOf="parent"
  43.        app:layout_constraintTop_toBottomOf="@+id/etNome_UD03_01_A1_Intents" />
  44.  
  45.     <Button
  46.        android:id="@+id/btnLanzar_UD03_01_A1_Intent"
  47.        android:layout_width="0dp"
  48.        android:layout_height="wrap_content"
  49.        android:layout_marginEnd="8dp"
  50.        android:layout_marginStart="8dp"
  51.        android:layout_marginTop="16dp"
  52.        android:text="Chamar 2ª Activity: Recibir Datos"
  53.        app:layout_constraintEnd_toEndOf="parent"
  54.        app:layout_constraintStart_toStartOf="parent"
  55.        app:layout_constraintTop_toBottomOf="@+id/ckDestruir_UD03_01_A1_Intents" />
  56. </android.support.constraint.ConstraintLayout>



A clase Java a activity principal

  1. package es.cursoandroid.cifprodolfoucha.aprendiendo.Intents;
  2.  
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.Button;
  8. import android.widget.CheckBox;
  9. import android.widget.EditText;
  10. import android.widget.Toast;
  11.  
  12. import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
  13.  
  14. public class UD03_01_A1_Intents extends Activity {
  15.  
  16.     public final static String NOME = "nome";       // É o nome da variable
  17.  
  18.     private void xestionarEventos(){
  19.  
  20.         Button btnLanzarActivity = findViewById(R.id.btnLanzar_UD03_01_A1_Intent);
  21.         btnLanzarActivity.setOnClickListener(new View.OnClickListener() {
  22.             @Override
  23.             public void onClick(View v) {
  24.                 CheckBox chkDestruir = findViewById(R.id.ckDestruir_UD03_01_A1_Intents);
  25.                 EditText etNome = findViewById(R.id.etNome_UD03_01_A1_Intents);
  26.  
  27.                 Intent intent = new Intent(getApplicationContext(), UD03_01_A2_Intents.class);
  28.                 intent.putExtra(NOME, etNome.getText().toString());
  29.  
  30.                 startActivity(intent);
  31.  
  32.                 if (chkDestruir.isChecked()) {
  33.                     finish();
  34.                 }
  35.             }
  36.  
  37.         });
  38.  
  39.     }
  40.  
  41.     public void finish() {
  42.         super.finish();
  43.         Toast.makeText(this, "Mataches a actividade principal", Toast.LENGTH_SHORT).show();
  44.     }
  45.  
  46.     @Override
  47.     protected void onCreate(Bundle savedInstanceState) {
  48.         super.onCreate(savedInstanceState);
  49.         setContentView(R.layout.activity_ud03_01__a1_intents);
  50.  
  51.         xestionarEventos();
  52.     }
  53. }
  • Liña 14: Definimos unha constante de tipo String, chamada NOME. Observar que é pública. Isto o facemos para que dende a segunda activity poida acceder a ela. O obxectivo é que o nome do parámetro que estamos a utilizar para enviar o dato, nos aseguremos que sexa o mesmo.
  • Liña 27: Creamos un obxecto de tipo Intent. O construtor recibe 2 parámetros:
    • O primeiro parámetro é unha referencia ao contexto. Non podemos poñer 'this' xa que estamos dentro dunha clase anónima e por tanto this non é a activity. Por iso poñemos getApplicationContext()
    • 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 28: 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", etNome.getText().toString())
  • Liña 30: Lanzamos a Activity
  • Liña 32-34: 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..


Nota: Indicar que tamén podemos lanzar a segunda activity con este código:

  1.                 Intent intent = new Intent();
  2.                 intent.setClassName("es.cursoandroid.cifprodolfoucha.aprendiendo","es.cursoandroid.cifprodolfoucha.aprendiendo.Intents.UD03_01_A2_Intents");
Sendo 'es.cursoandroid.cifprodolfoucha.aprendiendo' o nome do paquete definido no AndroidManifiest.xml e 'es.cursoandroid.cifprodolfoucha.aprendiendo.Intents.UD03_01_A2_Intents' o nome do paquete xunto có nome da Activity tamén definido no AndroidManifiest.xml.
Ou con este outro:
  1.                 intent.setClassName(getApplicationContext(),"es.cursoandroid.cifprodolfoucha.aprendiendo.Intents.UD03_01_A2_Intents");
Sendo o primeiro parámetro unha referencia ao contexto e o segundo o nome da clase.
  • Os datos anteriores os obtemos do AndroidManifiest.xml:
PDM Intents 10.jpg


O veremos máis adiante neste punto da Wiki, como chamar a outras aplicacións instaladas no S.O. Android empregando esta forma.


O XML da Activity que recibe a chamada

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    xmlns:app="http://schemas.android.com/apk/res-auto"
  4.    xmlns:tools="http://schemas.android.com/tools"
  5.    android:layout_width="match_parent"
  6.    android:layout_height="match_parent"
  7.    tools:context=".Intents.UD03_01_A2_Intents">
  8.  
  9.     <TextView
  10.        android:id="@+id/tvResultado_UD03_01_A2_Intent"
  11.        android:layout_width="wrap_content"
  12.        android:layout_height="wrap_content"
  13.        android:layout_marginEnd="8dp"
  14.        android:layout_marginStart="8dp"
  15.        android:layout_marginTop="8dp"
  16.        android:contentDescription="Nome enviado"
  17.        android:text="Resultado"
  18.        app:layout_constraintEnd_toEndOf="parent"
  19.        app:layout_constraintStart_toStartOf="parent"
  20.        app:layout_constraintTop_toTopOf="parent" />
  21.  
  22.     <Button
  23.        android:id="@+id/btnPechar_UD03_01_A2_Intent"
  24.        android:layout_width="wrap_content"
  25.        android:layout_height="wrap_content"
  26.        android:layout_marginEnd="8dp"
  27.        android:layout_marginStart="8dp"
  28.        android:layout_marginTop="24dp"
  29.        android:text="Pechar"
  30.        app:layout_constraintEnd_toEndOf="parent"
  31.        app:layout_constraintStart_toStartOf="parent"
  32.        app:layout_constraintTop_toBottomOf="@+id/tvResultado_UD03_01_A2_Intent" />
  33. </android.support.constraint.ConstraintLayout>



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

  1. package es.cursoandroid.cifprodolfoucha.aprendiendo.Intents;
  2.  
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.EditText;
  8. import android.widget.TextView;
  9.  
  10. import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
  11.  
  12. public class UD03_01_A2_Intents extends Activity {
  13.  
  14.      private String formaPecharActivity=null;
  15.  
  16.  
  17.  
  18.     private void xestionarEventoss(){
  19.         findViewById(R.id.btnPechar_UD03_01_A2_Intent).setOnClickListener(new View.OnClickListener() {
  20.             @Override
  21.             public void onClick(View v) {
  22.                  formaPecharActivity = " Premendo botón Pechar";
  23.  
  24.                 EditText et_apelido = (EditText) findViewById(R.id.etApelido_UD03_01_A2_Intents);
  25.  
  26.                 finish();
  27.             }
  28.         });
  29.     }
  30.  
  31.     public void finish() {
  32.         super.finish();     // IMPORTANTE. SEMPRE HAI QUE CHAMAR A SUPER.XXXX en calquera método do ciclo de vida da activity que sobrecarguemos
  33.  
  34.  
  35.         if (formaPecharActivity==null){ // Quere dicir que vimos de pulsar o botón atrás, non o botón pechar, xa que se prememos o botón Pechar damos un valor á variable
  36.             formaPecharActivity = " Premendo botonera Retroceso";
  37.         }
  38.         Toast.makeText(this, "Saíches da actividade secundaria: " + formaPecharActivity, Toast.LENGTH_SHORT).show();
  39.  
  40.     }
  41.  
  42.     @Override
  43.     protected void onCreate(Bundle savedInstanceState) {
  44.         super.onCreate(savedInstanceState);
  45.         setContentView(R.layout.activity_ud03_01__a2__intents);
  46.  
  47.         // Recuperamos o nome enviado dende a Activity 1
  48.         TextView tvResultado = (TextView) findViewById(R.id.tvResultado_UD03_01_A2_Intent);
  49.         Intent intent = getIntent();
  50.         tvResultado.setText("Ola " + intent.getExtras().getString(UD03_01_A1_Intents.NOME));
  51.  
  52.         xestionarEventoss();
  53.     }
  54. }
  • 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 14: Variable tipo String para gardar a forma na que se sae da segunda activity: Botón Pechar ou tecla Back.
  • Liña 22: En caso de premer o botón 'Pechar' a variable anterior ten un texto indicandolo (entón xa non vale null)
  • Liña 26: Chamamos ao método finish() para que peche a activity.
  • Liña 35-37: En caso de que a variable formaPecharActivity==null quere dicir que estamos destruíndo a activity pero non a través do botón, se non premendo o botón Back.
  • Liña 49: Recuperamos o intent enviado dende a activity principal.
  • Liña 50: Collemos a información que viña en NOME e mostrámola nunha etiqueta de texto.

Continuación caso Práctico 1: 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.



  1. package es.cursoandroid.cifprodolfoucha.aprendiendo.Intents;
  2.  
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.Button;
  8. import android.widget.CheckBox;
  9. import android.widget.EditText;
  10. import android.widget.Toast;
  11.  
  12. import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
  13.  
  14. public class UD03_01_A1_Intents extends Activity {
  15.  
  16.     public final static String NOME = "nome";       // É o nome da variable
  17.     public final static String APELIDO = "apelido";       // É o nome da variable
  18.     private static final int COD_PETICION = 33;
  19.  
  20.     private void xestionarEventos(){
  21.  
  22.         Button btnLanzarActivity = findViewById(R.id.btnLanzar_UD03_01_A1_Intent);
  23.         btnLanzarActivity.setOnClickListener(new View.OnClickListener() {
  24.             @Override
  25.             public void onClick(View v) {
  26.                 CheckBox chkDestruir = findViewById(R.id.ckDestruir_UD03_01_A1_Intents);
  27.                 EditText etNome = findViewById(R.id.etNome_UD03_01_A1_Intents);
  28.  
  29.                 Intent intent = new Intent(getApplicationContext(), UD03_01_A2_Intents.class);
  30.                 intent.putExtra(NOME, etNome.getText().toString());
  31.  
  32.                 // startActivity(intent);
  33.                 startActivityForResult(intent, COD_PETICION);
  34.  
  35.                 if (chkDestruir.isChecked()) {
  36.                     finish();
  37.                 }
  38.             }
  39.  
  40.         });
  41.  
  42.     }
  43.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  44.  
  45.         if (requestCode == COD_PETICION) {
  46.             if (resultCode == RESULT_OK) {
  47.                 if (data.hasExtra(UD03_01_A1_Intents.APELIDO)) {
  48.                     EditText etNome = findViewById(R.id.etNome_UD03_01_A1_Intents);
  49.                     Toast.makeText(this, etNome.getText() + "\nO teu apelido é: " + data.getExtras().getString(UD03_01_A1_Intents.APELIDO), Toast.LENGTH_SHORT).show();
  50.                 }
  51.  
  52.             } else
  53.                 Toast.makeText(this, "Saíches da actividade secundaria sen premer o botón Pechar", Toast.LENGTH_SHORT).show();
  54.         }
  55.  
  56.     }
  57.  
  58.     public void finish() {
  59.         super.finish();
  60.         Toast.makeText(this, "Mataches a actividade principal", Toast.LENGTH_SHORT).show();
  61.     }
  62.  
  63.     @Override
  64.     protected void onCreate(Bundle savedInstanceState) {
  65.         super.onCreate(savedInstanceState);
  66.         setContentView(R.layout.activity_ud03_01__a1_intents);
  67.  
  68.         xestionarEventos();
  69.     }
  70. }
  • Liña 17: Ao igual que no caso de 'nome', teremos outra variable que gardará o apelido enviado dende a activity segunda á primeira.
  • Liña 18: 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 33: Chamamos ao intent asociado á actividade secundaria facendo uso do método startActivityForResult, pasándolle un número que logo nos devolverá cando esta se peche e devolva o control á actividade principal. A diferenza da forma anterior, chamando a este método indicamos que a activity á que chamamos vai devolver información, a cal será recollida no método onActivityResult.
  • Liña 43: 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 45: Comprobamos se á volta á actividade principal é por mor da actividade secundaria: RecibirDatos que chamamos antes co número 33.
  • Liña 46: 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 47: comprobamos se o intent data ten un campo APELIDO de ser así ...
  • Liña 49: ... 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.
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    xmlns:app="http://schemas.android.com/apk/res-auto"
  4.    xmlns:tools="http://schemas.android.com/tools"
  5.    android:layout_width="match_parent"
  6.    android:layout_height="match_parent"
  7.    tools:context=".Intents.UD03_01_A2_Intents">
  8.  
  9.     <TextView
  10.        android:id="@+id/tvResultado_UD03_01_A2_Intent"
  11.        android:layout_width="wrap_content"
  12.        android:layout_height="wrap_content"
  13.        android:layout_marginEnd="8dp"
  14.        android:layout_marginStart="8dp"
  15.        android:layout_marginTop="8dp"
  16.        android:contentDescription="Nome enviado"
  17.        android:text="Resultado"
  18.        app:layout_constraintEnd_toEndOf="parent"
  19.        app:layout_constraintStart_toStartOf="parent"
  20.        app:layout_constraintTop_toTopOf="parent" />
  21.  
  22.     <Button
  23.        android:id="@+id/btnPechar_UD03_01_A2_Intent"
  24.        android:layout_width="wrap_content"
  25.        android:layout_height="wrap_content"
  26.        android:layout_marginEnd="8dp"
  27.        android:layout_marginStart="8dp"
  28.        android:layout_marginTop="28dp"
  29.        android:text="Pechar"
  30.        app:layout_constraintEnd_toEndOf="parent"
  31.        app:layout_constraintStart_toStartOf="parent"
  32.        app:layout_constraintTop_toBottomOf="@+id/etApelido_UD03_01_A2_Intents" />
  33.  
  34.     <EditText
  35.        android:id="@+id/etApelido_UD03_01_A2_Intents"
  36.        android:layout_width="wrap_content"
  37.        android:layout_height="wrap_content"
  38.        android:layout_marginEnd="8dp"
  39.        android:layout_marginStart="8dp"
  40.        android:layout_marginTop="24dp"
  41.        android:ems="10"
  42.        android:hint="Apelido"
  43.        android:inputType="textPersonName"
  44.        app:layout_constraintEnd_toEndOf="parent"
  45.        app:layout_constraintStart_toStartOf="parent"
  46.        app:layout_constraintTop_toBottomOf="@+id/tvResultado_UD03_01_A2_Intent" />
  47. </android.support.constraint.ConstraintLayout>



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

  1. package es.cursoandroid.cifprodolfoucha.aprendiendo.Intents;
  2.  
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.EditText;
  8. import android.widget.TextView;
  9.  
  10. import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
  11.  
  12. public class UD03_01_A2_Intents extends Activity {
  13.  
  14.     // private String formaPecharActivity=null;
  15.  
  16.     private void xestionarEventoss(){
  17.         findViewById(R.id.btnPechar_UD03_01_A2_Intent).setOnClickListener(new View.OnClickListener() {
  18.             @Override
  19.             public void onClick(View v) {
  20.                 // formaPecharActivity = " Premendo botón Pechar";
  21.  
  22.                 EditText et_apelido = (EditText) findViewById(R.id.etApelido_UD03_01_A2_Intents);
  23.  
  24.                 Intent datos_volta = new Intent();
  25.                 datos_volta.putExtra(UD03_01_A1_Intents.APELIDO, et_apelido.getText().toString());
  26.                 setResult(RESULT_OK, datos_volta);
  27.  
  28.                 finish();
  29.             }
  30.         });
  31.     }
  32.  
  33.     public void finish() {
  34.         super.finish();     // IMPORTANTE. SEMPRE HAI QUE CHAMAR A SUPER.XXXX en calquera método do ciclo de vida da activity que sobrecarguemos
  35.  
  36.         /*
  37.         if (formaPecharActivity==null){ // Quere dicir que vimos de pulsar o botón atrás, non o botón pechar, xa que se prememos o botón Pechar damos un valor á variable
  38.             formaPecharActivity = " Premendo botonera Retroceso";
  39.         }
  40.         Toast.makeText(this, "Saíches da actividade secundaria: " + formaPecharActivity, Toast.LENGTH_SHORT).show();
  41.          */
  42.     }
  43.  
  44.     @Override
  45.     protected void onCreate(Bundle savedInstanceState) {
  46.         super.onCreate(savedInstanceState);
  47.         setContentView(R.layout.activity_ud03_01__a2__intents);
  48.  
  49.         // Recuperamos o nome enviado dende a Activity 1
  50.         TextView tvResultado = (TextView) findViewById(R.id.tvResultado_UD03_01_A2_Intent);
  51.         Intent intent = getIntent();
  52.         tvResultado.setText("Ola " + intent.getExtras().getString(UD03_01_A1_Intents.NOME));
  53.  
  54.         xestionarEventoss();
  55.     }
  56. }
  • Liñas 14,20,36-41: Comentámolas pois agora na actividade principal xa somos quen de saber se o usuario premeu ou non o botón Pechar ou Back polo código de volta da activity.
  • Liña 24: Creamos un novo intent.
  • Liña 25: Engadimos datos extendidos ao intent, neste caso o par: APELIDO-Valor.
  • Liña 26: setResult envíalle o resultado á activity chamadora có código RESULT_OK. Poderíamos enviar o código RESULT_CANCELED noutro suposto programado por nos.

Continuación caso práctico 1: 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 57-67).
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    xmlns:app="http://schemas.android.com/apk/res-auto"
  4.    xmlns:tools="http://schemas.android.com/tools"
  5.    android:layout_width="match_parent"
  6.    android:layout_height="match_parent"
  7.    tools:context=".Intents.UD03_01_A1_Intents">
  8.  
  9.     <TextView
  10.        android:id="@+id/tvNome_UD03_01_A1_Intent"
  11.        android:layout_width="wrap_content"
  12.        android:layout_height="wrap_content"
  13.        android:layout_marginStart="8dp"
  14.        android:layout_marginTop="8dp"
  15.        android:text="Dime o teu nome:"
  16.        android:textSize="18sp"
  17.        app:layout_constraintStart_toStartOf="parent"
  18.        app:layout_constraintTop_toTopOf="@+id/etNome_UD03_01_A1_Intents" />
  19.  
  20.     <EditText
  21.        android:id="@+id/etNome_UD03_01_A1_Intents"
  22.        android:layout_width="wrap_content"
  23.        android:layout_height="wrap_content"
  24.        android:layout_marginStart="8dp"
  25.        android:layout_marginTop="8dp"
  26.        android:ems="10"
  27.        android:inputType="textPersonName"
  28.        android:hint="Nome a enviar"
  29.        app:layout_constraintStart_toEndOf="@+id/tvNome_UD03_01_A1_Intent"
  30.        app:layout_constraintTop_toTopOf="parent" />
  31.  
  32.     <CheckBox
  33.        android:id="@+id/ckDestruir_UD03_01_A1_Intents"
  34.        android:layout_width="wrap_content"
  35.        android:layout_height="wrap_content"
  36.        android:layout_marginEnd="8dp"
  37.        android:layout_marginStart="8dp"
  38.        android:layout_marginTop="48dp"
  39.        android:text="Destruír esta activity ao chamar á segunda"
  40.        android:textSize="14sp"
  41.        app:layout_constraintEnd_toEndOf="parent"
  42.        app:layout_constraintStart_toStartOf="parent"
  43.        app:layout_constraintTop_toBottomOf="@+id/etNome_UD03_01_A1_Intents" />
  44.  
  45.     <Button
  46.        android:id="@+id/btnLanzar_UD03_01_A1_Intent"
  47.        android:layout_width="0dp"
  48.        android:layout_height="wrap_content"
  49.        android:layout_marginEnd="8dp"
  50.        android:layout_marginStart="8dp"
  51.        android:layout_marginTop="16dp"
  52.        android:text="Chamar 2ª Activity: Recibir Datos"
  53.        app:layout_constraintEnd_toEndOf="parent"
  54.        app:layout_constraintStart_toStartOf="parent"
  55.        app:layout_constraintTop_toBottomOf="@+id/ckDestruir_UD03_01_A1_Intents" />
  56.  
  57.     <Button
  58.        android:id="@+id/btnCalculadora_UD03_01_A1_Intents"
  59.        android:layout_width="0dp"
  60.        android:layout_height="wrap_content"
  61.        android:layout_marginEnd="8dp"
  62.        android:layout_marginStart="8dp"
  63.        android:layout_marginTop="8dp"
  64.        android:text="Lanzar Calculadora"
  65.        app:layout_constraintEnd_toEndOf="parent"
  66.        app:layout_constraintStart_toStartOf="parent"
  67.        app:layout_constraintTop_toBottomOf="@+id/btnLanzar_UD03_01_A1_Intent" />
  68. </android.support.constraint.ConstraintLayout>



Chamar á calculadora: A clase java da activity principal.

  • Engadimos o código para procesar o evento onClick do botón.
  1. package es.cursoandroid.cifprodolfoucha.aprendiendo.Intents;
  2.  
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.widget.Button;
  8. import android.widget.CheckBox;
  9. import android.widget.EditText;
  10. import android.widget.Toast;
  11.  
  12. import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
  13.  
  14. public class UD03_01_A1_Intents extends Activity {
  15.  
  16.     public final static String NOME = "nome";       // É o nome da variable
  17.     public final static String APELIDO = "apelido";       // É o nome da variable
  18.     private static final int COD_PETICION = 33;
  19.  
  20.     private void xestionarEventos(){
  21.  
  22.         // Botón para lanzar a segunda activity
  23.         Button btnLanzarActivity = findViewById(R.id.btnLanzar_UD03_01_A1_Intent);
  24.         btnLanzarActivity.setOnClickListener(new View.OnClickListener() {
  25.             @Override
  26.             public void onClick(View v) {
  27.                 CheckBox chkDestruir = findViewById(R.id.ckDestruir_UD03_01_A1_Intents);
  28.                 EditText etNome = findViewById(R.id.etNome_UD03_01_A1_Intents);
  29.  
  30.                 Intent intent = new Intent();
  31.                // intent.setClassName("es.cursoandroid.cifprodolfoucha.aprendiendo","es.cursoandroid.cifprodolfoucha.aprendiendo.Intents.UD03_01_A2_Intents");
  32.                 intent.setClassName(getApplicationContext(),"es.cursoandroid.cifprodolfoucha.aprendiendo.Intents.UD03_01_A2_Intents");
  33.                 intent.putExtra(NOME, etNome.getText().toString());
  34.  
  35.                 // startActivity(intent);
  36.                 startActivityForResult(intent, COD_PETICION);
  37.  
  38.                 if (chkDestruir.isChecked()) {
  39.                     finish();
  40.                 }
  41.             }
  42.         });
  43.  
  44.          //Botón para lanzar a calculadora do S.O.
  45.          Button btnCalculadora = findViewById(R.id.btnCalculadora_UD03_01_A1_Intents);
  46.          btnCalculadora.setOnClickListener(new View.OnClickListener() {
  47.              @Override
  48.              public void onClick(View v) {
  49.                  Intent intent = new Intent();
  50.                  intent.setClassName("com.android.calculator2", "com.android.calculator2.Calculator");
  51.                  startActivity(intent);
  52.              }
  53.          });
  54.  
  55.     }
  56.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  57.  
  58.         if (requestCode == COD_PETICION) {
  59.             if (resultCode == RESULT_OK) {
  60.                 if (data.hasExtra(UD03_01_A1_Intents.APELIDO)) {
  61.                     EditText etNome = findViewById(R.id.etNome_UD03_01_A1_Intents);
  62.                     Toast.makeText(this, etNome.getText() + "\nO teu apelido é: " + data.getExtras().getString(UD03_01_A1_Intents.APELIDO), Toast.LENGTH_SHORT).show();
  63.                 }
  64.  
  65.             } else
  66.                 Toast.makeText(this, "Saíches da actividade secundaria sen premer o botón Pechar", Toast.LENGTH_SHORT).show();
  67.         }
  68.  
  69.     }
  70.  
  71.     public void finish() {
  72.         super.finish();
  73.         Toast.makeText(this, "Mataches a actividade principal", Toast.LENGTH_SHORT).show();
  74.     }
  75.  
  76.     @Override
  77.     protected void onCreate(Bundle savedInstanceState) {
  78.         super.onCreate(savedInstanceState);
  79.         setContentView(R.layout.activity_ud03_01__a1_intents);
  80.  
  81.         xestionarEventos();
  82.     }
  83. }
  • Liña 50: 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.



Paso de datos complexos dunha activity a outra

  • Nos exemplos anteriores estamos a pasar datos de tipo String dunha activity a outra.
Para iso temos que chamar ao método putExtras da clase Intent desta forma:


  1.                 Intent intent = new Intent(this,Activity_Chamar.class);
  2.  
  3.                 Bundle datos = new Bundle();
  4.                 datos.putString("VARIABLE1",VALOR1);
  5.                 datos.putInt("VARIABLE2",VALOR2);
  6.                 .............
  7.                 intent.putExtras(datos);
  8.  
  9.                 startActivity(intent);


  • Para recuperar os datos na activity 'destino' facemos o proceso contrario:
  1.     @Override
  2.     protected void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.         setContentView(R.layout.activity_ud03_01__a2__intents);
  5.  
  6.         Intent intent = getIntent();
  7.         Bundle datos = intent.getExtras();
  8.         String valor1 = datos.getString("VARIABLE1");
  9.  
  10.     }
NOTA IMPORTANTE: Lembrar que se gardades o contido dun View (por exemplo, o EditText) o contido a gardar será: editText.getText().toString()
Tedes que facer uso do método 'toString()'.




  • Se queremos pasar obxectos pertencentes a clases complexas dunha activity a outra, teremos que facer uso da interface Parceleable a cal deberemos implementar na clase que queremos utilizar para pasar os datos.
Tedes un exemplo completo de uso neste enlace.




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