Está en la página 1de 14

U.T. VI.- TRABAJANDO CON VARIAS ACTIVITYS.

Índice

1. El fichero AndroidManifest.

2. Los ficheros build.gradle.

3. La clase Intent.

4. Ciclo de vida de una Activity.

5. Paso de parámetros entre Activitys.

1.- El Fichero AndroidManifest.

1.1.- Introducción.

 El fichero AndroidManifest.xml es utilizado por Android para


almacenar información sobre el contenido y estructura de una
aplicación.

 Es un fichero XML generado por Android al crear un proyecto


nuevo (/manifests/AndroidManifest.xml).

 En él se declaran todas las componentes de la aplicación, tales


como las Activitys utilizadas, los Intents, el nombre de la
aplicación, el hardware necesario para su ejecución, permisos,
etcétera.

o Algunas de estas componentes las incluye Android por


defecto y otras debe incluirlas el programador.

 Hay que tener en cuenta que una aplicación Android no tiene un


punto de entrada preestablecido, en AndroidManifest
deberemos indicar cuál es la Activity que debe ejecutarse
cuando se lance la aplicación.

1.2.- Elementos Principales de un AndroidManifest.xml.

1
 <manifest>: Es el elemento raíz. Debe contener, al menos,
los siguientes atributos:

o xmlns: define el namespace que será utilizado en el resto del


documento.

xmlns:android="http://schemas.android.com/apk/res/
android"

o package: identifica el paquete raíz de nuestra aplicación.

package="com.example.usuario.proyecto1"

o installLocation: Especifica dónde queremos almacenar nuestra


aplicación. El valor "preferExternal" indica que, si es posible, se
instale en la memoria externa.

android:installLocation="preferExternal"

 <application>: En este elemento deben especificarse todas


las Activities, Services, Providers, Receivers etc. que vamos a
utilizar en nuestra aplicación. Atributos:

o allowBackup: Booleano, habilita a Android a que, al hacer un


backup el usuario, se realice una copia de seguridad tanto
de la aplicación como de los datos que en ese momento
contenga.

 Incorporado a partir de la API 17.

android:allowBackup="true"

o icon|label|theme Permiten referenciar los recursos que se


van a utilizar para el icono y título de la aplicación así como
para el estilo.

2
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"

o supportsRtl Booleano. Permite, o no, la realización de


diseños de derecha a izquierda.

 <activity> Dentro del elemento <application>. Debe


especificarse un elemento <activity> por cada actividad creada
en nuestra aplicación. Puede contener los siguientes atributos:

o name: Indica el nombre de la clase Activity que se encuentra


en el package indicado en el título del elemento <manifest>.

android:name="com.example.proyecto1.MainActivity"

o label|icon: Especifican el string y el icono que van a aparecer


en la barra de título cuando sea lanzada esta activity. Si no
se especifican, se utilizarán por defecto los que se hayan
indicado en <application>.

o screenOrientation: Especifica la orientación con la que se va


a mostrar la activity en el dispositivo.

android:screenOrientation="landscape"

o configChanges: Permite especificar qué cambios de


configuración queremos manejar nosotros mismos y que no
lo haga por defecto el dispositivo. Por ejemplo, podemos
especificar que los cambios debidos a la aparición del
teclado, a su ocultación y al cambio de orientación de la
pantalla los vamos a manejar nosotros.

android:configChanges="keyboard|keyboardHidden|
orientation"

 <intent-filter>: Debe situarse dentro de un elemento


<activity> e indica el modo en que ésta va a ser iniciada. Es
decir, le indica a Android cómo debe reaccionar la Activity

3
cuando se lleve a cabo algún intent específico sobre ella. Dentro
de este elemento incluimos las diferentes acciones que deben
ponerse en marcha.

o <action>: debe situarse dentro de un elemento


<intent-filter>, en él se especifica el punto de entrada
principal de nuestra aplicación.

<action android:name="android.intent.action.MAIN" />

o <category>: debe situarse dentro de un elemento


<intent-filter> en él se indica que esta activity sea
añadida al lanzador de la aplicación.

<category
android:name="android.intent.category.LAUNCHER" />

 <uses-permission>: Dentro del elemento <application>.


Mediante este elemento especificamos los permisos que va a
necesitar nuestra aplicación para poder ejecutarse, además son
los que deberá aceptar el usuario antes de instalarla.

o Por ejemplo, si la activity va a acceder a la memoria


externa del teléfono, a internet, etc.

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

2.- Los ficheros build.gradle.

 Gradle es básicamente una herramienta para automatizar el


proceso de construcción de nuestro proyecto
(compilar,testing,empaquetado…).

 Cuando compilamos nuestro software, Gradle chequea si hay


cambios en el código fuente con respecto a la ultima
compilación, de esta forma se ahorra la tarea de volver a
compilar.

4
 Podemos distinguir 2 ficheros build.gradle:

o build.gradle(Poject:nombreproyecto).

 buildscript {…}: Declara que tiene una dependencia con


la librería que contiene el plugin de Gradle.

o build.gradle(Module:app)

 CompileSdkVersion: Indica la versión de la API con la


que vamos a compilar nuestro proyecto.

 minSdkVersion: Indica la versión mínima de Android


que puede abrir esta aplicación. Cuanto menor sea la
version, mayor será la compatibilidad con los
dispositivos Android.

 VersionName “”:Es el nombre que el programador da


a la versión de esta aplicación.

 dependencies Hace referencia a las librerías que vamos


a implementar en nuestro proyecto.

3.- La clase Intent.


 La clase Intent posibilita la comunicación entre las diferentes
partes de una aplicación Android.
 Existen dos tipos de intents:
o intents explícitos. Indican exactamente el
componente a lanzar. Se utilizan para ir ejecutando los
componentes internos de la aplicación.
 Por ejemplo, para lanzar una Activity desde
otra.
o intents implícitos. Se utilizan para solicitar tareas
abstractas del tipo "tomar una foto" ó "enviar un
mensaje".

 Cualquier activity definida en AndroidManifest puede ser


iniciada programáticamente mediante un Intent.

5
 La clase Intent tiene un constructor para hacer esto:

Intent(Contexto,NombreActivity.class)
o Ejemplo:
Intent intent=new Intent(this,Actividad2.class);
startActivity(intent);
Actividad2 deberá estar declarada en AndroidManifest.

Proyecto 601.
Crear una aplicación Android con 2 activitys. La primera mostrará un
botón que, al pulsarlo, lance la segunda. La segunda mostrará una
imagen.
Personalizar el icono y título de las activitys.
La primera activity deberá mostrarse con orientación "landscape" y la
segunda "portrait".
Observad que al "matar" Actividad2 vuelve a mostrarse Actividad1.

Proyecto 602.
Aplicación Android que muestre un ListView en la pantalla principal
con 3 items, Al seleccionar cada item se iniciará una activity diferente
donde se muestre una imagen.

Proyecto 603.
Proyecto Android con una Activity y tres opciones en la Action bar.
Cada vez que el usuario seleccione una opción se mostrará una
imagen diferente. Cada imagen estará definida en un layout distinto.

Proyecto 604.
Análogo al proyecto anterior con la diferencia de que en éste cada
opción deberá lanzar una Activity diferente. Las 3 activitys
compartirán un mismo layout.
4.- Ciclo de vida de una Activity.

 Cuando se inicia una aplicación compuesta por varias activitys,


Android crea en la memoria del dispositivo una "Activity
stack", es decir una pila de activitys.

o Cada vez que comienza a ejecutarse una nueva Activity


se añade al final de la pila.

6
o Cuando la Activity que estaba en ejecución es destruida,
la última Activity que colocamos en la pila se vuelve a
mostrar y se convierte en la Activity activa.

 A la hora de diseñar una aplicación debemos tener en cuenta


que todas las Activitys que la componen van a compartir la
misma zona de memoria: "memory heap".

o Deberán, pues, utilizarse con restricciones los campos


estáticos, que no se destruyen cuando lo hace una
Activity, por lo que ocupan memoria durante todo el
tiempo de ejecución de la aplicación.

 También debemos tener en cuenta que la relación entre U.I.s y


Activitys no es 1:1, es decir, una Activity puede estar asociada
a una U.I., a varias o a ninguna.

3.1.- Estados de una Activity.

 El "Ciclo de vida de una Activity" describe los estados y las


transiciones entre estos estados en los que puede encontrarse
una Activity durante el tiempo de ejecución de la aplicación
que la contiene.

 Una activity puede encontrarse en 3 estados:

o Estado Running (ejecutándose). En este estado es la


Activity de nivel superior de la pila que ocupa toda la
pantalla e interactúa con el usuario.

o Estado Paused (pausado). Tiene lugar cuando la activity


todavía está visible en la pantalla pero parcialmente
oscurecida, bien porque está running (ejecutándose)
otra actividad transparente, bien porque aparece un
diálogo, bien cuando la pantalla del dispositivo está
bloqueada.

7
 Una Activity en estado paused puede ser destruida
por Android en cualquier momento y sin/con aviso
previo, por ejemplo por falta de memoria.

 No obstante lo anterior, mientas una Activity está


paused sigue ocupando memoria y está en espera
de volver al estado running.

o Estado Stopped (detenido). Ocurre cuando la Activity


está completamente oscurecida por otra y deja de estar
visible en la pantalla.

 Una Activity también puede pasar a estado


stopped cuando se pulsa el botón home del
dispositivo.

 Al igual que con paused, una Activity stopped


sigue ocupando memoria y puede ser destruida, es
decir eliminada completamente de la memoria, por
Android en cualquier momento sin/con aviso previo.

 Mientras una Activity paused o stopped no sea destruida por


Android, puede ser devuelta al estado running.

o Cuando esto ocurre sigue siendo el mismo objeto Java


que se encuentra en la memoria, por lo que el valor de
sus atributos será el mismo que tenían cuando la Activity
pasó a uno de esos dos estados.

3.2.- Métodos protegidos.

 Las Activitys cuentan con un conjunto de métodos protegidos


que se ejecutan cuando tiene lugar un cambio de estado.

o Estos métodos pueden ser sobreescritos.

 Método onCreate(): Llamado cuando la Activity es iniciada por


primera vez.

8
 Método onStart(): Llamado después de onCreate().

o También puede ser llamado cuando la Activity es


recuperada desde un estado stopped.

 Método onResume(): Llamado después de onStart() o cuando


la Activity es recuperada desde un estado paused.

 Método onPause(): Llamado cuando otra actividad pasa a


primer plano.

o Éste puede ser el último método de la Activity que


ejecute Android antes de ser destruida.

o Debido a lo anterior deberemos utilizarlo para guardar


toda le información que queramos que persista en un
dispositivo externo, como puede ser la tarjeta SD, dado
que no tenemos ninguna seguridad de que el resto de
métodos vayan a ejecutarse.

 Método onStop(): Llamado cuando la Activity pasa a modo


stopped.

o Se ejecuta siempre después de una llamada a onPause().


Esto significa que una Activity antes de estar detenida
(stopped) tiene que pasar por el estado paused.

o Al igual que en el caso de onPause(), éste puede ser el


último método que se ejecute antes de que Android
destruya la Activity.

 Método onRestart(): Llamado cuando la Activity es recuperada


desde un estado stopped.

o Una llamada a este método debe ir precedida de una


llamada al método onStop().

 Método onDestroy(): Llamado al final del ciclo de vida de la


Activity, es el último método que ejecutará Android antes de

9
que la Activity sea destruida y deje de ocupar espacio en la
memory heap de la aplicación.

o Es el último lugar donde podremos guardar información


que queramos conservar para próximas ejecuciones de la
aplicación.

o No obstante, antes de llegar a este método Android


puede haber destruido la Activity silenciosamente.

 Método estático finish(): Permite destruir la Activity en


cualquier momento.

3.3.- RESUMEN

 Las lecciones importantes son 3:

1. Antes de que una Activity entre en estado running el método


onResume() tiene que haber sido llamado, independientemente de
que la Activity se inicie por primera vez o que haya sido
recuperada del estado paused o stopped.

2. Una Activity puede ser destruida después de una llamada al


método onPause(), por lo que nunca podremos presumir que
después se ejecutará un método onStop() u onDestroy().

2.1. No debemos pues utilizar estos dos últimos métodos para


guardar información que queramos que esté disponible para
futuras ejecuciones de la Activity.

3. Dado que no sabemos si una Activity que se encontraba paused o


stopped ha sido eliminada de la pila por Android, con lo que no se
ejecutaría el método onDestroy(), podemos utilizar el método
isFinishing().

3.1. Este método booleano puede ser llamado en cualquier


momento y nos informa si la Activity va a ser eliminada.

1
0
3.2. Si isFinishing() devuelve true entonces deberemos salvar
cualquier estado que queramos que persista en la tarjeta SD
para que no se pierda.

Proyecto 605.
Aplicación Android con la siguiente pila de Activitys.

MainActivity Actividad1

Observar las llamadas a los métodos onCreate(), onStart(),


onResume(), onPause(), onStop(), onDestroy(), onRestart() e
isFinishing() mediante mensajes de texto.
isFinishing() deberá incluirse dentro de onPause() y onStop()
Utilizar un objeto de la clase StringBuilder para almacenar dichos
mensajes (método append()).

5.- Paso de parámetros entre Activitys.

5.1.- Métodos putExtra() y get...Extra().

 Si queremos pasar datos de tipo primitivo desde una activity A1


a otra activity A2 deberemos hacer uso del método de la clase
Intent putExtra("nombre","valor").

o Este método admite como parámetros un identificador y


un dato que serán enviados en forma de par
nombre/valor a la Activity llamada desde el Intent.

o El tipo del dato vendrá indicado por su formato en el caso


de ser una constante o por el tipo del atributo que lo
contenga.

Ejemplo: Intent intent=new Intent(this,Actividad2.class);


intent.putExtra("entero",19);
startActivity(intent);

 Para recuperar en A2 los datos pasados por A1 utilizaremos los


métodos get...Extra().

1
1
o Este conjunto de métodos pertenece al método
getIntent() y permiten recuperar la información enviada
dependiendo del tipo de dato.

o Si get...Extra() va a recibir un String admite como


parámetro un identificador. Si va a recibir un dato
numérico admite como parámetros un identificador y un
valor por defecto.

 Ejemplo: int num=getIntent().getIntExtra("entero",0);

Proyecto 606.
Crear una aplicación con 2 Activitys: MainActivity --> Actividad1
En MainActivity se mostrará la siguiente U.I.

Cuando el usuario pulse el botón, si han sido rellenados todos los


campos, se iniciará Actividad1, donde se mostrarán los datos

1
2
introducidos. Si algún campo no ha sido cumplimentado deberá
emitirse un mensaje Toast y no lanzar Actividad1.
Aunque en este ejercicio no sea necesario, debéis tratar "Edad" como
un entero y "Salario" como float.

Mensajes Toast: Toast.makeText(this, "Mensaje",Toast.LENGTH_LONG).show();

5.2.- Paso de parámetros con la clase Bundle.

 Podemos utilizar la clase Bundle para crear un objeto que


almacene todos los datos primitivos que queremos enviar desde
una activity a otra.

o Para ello utilizaremos métodos del tipo put...


("nombre","valor")

o Ejemplo: Bundle bundle=new Bundle();


bundle.putInt("entero",19);

 Una vez almacenados los datos en el objeto Bundle, lo


asociamos al Intent que va a iniciar la segunda actividad con el
método putExtras()

Ejemplo: Intent intent=new Intent(this,Actividad2.class);


intent.putExtras(bundle);
startActivity(intent);

1
3
 En la activity iniciada deberemos crear otro objeto Bundle para
almacenar la información enviada:

o Bundle bundle=getIntent().getExtras();
 Posteriormente accederemos a cada uno de los datos que
contiene el Bundle con métodos del tipo get...("nombre")

o Ejemplo: int num=bundle.getInt("entero");

 En este caso incluir un valor por defecto es


opcional.

Proyecto 607.
Idem al proyecto 606 utilizando objetos Bundle para el
envío/recepción de la información.

Proyecto 608.
Crear el siguiente árbol de Activitys:

MainActivity

Actividad1 Actividad2

En Actividad1 el usuario decidirá cuántas veces desea visitar


Actividad2.
En Actividad2 se mostrará un mensaje informando del número de
visitas que quedan.
No se pueden utilizar botones.

1
4

También podría gustarte