2010-06-23 17 views
45

Duplicar posible:
Quitting an application - is that frowned upon?¿Cómo matar una aplicación con todas sus actividades?

Quiero ofrecer al usuario una opción para salir de la aplicación, ya que necesito para eliminar algunos datos sensibles, que se almacena en los SharedPreferences, siempre y cuando la aplicación lo necesita

Tan pronto como el usuario desee salir, la contraseña en SharedPreferences debe borrarse y, por supuesto, todas las actividades de la aplicación deben cerrarse (no tiene sentido ejecutarlas sin la contraseña conocida; se bloquearían).

¿Cómo puedo hacer eso?

System.exit(0) y finish() solo salga de la actividad actual - inútil. Sé que hay una aplicación taskmanager. ¿Cómo lo está haciendo uno? Es capaz de matar a toda la aplicación ...

Respuesta

3

Mi comprensión del marco de aplicaciones de Android es que esto no está específicamente permitido. Una aplicación se cierra automáticamente cuando no contiene más actividades actuales. Intentar crear un botón "matar" aparentemente es contrario al diseño previsto del sistema de aplicación.

Para obtener el tipo de efecto que desea, puede iniciar sus diversas actividades con startActivityForResult() y hacer que el botón de salida envíe un resultado que indica a la actividad principal que finalice(). Esa actividad podría enviar el mismo resultado como parte de su onDestroy(), que volvería en cascada a la actividad principal y no daría lugar a actividades de ejecución, lo que provocaría el cierre de la aplicación.

7

que se almacena en los SharesPreferences, siempre y cuando la aplicación lo necesita.

¿Por qué?

Tan pronto como el usuario quiere salir, la contraseña en los SharedPreferences se deben limpiar y por supuesto todos los actividades de la aplicación debe estar cerrado (no tiene sentido para ejecutar ellos sin la conocida contraseña: se bloqueará).

Mejor aún: no ponga la contraseña en SharedPreferences. Sosténgalo en un miembro de datos estáticos. Los datos desaparecerán de forma natural cuando se salgan todas las actividades de la aplicación (por ejemplo, el botón ATRÁS) o se destruirán (por ejemplo, expulsados ​​de la memoria RAM para dejar espacio para otras actividades después de que el usuario presionó INICIO).

Si desea algún tipo de "contraseña de descarga" proactiva, simplemente configure el miembro de datos estáticos en null y haga que sus actividades controlen a ese miembro y tome las medidas adecuadas cuando sea null.

+0

Gracias. Eso funcionó, pero tan pronto como se produzca un bloqueo en cualquier actividad y será NULL, incluso otras actividades seguirán allí. Bueno, está bien ... Supongo que está bien – Nils

6

Usando onBackPressed() método:

@Override 
public void onBackPressed() {  
    android.os.Process.killProcess(android.os.Process.myPid()); 
} 

o utilizar el método finish(), tengo algo así como

//Password Error, I call function 
    Quit();    


    protected void Quit() { 
     super.finish(); 
    } 

Con super.finish() cierra la actividad de la superclase.

+0

TNX para esto Criss

32

Tiene razón: llamando al finish() solo saldrá de la actividad actual, no de toda la aplicación. sin embargo, hay una solución para esto:

Cada vez que inicie una actividad, iníciela usando startActivityForResult(...). Cuando se desea cerrar toda la aplicación, se puede hacer algo como esto:

setResult(RESULT_CLOSE_ALL); 
finish(); 

a continuación, definir onActivityResult(...) de devolución de llamada de todas las actividades de modo que cuando una actividad regresa con el valor RESULT_CLOSE_ALL, también llama finish():

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch(resultCode) 
    { 
    case RESULT_CLOSE_ALL: 
     setResult(RESULT_CLOSE_ALL); 
     finish(); 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 

Esto causará un efecto de cascada que cierra todas las actividades.

Además, apoyo a CommonsWare en su sugerencia: almacene la contraseña en una variable para que se destruya cuando la aplicación se cierre.

+0

Me ayudó mucho @mtmurdock. Muchas gracias por esta solución – praveenb

+0

RESULT_CLOSE_ALL no se puede resolver con una variable – hamish

+0

Busqué en Google y encontré un par de personas que usaban public static final int RESULT_CLOSE_ALL = 0; – hamish

12

Cuando el usuario desea salir de todas las actividades abiertas, debe presionar un botón que carga la primera actividad que se ejecuta cuando se inicia la aplicación, en mi caso "LoginActivity".

Intent intent = new Intent(getApplicationContext(), LoginActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.putExtra("EXIT", true); 
startActivity(intent); 

El código anterior borra todas las actividades a excepción de LoginActivity. LoginActivity es la primera actividad que se inicia cuando el usuario ejecuta el programa. A continuación, coloque este código dentro de onCreate de LoginActivity, para indicar cuándo debería autodestruirse cuando se pase el mensaje 'Exit'.

if (getIntent().getBooleanExtra("EXIT", false)) { 
     finish(); 
    } 

La respuesta que se obtiene a esta pregunta desde la plataforma Android es: "No haga un botón de salida actividades de acabado el usuario ya no quiere, y el gerente de actividad se limpiarlos como lo considere oportuno.. "

+0

buena solución, pero no es un gasto general para iniciar la nueva actividad ... – aProgrammer

+3

Sí, pero recuerde, Android intenta muy duro no dar a los programadores la capacidad de crear un botón de "salida" para sus aplicaciones. Así que debes engañar al lenguaje para que te permita salir de la aplicación, arrastrándote lentamente, haciéndolo pensar que solo quieres detener algunas actividades, luego sigilosamente hacia el comando final, dejando que la última actividad termine. Es como pasar por delante de un guardia de seguridad distrayéndolo, y luego corriendo cuando no está mirando. –

84

Cuando utiliza el método finish(), no cierra el proceso completamente, TODAVÍA está funcionando en segundo plano.

Utilice este código en Actividad Principal (Por favor, no utilizar en cada actividad o actividades sub):

@Override 
public void onBackPressed() { 

    android.os.Process.killProcess(android.os.Process.myPid()); 
    // This above line close correctly 
} 
+1

¡WoW, dirección correcta! Gracias – Ponmalar

+13

Esto matará el proceso, pero no necesariamente matará la tarea en la memoria. Por lo tanto, cuando la aplicación se reinicie, la pila de actividades (tarea) se volverá a crear desde la última vez. –

+4

Sí, no me gusta esta solución en absoluto. La eliminación del proceso le quita cualquier oportunidad que haya tenido de guardar datos o finalizar cualquier tarea pendiente. Esta es la forma más contundente del hombre de las cavernas para cerrar su aplicación y debe evitarse a toda costa. – mtmurdock

Cuestiones relacionadas