Qué Es Activity
Qué Es Activity
Qué Es Activity
Un layout representa una pantalla..cada activity esta conectado con un layout que es un archivo
xml y es la plantilla que nos da el molde de la apariencia de esa pantalla
En Android, los archivos de diseño se crean y se almacenan en la carpeta res/layout. Esta carpeta
se encuentra dentro del directorio de recursos (res) en la estructura de directorios del proyecto de
Android.
Cuando se crea un nuevo proyecto en Android Studio, se crea automáticamente una carpeta
llamada res que contiene subcarpetas para diferentes tipos de recursos, como diseños, imágenes,
valores de strings, estilos, etc. El directorio res/layout es donde se deben colocar los archivos XML
que definen los diseños de la interfaz de usuario.
*Si creas un proyecto sin activity no se crea la carpeta layout entonces hay que crearla endentro
de la carpeta res. (New Android resource directory y en type escoger layout)
*Una vez creada la carpeta de layout se crea un new Resource file y se nombran escribiendo la
palabra activity_nombre (al contrario de las clases ya que en las clases es el nombre con
mayúscula en cada palabra ejemplo MyFirstActivity)
Dentro de la carpeta res/layout, puedes crear subcarpetas adicionales para organizar tus archivos
de diseño si así lo deseas. Por ejemplo, puedes crear una subcarpeta llamada
res/layout/actividades para agrupar los diseños de las actividades de tu aplicación.
En resumen, los archivos de diseño en Android se crean en la carpeta res/layout, y esta carpeta
proporciona la ubicación para almacenar los archivos XML que describen la apariencia y estructura
de la interfaz de usuario de tu aplicación.
Actividades
Por definición, una actividad es un componente que nos provee de una pantalla con la que
el usuario puede interactuar, por ejemplo, marcar un número de teléfono, tomar una foto,
enviar un correo, ver un mapa. A cada actividad se le provee de una ventana para dibujar su
interfaz gráfica.
El siguiente diagrama muestra las transiciones entre estados de una actividad. Los
rectángulos representan los métodos que podemos sobrescribir e implementar cuando hay
una transición de estados en la Actividad. Los óvalos de colores son los estados principales
de la actividad.
El ciclo de vida empieza cuando el usuario lanza la actividad y el sistema manda a llamar el
método onCreate(Bundle) de nuestra actividad y termina cuando el usuario cierra la
aplicación y se manda llamar el método onDestroy( ). La aplicación debe inicializar sus
recursos en el método onCreate y liberarlos en onDestroy.
La actividad es visible entre los métodos onStart( ) y onStop( ). Durante este tiempo la
aplicación es visible aunque el usuario no puede interactuar con ella.
La actividad está corriendo después de que se llama el método onResume( ) y sigue así
hasta que entra el método onPause( ). Durante este tiempo la actividad está frente a las
demás actividades y el usuario puede interactuar con ella. Las aplicaciones constantemente
van entre resumidas y pausadas, por ejemplo cuando el dispositivo “se duerme” o cuando
se despliega otra actividad.
La actividad termina cuando se manda llamar al método finish( ), este método finaliza la
actividad y el sistema manda llamar la función onDestroy( ).
Algo muy importante a resaltar, es que para cambiar de estados en nuestras actividades no
debemos mandar llamar directamente estos métodos, si no que es el sistema quien los
manda llamar.
1
2
3
4
5 public class MiActividad {
6 public void onCreate(Bundle savedInstance)
7 {
//mi código de inicialización
8 super.onCreate(savedInstance);
9 //el layout/pantalla principal que vamos a mostrar
1 setContentView(view);
0 }
1
public void onPause()
1 {
1 super.onPause();
2 //liberar recursos
1 }
3 }
1
4
1
5
3. Declara la actividad en el archivo AndroidManifest.xml, ubica el tag <application>
y agrega tu actividad ahí.
1<application
2<activity android:name="MyActividad"
3android:label="@string/titulo_actividad">
4</activity>
</application>
5
Habrá ocasiones en que nuestra actividad necesite hacer uso de ciertas aplicaciones del
sistema, como mandar un e-mail, SMS, usar la cámara, etc. No es necesario crear una
aplicación que tome fotos si Android ya nos provee de una aplicación que podemos mandar
llamar para realizar estas acciones, es aquí cuando los Intents son realmente útiles. Si
existen varias aplicaciones que puedan ejecutar la misma tarea el usuario puede seleccionar
cual usar.
Programa de ejemplo
Descarga el programa aquí.
Revisa los métodos onCreate de cada actividad. Nota como cada uno manda llamar al
método setContentView y pasa como parámetro el id de un layout de nuestra carpeta
res/layout/.
Ahora examina el método doExit de la clase MainActivity, este también manda llamar a
finish(), en este caso, como no hay una actividad antes en la pila de actividades la actividad
actual se destruye y nuestra aplicación termina.
Analiza los layouts del proyecto en la carpeta res/layout/, abre activity_main.xml con un
editor de texto y observa el código que agrega los botones (el tag <Button>), observa en
sus propiedades la propiedad de android:onClick=”accion”. Esto indica el método que se
manda llamar al hacer clic en dicho botón, por ejemplo, el botón Exit manda llamar el
método doExit de la actividad principal.
Corre la actividad hijo y el diálogo, observa el orden en que se ejecutan los métodos del
ciclo de vida de la actividad.
Activity – entender y usar una Actividad
Aquí vamos a extendernos para explicar completamente que es una actividad. Si quieres ir
directamente al código está al final. Y si no te sientes interesado por conocer
completamente qué es una actividad será mejor que mires en otros de los cientos de
tutoriales más directos que hay por Internet. Empecemos a comprender a fondo que es una
Activity de Android (Actividad en español).
Todos sabemos que es una aplicación informática. Pero por si lo hemos olvidado lo
resumo: una aplicación es un programa, que es una herramienta que permite al usuario
realizar algún que otro tipo de trabajo (estos trabajos pueden ser, editar un texto con una
herramienta de edición de textos, jugar a un juego, usar una calculadora, todo lo que se nos
ocurra). Y una aplicación internamente consta de código, así como ficheros que pueden ser
de audio, binarios, entre otros. Si, por ejemplo, una aplicación fuera “el Deporte”, esta
contendría internamente todos los deportes posibles como gimnasia rítmica, hacer
flexiones, bicicleta, correr, baloncesto, etc. Por cierto, la aplicaciones para dispositivos
móviles se llaman App -viene de convertir en chic y estilosa la palabra en inglés
“Application”, lo que es quedarnos con las tres primeras letras- es lo mismo con otro
nombre más modernamente guay.
Para entenderlo mejor, vamos a suponer que tenemos la App mencionada anteriormente se
llama “el Deporte”. Esta tiene actividades en su interior que son:
Correr
Baloncesto
Flexiones
Con éstas nos vale para ejemplificar lo que queremos, podría haber más o menos como se
mencionó antes.
Lo que queremos hacer es correr, con lo que lanzamos nuestra actividad de correr.
Actividad que estará en primero plano y que contará con un ciclo de vida.
Una actividad se caracteriza por tener un ciclo de vida. Un ciclo de vida, al igual que el
ciclo vida de un animal: nace, crece, come, se reproduce y muere; también, es semejante en
una actividad. De la actividad de correr tendría el siguiente ciclo de vida: estiramos antes de
empezar a correr, comenzamos a correr, corremos a tope, en cierto momento decidimos
hacer una pausa para hacer flexiones, luego podemos decidir continuar con la carrera, y en
otro momento dejamos correr para otro día. El siguiente diagrama (modificación del oficial
para realizar el ejemplo, diagrama oficial que mostramos más adelante) muestra como se
desarrolla el ciclo de vida de la actividad de correr. Échale un vistazo rápido y continúa
leyendo la explicación:
Como habrás visto, el ciclo de vida no es del todo lineal, sino que podemos tomar
decisiones y actuaremos en consecuencia, por ejemplo, podemos decidir hacer un descanso
y luego continuar corriendo o terminar. Pero lo que es lineal es lineal (en el ciclo de vida
animal es lineal comer antes de hacer cacotas, si no se come lo segundo es imposible de
conseguir), siempre calentaremos antes de correr, sino no es un deporte –decidir saltarnos
el calentamiento no elimina la linealidad, el calentamiento no se puede hacer mientras se
corre, o se hace antes o no se hace (por evitar dudas con el vocabulario, explicamos que
“calentar” siempre es antes de realizar un deporte, no después; para más dudas consular la
RAE).
Puede que existan preguntas acerca de los dos círculos rojos del diagrama, suelen llevar a
confusión, pero son completamente diferentes (También pueden darse dudas en algunos
estados como el de pausar y parar, pero esos y otros que puedan suscitar dudas se
esclarecerán en cuanto veamos un poco más adelante como funciona ese ciclo de vida en
formato App):
El que “mata a la actividad” lo hace porque algo más importante requiere nuestra
atención absoluta, y no tenemos tiempo para seguir corriendo. No se decide
terminar de correr pero se acaba. Retomaremos la actividad de correr desde el
principio cuando queramos.
El que “concluye a la actividad” es porque decidimos terminar de correr, entonces
acabamos la actividad.
Hemos comentado otras dos actividades: hacer flexiones y baloncesto. En cierto momento
del ciclo de vida de la actividad de correr, podemos decidir hacer la actividad de hacer
flexiones. Con lo que ponemos en segundo plano a la actividad de correr y empezamos con
la de hacer flexiones –decir que la actividad de hacer flexiones también tiene su propio
Ahora vuelve al gráfico anterior e imagínate que has salido a correr, haz un recorrido
mental por el ciclo de vida de la actividad de correr y verás como todo va cobrando sentido.
Cuando acabes mira el siguiente ciclo de vida del mismo diagrama de ejemplo (el diagrama
es una modificación del oficial que mostramos un poco más adelante, paciencia), ésta vez
suponiendo que es una App de verdad en un Smartphone o Tablet. A la que observamos el
siguiente diagrama, imagínate que tienes instalada la aplicación “El Deporte”, y que te
dispones a arrancar la actividad de correr en tu móvil, que la vas a ver en la pantalla, vas a
poder tocar, e interactuar directamente; esta va a ser la actividad activa.
Si pensamos en todo lo que podemos hacer con nuestro móvil teniendo la aplicación en
marcha, y delante de nosotros la actividad de correr en ejecución es posiblemente (éstas no
son las únicas acciones, otras también desencadenarán los mismos caminos por el ciclo de
vida):
Entendido esto veamos el ciclo oficial de una actividad (así como los anteriores gráficos
son una modificación ofrecida por www.Jarroba.com para ejemplificar sobre el oficial, el
siguiente gráfico es un traducción del oficial de Android, el diagrama oficial está disponible
en http://developer.android.com/reference/android/app/Activity.html).
Empezamos a hablar en términos de programación. Como vemos en los recuadros existen
varios métodos con nombres en inglés iguales a los que explicamos anteriormente. Estos
métodos están en la clase Activity, clase que tendremos que heredar para que nuestra clase
se convierta en una actividad de la siguiente forma (Nota: hasta que no avise de lo
contrario, esto es código no funcional, con lo justo para entender la teoría; aviso más
adelante cuando aparezca el código funcional):
Podemos añadir opcionalmente cada uno de los métodos para sobrescribirlos (esto lo indica
el @Override) a la clase padre Activity, no siendo obligatorio ninguno. Dentro
escribiremos el código que queramos que se ejecute, y cada método será llamado por la
clase Activity en el momento indicado anteriormente. A continuación escribimos todos los
métodos posibles, los que no necesitemos ni los escribimos. No ponerlos no les priva de
existencia, siguen existiendo en la clase Activity, por tanto en el ciclo de vida de nuestra
Actividad, pero al ejecutarse a su momento estarán vacíos.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Nuestro código a ejecutar en este momento
}
@Override
public void onStart(){
super.onStart();
//Nuestro código a ejecutar en este momento
}
@Override
public void onRestart(){
super.onRestart();
//Nuestro código a ejecutar en este momento
}
@Override
public void onResume(){
super.onResume();
//Nuestro código a ejecutar en este momento
}
@Override
public void onPause(){
super.onPause();
//Nuestro código a ejecutar en este momento
}
@Override
public void onStop(){
super.onStop();
//Nuestro código a ejecutar en este momento
}
@Override
public void onDestroy(){
super.onDestroy();
//Nuestro código a ejecutar en este momento
}
}
Para empezar, recomiendo usar únicamente el método onCreate, que es el que se ejecuta al
arrancar la actividad, el resto de métodos los emplearemos en caso de necesitarlos.
Si te preguntas para que se usa el resto de métodos, imagínate un juego en nuestro móvil.
Estamos jugando y en cierto momento nos da por apagar el móvil. Para no perder el
progreso, en el onDestroy recolectamos los datos de la partida y los guardamos en la
memoria persistente. Así la próxima vez que juguemos, en el onCreate preguntará a la
memoria si existen datos guardados del juego, y cargará la partida en el mismo instante en
la que la dejamos.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Nuestro código a ejecutar en este momento
}
Uno llamado “layout_correr.xml” con el siguiente código (como construir y entender este
código xml lo explicaremos en otro tutorial, aquí nos lo creemos):
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Estamos corriendo"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button_flexiones"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ponerse a hacer Flexiones"
android:onClick="clicEnBoton_IrAFlexiones"
/>
</LinearLayout>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Estamos haciendo Flexiones"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
Este otro muestra por pantalla:
Por norma general, una actividad está asociada a un Layout. Un Layout es la ventana o
vista que el usuario ve en la pantalla: botones, textos, barras de desplazamiento, etc. La
asociación se hace en el onCreate con el método llamado "setContentView", como veremos
en el siguiente código.
Si has visto algo del patrón Modelo-Vista-Controlador, decirte que lo que llamamos en
Android Layout es la Vista, la Activity debería de ser el Modelo, y el resto de clases
actuarán de Controlador.
Creamos una nueva actividad que llamamos “Correr” y ponemos el siguiente código.
package com.example.el_deporte;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_correr);
}
Aquí tenemos el onCreate al que se le pasa por parámetro una variable que se llama
“savedInstanceState” de tipo “Bundle”. Esto lo explicaremos en otro tutorial más
extendidamente. Pero para que vayas tomando conceptos un resumen rápido: un Bundle
son datos que le pasamos a esta actividad para inicializar su estado. En este ejemplo no lo
usamos, pero si pensamos por ejemplo en un juego, en el que se pide en una actividad el
sexo del personaje, y pasamos a la siguiente actividad, en el que se ve nuestro personaje
con el sexo elegido; el sexo como variable hombre o mujer ha tenido que ser pasado de
algún modo de una actividad a otra, se hace con “Bundle”.
Este método lo único que hace es abrir la otra actividad “Flexiones”. Se hace con algo
llamado “Intent”. Un “Intent” es declarar la intención de lo que se quiere hacer, en este
caso la intención es ejecutar la actividad Flexiones –aunque podría decir que además de
abrir otra actividad lo que queremos es también pasar ciertos datos como en el ejemplo
anterior del juego con el sexo. Dicho de otro modo, un “Intent” es un paquete con todo lo
que queramos configurar la nueva activity a ejecutar. Solo falta decir que el “this” es el
contexto de la actividad actual (para saberlo todo sobre el Context mira este artículo). Esto
lo realiza el código: Intent intent = new Intent(this, Flexiones.class);
Para llegar a la siguiente actividad y Layout asociado necesitamos su código. Creamos otra
nueva actividad que llamamos “Flexiones” con este código:
package com.example.el_deporte;
import android.app.Activity;
import android.os.Bundle;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_flexiones);
}
Así cuando lleguemos a esta actividad, se mostrará por pantalla el Layout correspondiente.
Pero existe un problema de seguridad que hará que la aplicación falle si intentamos esto sin
más. Nos queda modificar el fichero llamado “AndroidManifest.xml”. Este fichero es el
encargado de manejar los permisos de la aplicación, y aquí hay que declarar todo lo que
nuestra aplicación pueda suponer un problema de seguridad. En este Manifiesto, tendremos
que poner si nuestra aplicación hará uso de Internet, si va a poder realizar llamadas, etc;
estos son los permisos que el usuario tiene que aceptar cuando el usuario se dispone a
instalar una aplicación. La apertura de actividades tiene que estar controlado desde este
fichero.
Para ello vamos al “AndroidManifest.xml”. En la pestaña “Application”, en el apartado
“Application Nodes” pulsamos el botón “Add…”.
En la ventana que se nos abre, nos aseguramos que esté marcada la casilla “Create a new
element at the top level, in Application”. Elegimos “Activity” y pulsamos “OK”.
Ahora, aseguramos que tenemos seleccionada el nuevo nodo que hemos creado que se
llama “Activity”. Estarán todos sus campos correspondientes a la derecha en blanco,
pulsamos en Name en el botón “Browse…”.
Otra ventana nueva se nos abrirá. Esperamos unos segundos a que carguen todas las
actividades que tenemos –un porcentaje nos avisará de ello- y seleccionamos la actividad
que deseamos, en este ejemplo “Flexiones”. Acabamos pulsando “OK”.
<activity android:name="Flexiones"></activity>
Si abrimos el XML del "AndroidManifest.xml" nos habrá quedado una estructura parecida
a la que sigue:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.el_deporte"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".Correr" android:label="">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<activity android:name="Flexiones"></activity>
</application>
</manifest>
Ya podemos ejecutar nuestra aplicación en el emulador y probar como hemos hecho una
actividad que al pulsar el botón se pasa a la otra. Como llevamos diciendo en el ejemplo de
correr, estamos corriendo en la siguiente pantalla:
Esperamos que te haya esclarecido lo relacionado con todo lo relacionado sobre actividades
de Android, ya que es lo más gordo que tiene -y más importante- requiere ser bien
entendido. Para cualquier pregunta o aclaración en un comentario que responderemos lo
antes posible.
Ver en vivo como funciona el ciclo de vida de una actividad:Para probar como funciona
el ciclo de vida de una actividad, lo mejor es verlo por nosotros mismos. Para ello
sustituimos la actividad Correr por el siguiente código, donde se muestran todos los estados
por los que puede pasar:
package com.example.el_deporte;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.util.Log;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_correr);
Log.v("test", "Create");
}
@Override
public void onStart(){
super.onStart();
Log.v("test", "Start");
}
@Override
public void onRestart(){
super.onRestart();
Log.v("test", "Restart");
}
@Override
public void onResume(){
super.onResume();
Log.v("test", "Resume");
}
@Override
public void onPause(){
super.onPause();
Log.v("test", "Pause");
}
@Override
public void onStop(){
super.onStop();
Log.v("test", "Stop");
}
@Override
public void onDestroy(){
super.onDestroy();
Log.v("test", "Destroy");
}
Hemos añadido a este código un log en cada método del ciclo de vida para poder ver por el
LogCat de Android la salida.
Trastear un poco con esto nos hará entender como funciona el ciclo de vida de una
actividad.
Por ejemplo:
2º Ahora pulsamos el botón, como otra actividad se nos pone encima ocultándola
completamente, se mostrará en este orden: Pause y Stop.
4º Si pulsamos el botón de inicio para volver al escritorio, se nos mostrará: Pause y Stop.
Podemos hacer todas las pruebas que queramos, para entender perfectamente el ciclo de
vida de la actividad. Es recomendable que eches un vistazo al diagrama para poder seguir la
vida de una actividad.