Ayuda con un Código para confirmar salida de una app

5,915 views
Skip to first unread message

Ruben Dario Gutiérrez

unread,
Apr 26, 2012, 3:39:05 AM4/26/12
to desarrollad...@googlegroups.com

Hola a todos,


Escribo para ver si alguno de los amigos del foro me ayuda con un problema.

Estoy haciendo una aplicación que debe indicarle al usuario si desea salir de esta en el caso que estando en la Actividad inicial toque el botón Back

Algo así estando en la actividad Principal de la aplicación el usuario presiona el botón back, entonces aparece un cuadro de dialogo que le pregunta si realmente desea salir de la aplicación o no, si el usuario presiona si por supuesto sale, y  si le da al botón No permanece en la aplicación.

Buscando en google conseguí un código que precisamente hace eso, yo soy muy novato en esto de programar en Android, así que coloque el código en la actividad principal de mi aplicación y no ocurre nada, cuando le presiono el botón Back simplemente me salgo de al aplicación.

Probé crear una aplicación totalmente nueva con solo una actividad que dice hello world y cuando uso el botón Back si funciona el código, adjunto imagen para que lo vean.

Aquí esta también el código de ambas actividades.

La que funciona
-----------------------------------------------------------------------------------------

package net.adrenalinae.cerrar;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.KeyEvent;

public class TheActivityActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
        
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
     if (keyCode == KeyEvent.KEYCODE_BACK) {
      new AlertDialog.Builder(this)
         .setIcon(android.R.drawable.ic_dialog_alert)
         .setTitle("Salir")
         .setMessage("Estás seguro?")
         .setNegativeButton(android.R.string.cancel, null)//sin listener
         .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {//un listener que al pulsar, cierre la aplicacion
           @Override
           public void onClick(DialogInterface dialog, int which){
             //Salir
            TheActivityActivity.this.finish();
           }
         })
         .show();
       // Si el listener devuelve true, significa que el evento esta procesado, y nadie debe hacer nada mas
       return true;
     }
    //para las demas cosas, se reenvia el evento al listener habitual
     return super.onKeyDown(keyCode, event);
   
    }
}

---------------------------------------------------------

La que no funciona

package com.adrenalina.lavinotinto;
 
import android.app.AlertDialog;
import android.app.TabActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
 
public class AndroidTabLayoutActivity extends TabActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
             
 
        TabHost tabHost = getTabHost();
        
     // Tab for Inicio
        TabSpec iniciopec = tabHost.newTabSpec("Inicio");
        iniciopec.setIndicator("Inicio", getResources().getDrawable(R.drawable.icon_inicio_tab));
        Intent inicioIntent = new Intent(this, InicioActivity.class);
        iniciopec.setContent(inicioIntent);
 
        // Tab for Futbol
        TabSpec futbolpec = tabHost.newTabSpec("Futbol");
        // setting Title and Icon for the Tab
        futbolpec.setIndicator("Futbol", getResources().getDrawable(R.drawable.icon_futbol_tab));
        Intent futbolIntent = new Intent(this, FutbolListViewNavegacion.class);
        futbolpec.setContent(futbolIntent);
 
        // Tab for Media
        TabSpec mediapec = tabHost.newTabSpec("Media");
        mediapec.setIndicator("Media", getResources().getDrawable(R.drawable.icon_media_tab));
        Intent mediaIntent = new Intent(this, MediaListViewNavegacion.class);
        mediapec.setContent(mediaIntent);
 
        // Tab for Clasifi
        TabSpec clasifipec = tabHost.newTabSpec("Clasif");
        clasifipec.setIndicator("Clasif", getResources().getDrawable(R.drawable.icon_clasifi_tab));
        Intent clasifiIntent = new Intent(this, ClasifListViewNavegacion.class);
        clasifipec.setContent(clasifiIntent);
        
        // Tab for Calend
        TabSpec calenpec = tabHost.newTabSpec("Calend");
        calenpec.setIndicator("Calend", getResources().getDrawable(R.drawable.icon_calend_tab));
        Intent calenIntent = new Intent(this, CalendActivity.class);
        calenpec.setContent(calenIntent);
 
        // Adding all TabSpec to TabHost
        tabHost.addTab(iniciopec); // Adding inicio tab
        tabHost.addTab(futbolpec); // Adding futbol tab
        tabHost.addTab(mediapec); // Adding media tab
        tabHost.addTab(clasifipec); // Adding clasifi tab
        tabHost.addTab(calenpec); // Adding calend tab
        
    }  
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
  if (keyCode == KeyEvent.KEYCODE_BACK) {
   new AlertDialog.Builder(this)
      .setIcon(android.R.drawable.ic_dialog_alert)
      .setTitle("Salir")
      .setMessage("Estás seguro?")
      .setNegativeButton(android.R.string.cancel, null)//sin listener
      .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {//un listener que al pulsar, cierre la aplicacion
        @Override
        public void onClick(DialogInterface dialog, int which){
          //Salir
        AndroidTabLayoutActivity.this.finish();
        }
      })
      .show();
    // Si el listener devuelve true, significa que el evento esta procesado, y nadie debe hacer nada mas
    return true;
  }
//para las demas cosas, se reenvia el evento al listener habitual
  return super.onKeyDown(keyCode, event);
  }  

}

--------------------------------------------------------------------------------------------------------------
Envió archivo adjunto de la actividad que si funciona.

Cualquier ayuda que me puedan brindar se las agradeceré.

Rubén D. Gutiérrez S.


codig boton atras funcionando.jpg

Juan de Dios Maldonado Sánchez

unread,
Apr 26, 2012, 7:50:45 AM4/26/12
to desarrollad...@googlegroups.com
Eso que estás haciendo carece de sentido en la plataforma Android, ya que si estás en la actividad principal y pulsas BACK, todo el mundo sabe que saldrá de la aplicación.

Fíjate bien las guías que da Google acerca de eso aquí:

--
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/desarrolladores-android?hl=es.



--
An'Brain - Prueba el nuevo widget inteligente para tu Android.
Idiotizer Free - Idiotiza a tus amigos. (Se requieren auriculares)
Track My App - Realiza un seguimiento de tus aplicaciones en el Android market.

Juan de Dios Maldonado Sánchez

unread,
Apr 26, 2012, 7:52:43 AM4/26/12
to desarrollad...@googlegroups.com
Con "si estás en la actividad principal y pulsas BACK, todo el mundo sabe que saldrá de la aplicación" quiero decir que si has pulsado BACK tantas veces como para dejar el historial de esa actividad vacío, y llegas a la principal, si vuelves a pulsar BACK, saldrás. 

Jimmy Collazos || acido || cuatroxl.com

unread,
Apr 26, 2012, 8:24:16 AM4/26/12
to desarrollad...@googlegroups.com
Off-Topic
------------

¿A qué lumbreras se le ocurrió poner el botón de Back?

Parece que después de tantos años con el botón de back en el navegador (que es el único sitio donde tiene algo de sentido, aunque a veces lo dudo) ya teníamos bastante; pero no, lo tenían que poner también ele móvil.


--
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::: J i m m y  C o l l a z o s :::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Maximiliano Aringoli

unread,
Apr 26, 2012, 8:26:43 AM4/26/12
to desarrollad...@googlegroups.com

Jimmy maestro de maestros.

--

Juan de Dios Maldonado Sánchez

unread,
Apr 26, 2012, 8:28:05 AM4/26/12
to desarrollad...@googlegroups.com
Una vez te acostumbras, es lo mejor que hay.

El otro día cogí mi iPod Touch (no lo había tocado en años) y me costó un montón navegar por las pantallas del mismo. :)

--
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/desarrolladores-android?hl=es.

Ehison de Jesus Perez Benedetti

unread,
Apr 26, 2012, 8:55:57 AM4/26/12
to desarrollad...@googlegroups.com
Y por ultimo amigo recuerda que el ese boton no es usado en si para cerrar las aplicaciones si no que mantiene esta en un segundo plano y solo pulsando el boton home te aprecera todas las aplicaciones q tienes en segundo plano y podras ejecutar nuevamente la misma y estar en el mismo sitio.

Lo que te puedo recomendar es que los botones de salir son usados principal en los juegos ya que estos consumen muchos recursos del telefono.

Juan de Dios Maldonado Sánchez

unread,
Apr 26, 2012, 9:29:13 AM4/26/12
to desarrollad...@googlegroups.com
No, Ehison.

El botón BACK sirve para cerrar la actividad actual. (Destruyéndola)

Es el botón HOME el que al pulsarlo, dejas la actividad en segundo plano.

Jimmy Collazos || acido || cuatroxl.com

unread,
Apr 26, 2012, 10:09:56 AM4/26/12
to desarrollad...@googlegroups.com
Personalmente creo que trae más lío (usuario y desarrolladores) a la usabilidad del sisitema. Para darse cuenta del lío sólo hay que leerse la documentación del propio Android: http://developer.android.com/design/patterns/navigation.html

Hay escenarios que el botón de Back funciona perfecto:
PreferenceActivity y PopUps

Fuera de esos escenarios no tiene razón de ser; desde mi humilde opinión

Juan de Dios Maldonado Sánchez

unread,
Apr 26, 2012, 10:20:21 AM4/26/12
to desarrollad...@googlegroups.com
Desde tu humilde opinión después de haber utilizado un iPhone o similares... ¬¬
La cosa es acostumbrarse. Una vez te acostumbras, lo ves lo más normal del mundo.

--
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/desarrolladores-android?hl=es.

yeray

unread,
Apr 26, 2012, 10:25:50 AM4/26/12
to desarrolladores-android
Creo que si se puede hacer lo que dice Ruben. Yo tengo vario juegos
que al pulsar back me pregunta si realmente quiero salir.

Ruben Dario Gutiérrez

unread,
Apr 26, 2012, 10:25:57 AM4/26/12
to desarrollad...@googlegroups.com

Gracias a todos por sus respuestas y por las rcomendaciones.
Esto es un requerimiento de un posible cliente, y cuando me lo pidieron, educadamente les dije lo mismo, que me parecia inutil esa función.
Pero el cliente tiene un equipo de desarrollo interno y con ejemplos en mano como el que les envió en imagen adjunta insistieron en que deseaban esa función. Y ya saben el dicho el cliente siempre tiene la razón.

A ver si me entendieron yo no estoy queriendo colocar un boton Back virtual en la interface, sino que la actividad Principal alerte al Usuario que va a salir de la aplicación. Ejemplo de esto lo vemos en la aplicacíon Hook Messenger.

YA el código lo tengo porque realmente funciona en el ejemplo de actividad simple, pero al insertarlo en la app real no me funciona, por supuesto esto se debe a que soy un super novato en esto de la programación Android y por eso recurro a sus conocimientos.

Una vez más gracias por su tiempo.

Ruben

--
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/desarrolladores-android?hl=es.



--
htp://www.adrenalinaestudio.net
Servicios De Diseño y Hospedaje Web Profesional


Juan de Dios Maldonado Sánchez

unread,
Apr 26, 2012, 10:31:56 AM4/26/12
to desarrollad...@googlegroups.com
Pues yo mandaría a freír espárragos al cliente y me negaría a hacerlo.

Gracias a estas cosas nos encontramos con aplicaciones que tienen un comportamiento diferente en la plataforma. Deprimente... :(

Jimmy Collazos || acido || cuatroxl.com

unread,
Apr 26, 2012, 10:36:02 AM4/26/12
to desarrollad...@googlegroups.com
En mi defensa diré que jamás tuve nada de Apple :D

Pero si que tengo los huevos pelados de la mierda del "back-buttom" del navegador. Y si, los clientes son unos putos inútiles que siempre andan pidiendo tonterías de "porque sale de la aplicación si le doy a este boton..."

Julio Galeano

unread,
Apr 26, 2012, 10:35:50 AM4/26/12
to desarrollad...@googlegroups.com
En realidad he sabido por experiencia que el boton BACK sobre la actividad inicial deja la aplicacion en segundo plano ( se puede verificar en Administracion de Aplicaciones, que la app no esta cerrada, el boton de forzar cerrado esta activo), el boton si ejecuta el OnDestroy de la activity pero en realidad no destruye la actividad ( no se porque ), el boton de home solo ejecuta el OnPause.

JC

Ruben Dario Gutiérrez

unread,
Apr 26, 2012, 10:51:57 AM4/26/12
to desarrollad...@googlegroups.com
Claro que se puede Yeray, y por supuesto que se que en una aplicación sencilla como la que estoy haciendo tal función sobra, pero ya saben como tampoco es un cambio tremendo en la estructura de la app prefiero simplemente colocarla y que el cliente vea que se le escucha, claro siempre haciendo la salvedad con mi opinión.

Así que si algunos de ustedes puede revisar el código y decirme donde falla se lo agradeceré mucho.

Ah aqui mando la pantalla de la aplicación Hook para que vean que algunos a pesar de no ser un juego implementan esa función.





El 26 de abril de 2012 10:25, yeray <estais...@gmail.com> escribió:
Creo que si se puede hacer lo que dice Ruben. Yo tengo vario juegos
que al pulsar back me pregunta si realmente quiero salir.
--
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/desarrolladores-android?hl=es.




--
IMAG1734.jpg

Ruben Dario Gutiérrez

unread,
Apr 26, 2012, 10:55:10 AM4/26/12
to desarrollad...@googlegroups.com
LO que pasa Juan es que uno no puede andar mandando a freír esparragos a los clientes, sino que conversa con ellos, y ademas el cliente no es un encorbatado que no sabe nada de android, sino que trabajan todos los días en eso, solo que piden a externos que también le trabajen, y no entiendo porque se encaprichan con esa tontería, pero como ademas me mandan ejemplos de otras aplicaciones de cáracter profesional que lo implementan imaginate.

Juan de Dios Maldonado Sánchez

unread,
Apr 26, 2012, 11:09:46 AM4/26/12
to desarrollad...@googlegroups.com
Jimmy... Pues tú mismo... Aunque yo optaría por convencer al cliente de que si quiere que su aplicación se considere de calidad, esta deberá seguir las pautas que marca Google en el desarrollo de aplicaciones para Android.

Este artículo es también de lectura forzada:

Julio... Tal y como dicen en el artículo del enlace anterior, traduzco:

Desde un punto de vista técnico, el botón BACK manipula la pila de actividades de la aplicación. Pulsar BACK llama a finalizar la actividad activa y la quita de la pila. Si la aplicación tiene una actividad o la actividad actual es la única en la pila (por ejemplo, el usuario ha cerrado todas las otras actividades), el botón BACK cerrará la aplicación.

El comportamiento después de pulsar BACK o HOME pueden parecer muy similar al usuario, sin embargo, desde un punto de vista técnico son muy diferentes. BACK terminará la actividad, pero HOME la moverá a un segundo plano.

Rubén... Lo que le he dicho a Jimmy y añado lo que dice el artículo anterior, que el mostrar un mensaje de confirmación para salir de la aplicación debería usarse sólo cuando se den las siguientes condiciones:
- Cuando no sea posible guardar el estado de la aplicación.
- Cuando el salir de la aplicación pueda hacer que el usuario pierda su trabajo.

Y digo yo... Si mientras estás en la aplicación (que pide salir con un diálogo de confirmación) pulsas HOME, accedes a una notificación que te acaba de llegar, o te llaman por teléfono... ¿También vas a hacer que te pregunte si quieres dejar la aplicación? ... ¬¬

Ruben Dario Gutiérrez

unread,
Apr 26, 2012, 11:29:41 AM4/26/12
to desarrollad...@googlegroups.com
Juan gracias por tu tiempo, lo que estoy haciendo es guiarme por la aplicación Hook que ellos me mandaron como referencia y te cuento lo que hace esta:
-Cuando te llaman, al colgar la llamada la actividad esta todavía presente o activa.
-Cuando le das a HOME  sales sin notificación y al volver esta en la actividad en la cual te encontrabas.
-Y cuando salgo a una notificación igual, al volver estoy en la actividad que deje.

En resumen acuerdo con ustedes que es una función innecesaria, y así se lo he hecho saber, pero siguen empeñados porque ellos lo ven en aplicaciones como esta Hook.

Es el eterno problema con los clientes.

Jc Miñarro

unread,
Apr 26, 2012, 1:15:44 PM4/26/12
to desarrollad...@googlegroups.com
De primeras te digo lo mismo que te han dicho todos los de
la lista, esa función debería estar prohibida !!! XD

Ahora te comento, como estás trabajando con pestañas, es posible
que quien te esté recogiendo el evento de pulsar la tecla back
sean las propias activities que tienes en cada una de las pestañas.
Prueba a sobreescribir el método onKeyEvent(...) en cada una de las
activities que habres en las pestañas a ver si así te funciona.
Un saludo,
Jc Miñarro

-------------------------------------------------------------------------------------------
CarteleraApp - Consulta la cartelera y estrenos de los cines españoles.

Ruben Dario Gutiérrez

unread,
Apr 26, 2012, 2:18:24 PM4/26/12
to desarrollad...@googlegroups.com
Jose Carlos era eso Muchísimas gracias! 

Coloque el codigo en la actividad inicio que es la que se inserta por defecto en la aplicación cuando comienza y funciona bien.
El código que use lo tome del link que me mando Juan de Dios
que es este 
Igualmente envió al cliente y su equipo  de "genios" desarrolladores las apreciaciones de la inutilidad de esta función para que vean que no soy solo yo el que se los dice.

Gracias a todos por su valioso tiempo.

Juan de Dios Maldonado Sánchez

unread,
Apr 26, 2012, 6:06:49 PM4/26/12
to desarrollad...@googlegroups.com
On Thu, Apr 26, 2012 at 8:18 PM, Ruben Dario Gutiérrez <rubenv...@gmail.com> wrote:
Jose Carlos era eso Muchísimas gracias! 

Coloque el codigo en la actividad inicio que es la que se inserta por defecto en la aplicación cuando comienza y funciona bien.
El código que use lo tome del link que me mando Juan de Dios
que es este 
Igualmente envió al cliente y su equipo  de "genios" desarrolladores las apreciaciones de la inutilidad de esta función para que vean que no soy solo yo el que se los dice.

No es porque lo digamos nosotros, sino porque lo dice Google. Todas las aplicaciones dentro del ecosistema Android deberían comportarse de igual forma.

Ruben Dario Gutiérrez

unread,
Apr 26, 2012, 6:21:06 PM4/26/12
to desarrollad...@googlegroups.com
Si eso lo entiendo, yo igual ya les había mandado un artículo donde precisamente un experto de Googles indica eso.

Por cierto si funciona el código en la actividad inicial, pero ahora en las otras actividades cuando le das al botón back simplemente se sale de la app sin solicitar autorización en vez de ir a la actividad anterior.

Mauricio Montilla

unread,
Apr 27, 2012, 2:44:13 AM4/27/12
to desarrollad...@googlegroups.com
Ruben,

Tu problema es que tienes un activity por cada pestaña. Lo suyo es que
tengas una única activity y un layout por pestaña.

En el blog de sgoliver tienen un buen ejemplo sobre como hacerlo
http://www.sgoliver.net/blog/?p=2112

Un saludo,

Mauricio

El día 27 de abril de 2012 00:21, Ruben Dario Gutiérrez

Ruben Dario Gutiérrez

unread,
Apr 27, 2012, 10:00:18 AM4/27/12
to desarrollad...@googlegroups.com
Gracias Mauricio, lo voy a revisar.

juande

unread,
Nov 11, 2012, 2:14:11 PM11/11/12
to desarrollad...@googlegroups.com
Sobre este tema, ya dejé clara mi postura en su momento. Ahora quería aprovechar la ocasión de que hace tres días Reto Meier publicó un vídeo muy interesante en el que habla sobre la opción "Salir" en las aplicaciones de Android.


Esto es algo que todo programador de Android debería conocer. Además de saber inglés. :)

On Saturday, November 10, 2012 4:51:45 PM UTC+1, Elmesias wrote:
Hola, yo también soy novato en la programación en android, acá te dejo un código que lanza un dialogo con lo que necesitas, a mi me funciona: (en API10- Android 2.3.3). La implementacion del método: onBackPressed():

public void onBackPressed(){
        //Pregunta si desea salir
        AlertDialog.Builder dialog = new AlertDialog.Builder(this);
         
        dialog.setMessage(R.string.sMensajeSalida); //muestra mensaje ¿salir?
      
        dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {

         
          @Override
          public void onClick(DialogInterface dialog, int which) {
             finish(); //finaliza la activity. ojo que no finaliza la app.
          }
        });
        dialog.setNegativeButton("No", new DialogInterface.OnClickListener() {

         
           @Override
           public void onClick(DialogInterface dialog, int which) {
              dialog.cancel(); //se cancela la salida
           }
        });
        dialog.show();
       
    }

++++++++++++++++++++++++++++
Espero que te sirva. Salu2.

Jc Miñarro

unread,
Nov 11, 2012, 3:32:16 PM11/11/12
to desarrollad...@googlegroups.com
El propio Reto Meirer ha puesto este podcast también del mismo 
vídeo por si no quieres pasarte 10 minutos viéndole la cara... XD


--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/AmNsS
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
Para ver este debate en la Web, visita https://groups.google.com/d/msg/desarrolladores-android/-/WXTUKDJZeEcJ.
 
 
Reply all
Reply to author
Forward
0 new messages