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.
Entre el código que nos encontramos, en Android, se usa el termino de Activity (“Actividad” en español) para denominar a un tipo de clases java que heredan de Activity -no te preocupes si no entendiste esto, lo explicaremos un poco más adelante. Una actividad, como su propio nombre indica, es algo que el usuario puede hacer. El símil que se me ocurre ahora mismo, con el ejemplo anterior, es el de actividad física, que es un conjunto de movimientos del cuerpo que obtienen como resultado un gasto de energía. En Android una actividad es lo mismo, es un conjunto de acciones (tocar la pantalla para apretar un botón, para escribir con el teclado, etc) que son una iteración directa con el usuario y que afectan a una parte de la aplicación. Para concretar más, vamos a suponer que nuestra actividad física es correr -es una parte activa de la aplicación- con lo que nuestra actividad será correr.
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 ciclo de vida que no dibujaremos por ser innecesario, te lo imaginas 😉 . La actividad de baloncesto también tiene su propio ciclo de vida, pero en este ejemplo nunca será puesto en marcha –simplemente hemos puesto la actividad de baloncesto para ejemplificar que puede haber actividades que nunca se ejecuten.
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):
- Arrancar la actividad: Pasará por Crear, Empezar y Continuar, para llegar a la ejecución normal.
- Usar de manera normal la actividad: estamos en la actividad en ejecución.
- Una ventana emergente se ha abierto: Pasará por Pausar.
- Cambiar a otra actividad o bloquear el móvil: Pasará por Pausar y Parar. (Nota aclaratoria: si se cambia a otra actividad pasa necesariamente por pausar y parar, no ha tenido que surgir una ventana emergente para pasar por pausar, si se cambia de actividad se pasa por ambos estados directamente; esto se da con otras acciones que pasen por varios estados).
- Apagar el móvil: Pasará por Pausar, Parar y Destruir.
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):
public class Correr extends Activity { //Aquí estará contenido de toda la actividad de Correr }
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.
public class actividad_de_correr extends Activity { @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.
public class actividad_de_correr extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Nuestro código a ejecutar en este momento } }
A partir de aquí expondremos un ejemplo con código completamente funcional. Realizaremos la aplicación “El_Deporte”. Dentro contendrá dos actividades: Correr y Flexiones (quitamos la de baloncesto por simplificar el código). Creamos un nuevo proyecto de Android, le ponemos el nombre de la aplicación “El_Deporte” y pulsamos todo el rato a “Next” hasta terminar, así tener le proyecto listo para trabajar.
Vamos a la carpeta “res” y ahí a la carpeta “layout” y creamos dos xml.
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):
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <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>
Este layout muestra al usuario:
Y otro “layout_flexiones.xml”, con el siguiente código:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <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; public class Correr extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_correr); } public void clicEnBoton_IrAFlexiones (View view) { Intent intent = new Intent(this, Flexiones.class); startActivity(intent); } }
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”.
El onCreate requiere iniciar al padre antes de todo, de ahí la línea: super.onCreate(savedInstanceState);
En la línea siguiente establecemos que Layout queremos asociar a esta actividad, como es la actividad “correr”, es justo asociarle el layout “layout_correr”, se hace como se muestra en: setContentView(R.layout.layout_correr);
Existe otro método normal y corriente llamado “cliclEnBoton_IrAFelxiones” que es el que se ejecuta cuando hacemos clic en el botón con el texto “Ponerse a hacer Flexiones”. Este se llama desde el propio xml en la línea android:onClick="clicEnBoton_IrAFlexiones" y lo que hace es que al pulsar el botón, este método se ejecute.
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);
Después de declarar la intención hay que lanzar la actividad con: startActivity(intent);
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; public class Flexiones extends Activity { @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”.
Guardamos el fichero “AndroidManifest.xml” y ya está. A continuación una pantalla de cómo queda finalmente:
Con lo que hemos hecho en el "AndroidManifest.xml" lo único que hemos hecho es añadir la siguiente línea a su XML:
<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:
Pulsamos el botón de “Ponerse a hacer Flexiones” y pausamos la actividad de Correr para arrancar la actividad de Flexiones.
Para volver a la actividad anterior pulsamos el botón de atrás del dispositivo, con lo que la actividad de Correr continuará.
Puedes descargarte el proyecto entero desde aquí: Descargar App El_Deporte
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.
Recomiendo que prosigas con el estudio de Android en el siguiente artículo sobre el Context pinchando aquí, donde explicamos en profundidad qué es y para qué sirve.
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; public class Correr extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_correr); Log.v("test", "Create"); } public void clicEnBoton_IrAFlexiones (View view) { Intent intent = new Intent(this, Flexiones.class); startActivity(intent); } @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:
1º Supongamos que arrancamos la aplicación, se cargará la actividad de Correr, y por el LogCat se nos mostrará en cada línea: Create, Start y Resume.
2º Ahora pulsamos el botón, como otra actividad se nos pone encima ocultándola completamente, se mostrará en este orden: Pause y Stop.
3º Si pulsamos el botón de volver, retomamos la actividad de Correr y se mostrará: Restart, Start y Resume.
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.
tengo una aplicacion ya logre lanzar otro Activity pero al momento de estar en el 2do, los botones que agregue como si hubieran perdido su funcionalidad ya que no hacen nada al presionarlos, hay algo que pueda hacer como para activarlos
Comprueba que estén habilitados los botones con:
mi_boton.setEnabled(true);
Tengo una duda, si quiero iniciar sesión pero falla la contraseña 3 veces y deseo cerrar la aplicación como le hago?
Puedes utilizar «finishAffinity()» para terminar todas las Activities asociadas a la tarea (más información en: https://developer.android.com/reference/android/app/Activity.html#finishAffinity()):
Hola. Muchas gracias por el post, muy bien explicado. Tengo una duda al respecto. Necesito hacer lo siguiente y no me queda claro cómo regresar a la actividad principal: desde mi actividad principal compruebo si tengo almacenados unos parámetros para loguearme, si no es así lanzo una actividad login (desde onCreate con startActivity). Esta actividad captura datos de usuario y contraseña y comprueba con la BD que el usuario existe. Si el usuario existe, los datos de usuario y contraseña los almaceno y se los paso como parámetros a la actividad principal que me mostrará en un WebView la página de inicio una vez logueado con dichos parámetros. Al ejecutarlo, en la actividad principal me saca el error "FATAL EXCEPTION: main… Caused by: java.lang.NullPointerException" cuando estoy capturando dichos parámetros de la vista login, por tanto supongo que estoy haciendo mal el paso entre actividades. La llamada a la actividad login la hago en el método onCreate y en la línea siguiente capturo con un objeto tipo Bundle los parámetros que me pasa la actividad login. Por favor, podrías indicarme ¿cuál es el procedimiento correcto para capturar esos parámetros?. Gracias de antemano. Un saludo.
Hay alguna variable que está a null cuando se necesita ejecutar. Posiblemente sea una variable que no está correctamente pasada.
En nuestro libro gratuito de Android tienes ejemplos de paso de variables entre Activities, entre otros muchos ejemplos y aclaraciones que seguro te serán muy útiles: http://jarroba.com/libro-android-100-gratis/
Buenos días. Muchas gracias por responder. Efectivamente era lo que comentas. Revisaré el libro que me dices porque sigo sin poder capturar bien los parámetros. Un saludo.
Excelente página, muchas gracias por tu aportación la verdad me ayudo muchisimo para entender esta parte.
Hola estoy consumiendo datos de mi webservice desde android en la primera actividad mando los parametros para obtener los datos, posteriormenete paso esa informacion en una segunda actividad en donde lo listo en un recyclerview, del dato del listado elijo cualquiera y nuevamente voy a mi webservice la informacion que obtuve lo vuelvo a listar en una tercera actividad pero el problema esta cuando intento regresar a mi segunda actividad desde la tercera me sale esto Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.os.Bundle.get(java.lang.String)' on a null object reference ..ya le otorge el permiso en manifiest en mi metodo para regresar a la actividad 2 tengo esto public boolean onOptionsItemSelected(MenuItem item){
Intent intent = new Intent(this, Actividad2.class);
startActivityForResult(intent,0);
return true;
}
podria orientarme que es lo que esta pasando mi aplicacion arraja un mensaje que se detuvo le doy aceptar y se regresa a la actividad2 con los datos cargados no entiendo por que hace eso
Por el error parece que el Bundle que le estás pasando devuelve un null. Puedes indicar un parámetro por defecto al recibir el Bundle para evitar este tipo de errores.
Si quiero enlazar una activity con otra al momento de que regrese a esta pantalla ¿el reinicio de esta sera automatico?, quiero decir que solo hace falta que regrese a la pantalla y listo no nececita de mas codigo.
No se reiniciará del todo a no ser que ya no exista, si se va de una Activity A a una Activity B y se vuelve a la Activity A, siempre la Activity A en este caso pasará por onStart() (pero no por onCreate() pues ya está creada)
Un Activity es: Algo enfocado a lo que el usuario puede hacer (de ahí que sea una “Actividad”). Por lo que interactúa con el
usuario directamente. Es la ventana que llena a toda la aplicación, que contiene a la interfaz de usuario. Si
cambiamos de ventana cambiaremos de Activity. el cual Trae con sigo una vista y una clase java la cual es el complemento de una aplicacion simple.
Muy buena explicación Abraham. Ahí queda para todo desarrollador que la necesite 🙂
Muy bien explicado! EXCELENTE! me sirvio bastante..Los felicito
Podrías decirme ke tengo ke hacer para evitar el pausado al apagar la pantalla
El pausado de la Activity no se puede evitar, es el ciclo de vida de la Activity. Si lo que quieres es que continue alguana ejecución si la aplicación (la Acitivity) no esté en pantalla, lo que tienes que utilizar es Service.
Que buen contenido se agradece infinitamente. Es una manera extraordinaria de explicar algo que se hace tan complejo de entender cuando sólo se ve código. Muchas felicidades.
Gracias por las felicitaciones Manuel.
Muchos ánimos con Android, verás que es apasionante 🙂
Hola!!! Tengo un problema… estoy realizando una aplicación en la que requiero manejar 6 activities diferentes. Cuando paso de la MainActivity a la siguiente actividad no hay problema pero cuanado paso de la segunda a la tercera no lo hace el programa. No se cual sea el problema, pues al ponerle un toast en el boton para pasar a la tercer actividad funciona bien, pero cuando llama la clase Intent no me llama la 3 actividad, se produce un error en la aplicacion y se sale de la actividad.
Hola tengo una duda sobre cuales son los entornos de desarrollo integrado compatibles para Android, Ios y Windows phone, espero puedan ayudarme gracias…
Para Android puro tienes Android Studio en http://developer.android.com/intl/es/sdk/index.html
Para diseñar aplicaciones multiplataforma puedes mirar:
mmmmm…no me queda del todo claro…
Mira. Mi problemita es el siguiente:
Estoy enviando datos desde la Activty_1 hacia la Activity_2
En la Activity_1 tengo lo siguiente:
public static String EXTRA_ID_PROVEEDOR = "extra.id.proveedor";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.proveedores_lista_activity);
…
Intent actDetalleProveedor = new Intent(ListaProveedores.this, DetalleProveedor.class);
actDetalleProveedor.putExtra(EXTRA_ID_PROVEEDOR, proveedorActual.getIdProveedor());
startActivity(actDetalleProveedor);
}
En la Activity_2 recupero los datos así:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detalle_proveedor);
Intent intent = getIntent();
setTitle(intent.getStringExtra(ListaProveedores.EXTRA_ID_PROVEEDOR));
}
El problema es que cuando regreso a la Actividad_1 el valor de EXTRA_ID_PROVEEDOR se ha destruído y no vuelve a cargar los datos en mi listado.
¿Qué ocurre? ¿Por qué se destruyen los valores?
Puede que se deba a que en algún lugar se modifica. Entiendo que EXTRA_ID_PROVEEDOR lo quieres como valor de texto global y constante. Prueba a añadirle «final» a la variable.
Tengo una pregunta, cuando le damos al boton atras mientras estamos en la actividad hacer flexiones, dicha actividad (flexiones) se destruye, o se pausa?
Las dos cosas 😀
Se destruye pero pasa por el estado de pausa.
Aunque puedes cambiar esta política por defecto para que no se destruya al pulsar para atrás y se reordene la pila de Activities con:
miIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(miIntent);
(Más info de los flags: http://developer.android.com/intl/es/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT)
aaa estoy en android studio
hola. oie podrias ayudarme??.
tengo un minijuego el cual te muestra una pantalla con un fondo y con musica y un solo boton . al presionar el boton"JUGAR" te manda a otra actividad a otra pantalla la cual inserte un fondo de una cancha de futbol y agrege un objeto , un balon de futbol y al mover mi celular android de un lado a otro se mueve el balon pero el problema esq el balon al mover mi dispositivo se sale de la imagen q puse como cancha y ya no se ve el balon. como o con que funcion puedo que mi objeto no se salga de la pantalla ya que se pierde y como agrego otra musica ami otra pantalla??
Si utilizas imágenes sobre ImageViews como tal tendrás que detectar el fin de pantalla y mirar si es mayor que la pantalla rebotar o hacer la lógica que tengas que hacer. Para la música tienes que controlar el ciclo de vida de MediaPlayer, te recomiendo que eches un vistazo a http://developer.android.com/intl/es/guide/topics/media/mediaplayer.html
Hola muchas gracias por el tutorial :), disculpe, una pregunta, cómo podría habilitar los botones fuera del método onCreate después de realizar una tarea?, de antemano se lo agradesco mucho. Saludos
Hola Leo. Puedes crear un método fuera del onCreate, aunque tendrá que estar llamándose dentro de este para que los eventos asignados a vistas de botones se encuentren al crearse.
Hola, ok muchas gracias Ramon, lo aplicaré y ya comento los resultados
A pesar del tiempo del articulo, es una explicacion muy buena. Gracias por compartir este tutorial!!
Si tengo 2 o más imágenes, cada una con un OnClick método en mi primera actividad y quiero que mi segunda actividad reciba cada una de esas imágenes, al hacer click en las imágenes de mi primera actividad.
Que tengo que hacer?
Puedeayudarmeme ?
Hola Jose. Tienes varias maneras, puedes pasar la imagen Serializada de una Actividad a otra como Bitmap, o puedes pasar su Id o referencia a memoria y luego recuperarla. Tienes ejemplos de como hacer esto en nuestro libro gratuito de Android en http://jarroba.com/libro-android-100-gratis/
Hola que tal, puedo capturar el evento clic de todo el layout?
lo que quiero es ejecutar una funcion cuando se toque cualquier parte de la pantalla, sin importar los controles que tenga, en micaso solo una imagen
salu2!
Puedes, tan solo tienes que ponerle un id al layout desde el fichero xml de la vista, obtenerlo en java con el findViewById, y luego como cualquier botón escuchar su setOnClickListener (nota: si tienes más botones dentro de este layout podrías tener problemas; una posible solucción a este problema te la contamos en http://jarroba.com/expansion-listview/)
¡¡Por fin un Tuto hecho por una persona que sabe explicar!!
Muy bueno todo,
Gracias por tu generoso aporte, estoy empezando a introducirme en programacion para android y la informacion que compartes es una joya. sos un astro. En serio gracias por tomarte el tiempo de explicar todo con tanto detalle.
De nada Jorge, todo lo que podamos ayudar 🙂
Excelente tuto! Muchas gracias! 😀
Excelente Tutorial. De lo mejor que he visto hasta ahora.
Muchas gracias por ser tan generosos!
Saludos desde Córdoba, Argentina.
gracias señores por sus aportes muy bien explicado
Hola amigo, excelente explicación.
Tengo una duda…
Como manipulo los widgets o view de una actividad en otra.
Ejemplo desde la actividad1 cambiar el nombre del TextView de la actividad2
De antemano gracias.
Hola Victor,
justo de eso tienes ejemplos de código completo en nuestro libro gratuito de Android http://jarroba.com/libro-android-100-gratis/ 😉
Hola Ramon tengo que decirte que soy nuevo en esto de la programacion de aplicaciones y estoy elaborando un proyecto pero para ello necesito saber acerca de las imagenes que voy a introducir a mi aplicación en que formato, resolución, tamaño tengo que preparar para no tener problemas posteriores, y cual es las funcion o modulo que debo saber para que el usuario dentro de mi aplicacion pueda agrandar las imagenes o texto que se vea, muchas gracias de antemano. Saludos
Hola Nelson, todo lo que necesitas saber de las imágenes de Android lo tienes explicado en nuestro libro gratuito en http://jarroba.com/libro-android-100-gratis/
Hola. Soy nuevo en esto.
Mi pregunta es, si obligatoriamente una actividad secundaria, que hace traspaso de información, tiene que estar asociada a un layout, o si puede, esta segunda actividad usar el layout de la primera actividad.
Muchas gracias
Puede usar el Layout de la primera Activity, cada Activity tendría el mismo Layout (pero diferente instancia cada uno). Si quieres que se mantenga el estado, obligatoriamente tienes que pasar la información de una Activity a otra y cargarla.
gran artículo me ha ayudado mucho.
HOLA!!! soy novato en la programacion de app, he seguido paso por paso tu tutoreal, pero al momento de generar el apk me sale el siguiente error:
Error:(17) Error: This class should provide a default constructor (a public constructor with no arguments) (app.android.sysjm.tiendaonline.Contenedor) [Instantiatable]
—
public class Contenedor {
private int imageView;
private String textView_titulo;
private String textView_desc;
public Contenedor(int imageView, String textView_titulo, String textView_desc){
this.imageView = imageView;
this.textView_titulo = textView_titulo;
this.textView_desc = textView_desc;
}
—
Gracias por tu ayuda….
Hola Jesús,
se te ha olvidado iniciar al padre «super();» en el constructor. Si estás utilizando Activity no utilices constructor mejor, su constructor es el método onCreate().
Muy buena entrada ! Gracias !
Muy bueno, estoy muy agradecido por los conocimientos que brindan
Muchisimas gracias por tan interesantes y buenos articulos sobre Android.
Nos ayudan mucho a los que estamos empezando (y continuando) con esto..
Una duda:
A mitad del articulo se afirma:
«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.»
Lo cual me ha dejando patinando y me he ido a buscar por internete. En este enlace explican MVC en Android de una manera muy clara:
Layout es la Vista, Activity es el Controlador (responde a eventos, conecta con el modelo, ..) y en este ejemplo no hay Modelo, pero dependiendo de que rumbo tomara la aplicación (ahora solo es un ejemplito), podria ser por ejemplo la clase «Deportista», objeto Java que mapea registros la BD de «Deportistas», o algo por el estilo..
Espero haber contribuido más que haber liado.. Muchas gracias!
http://www.proyectosimio.com/programacion-android-base-de-datos-i-modelo-vista-controlador/
Hola Pakosis,
Pongo MVC por no extender más el artículo, pero si estás interesado, Android trabaja más MVP (Modelo Vista Presentado. Puedes ver información del MVP en: http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter) que con MVC. Por ello que el controlador queda más difuso por la arquitectura de Android.
Y gracias por la contribución, cualquier ayuda a la comunidad de desarrolladores siempre se agradece 😉
Gracias por la información, estoy retomando la programar en android despues de bastante tiempo y sus aportes son muy buenos, suerte y que sigan así.
Gracias por tan excelente Tutorial, muy bien explicado facil de entender para novatos como yo y muchas gracias por el trabajo que has hecho felicitaciones enserio gracias estoy aprendiendo mucho
Gracias por los ánimos Jose. Estamos preparando algo que pronto daremos a conocer y seguro que te es de mucha utilidad 😉
¡Gran explicación!.
Es algo larga, pero necesaria.
Enhorabuena y seguid así.
Muy bueno el tutorial desde paraguay 😀
Pero bueno Ramón!! pedazo de blog os habeis currado jajaja estoy aquí buscando una cosa de android y me encuentro con tu cara!!! jeje, un saludo y de paso una pregunta, tngo ya un asyntask qme busca y me coloca unos datos en el mapa, pero tengo un problema, tengo que tener la aplicación siempre abierta, como se abra x ejemplo el whatsapp, o entre una llamada, al volver a abrir mi aplicación empieza desde el principio ¿tienes alguna idea de cómo podría hacer que siguiera funcionando aunque no se esté mostrando? con services o algo?
Muy buenas Elena, que agradable sorpresa encontrarte por aquí 🙂
En respuesta a tu pregunta depende de lo que necesites funcionando. Si lo que quieres es que al volver no se reinicie la activity, tienes que controlar el ciclo vida y guardar estado si Android la detiene, para luego recuperar estado al (Para esto puedes usar el almacenamiento de datos, echa un vistazo en http://developer.android.com/guide/topics/data/data-storage.html). Si lo que quieres es que siga ejecutando el hilo en segundo plano aunque la activity ya no esté en pantalla (ni la aplicación tampoco), has acertado, necesitas un Service para mantener el funcionamiento (tienes ejemplos en http://developer.android.com/guide/components/services.html)
Cualquier cosa me dices.
buenas excalente amigo puede entender muchas cosas que en otras paginas o inclusive cursos no me quedaba claro eres muy bueno explicando te agradezco mucho espero sigas subiendo mas articulos de Android mas ejemplos y todo eso ya que me gusta mucho leer todo lo que pones ya que es bastante entendible excelente !!!
Genial en verdad, muy clara la exposición de las ideas, con destellos de humor (como cuando dice acerca del xml que se explicara en otro tutorial, pero aqui «nos lo creemos» jeje, o en el primer diagrama: «falsa alarma, los de la ambulancia nos han puesto una pomada y continuamos» jeje ) que hacen agradable y entretenida la lectura.
La forma de introducir poco a poco el diagrama oficial por medio de una actividad perfectamente común (el correr) es soberbia, me ha quedado clarísimo el concepto.
El único problema que yo veo es: ¿por qué no todos los tutoriales en internet son como este?
Saludos!
Buenas RoNiStark,
primero, gracias por el comentario, ya que son estos los que nos hacen seguir cada día mejorando el contenido de la Jarroba 🙂
esa misma duda nos saltó a nosotros. El principal problema es que la mayoría de las webs están explicadas de una manera muy técnica, monótona y aburrida; cuando esto no tiene porqué ser así, se puede hacer divertido lo técnico y emocionante su estudio. Por ello, creemos desde Jarroba, que es mejor hacer tutoriales que no hemos encontrado en otro lugar de Internet y en Español, de la manera como nos hubiera gustado que nos lo explicaran a nosotros. En caso de que encontremos tutoriales muy buenos (y hay muchos), simplemente los referenciamos ¿Para qué hacer dos veces lo mismo?
Nos seguiremos esforzando en ofrecer contenido de la mejor calidad, explicado de una manera diferente, y de lo último en tecnología para desarrolladores completamente gratis 😀
Un grandísimo aporte!
Estoy comenzando con esto de las APP y lejos la mejor explicación al detalle sobre una activity y como trabajar sobre ella está aquí.
Mil gracias!
Muchisimas gracias por el articulo. He terminado la carrera y he aprendido C y java, me viene muy bien este otro lenguaje
Solo tengo una duda. Al final, en el ciclo de vida completo; solo hay que sustituir la actividad de correr? Esque la he sustituido, pero lo simulo y me sigue saliendo la misma aplicacion….
Gracias
Muy buenas Richel,
la última nota, en la que aconsejamos sustituir el código, es para trastear con él y ver como va pasando por las diferentes partes del ciclo de vida. Con ese código en apariencia en el emulador te va a salir lo mismo, pero en el log podrás ahora apreciar como aparece texto.
Buenas Ramon, lo he probado tal y como has dicho y todo perfecto. Seguire trasteando 🙂
Muchas gracias!!
Excelente explicación, larga pero valiosa.
Gracias por tus aportes, realmente esto de los activities jamas lo habia entendido y ahora me quedo clarisimo.
Pero me quedo una duda. Realice el ejemplo en android studio y la seccion de configuracion del AndroidManifest.xml no la encuentro. ¿Tu sabes como llegar a esa seccion?.
saludos.
Buenas Raul,
Para encontrar los ficheros de Android en Android Studio, vamos a la izquierda a la pestaña «Project». Buscamos nuestro proyecto, desplegamos su ruta de directorios y buscamos la carpeta «src» y luego «main». Ahí están los ficheros que conforman un proyecto en Android tanto en Android Studio como en Eclipse. Para esto hemos actualizado la entrada: http://jarroba.com/introduccion-a-android-studio-video/
Si te refieres a que no están las pestañas de configuración sencillas. Lamentablemente estamos en una versión beta en la que todavía no tienen implementado el editor. Es esperable que implementen esta carencia y otra versiones de Android Studio.
gracias por la respuesta.
En efecto, la sección de configuración del AndroidManifest.xml en Android Studio no se encuentra. Asi que para motivos de hacer funcionar el ejemplo, utilize la poco ortodoxa accion de copiar y pegar el android manifest, (obviamente reemplazando mis clases y los datos de mi ejemplo) y ha funcionado perfecto.
Saludos y gracias por la ayuda.
exelente aporte muy buena pagina saludos y espero que se siga con este proyecto
Gracias por tan excelente Tutorial, estoy incursionando en este mundo de Android y buscando en la red encontré está página, me pasaré seguido por acá para seguir en este mundo de la programación. muchas gracias. Saludos desde Colombia.
Más son los agradecimientos a nuestros lectores, que encuentran en Jarroba un nuevo lugar para aprender. Aprender conceptos muy avanzados pero de una manera amena, fáciles de comprender y con una información completa de los temas a tratar. Seguiremos mejorando 😉