¿Cómo matar una aplicación con todas sus actividades?

Posible duplicado:
Salir de una aplicación, ¿es eso desaprobado?

Quiero ofrecerle al usuario la opción de salir de la aplicación, ya que necesito eliminar algunos datos confidenciales, que se almacenan en las Preferencias Compartidas siempre que la aplicación lo necesite.

Tan pronto como el usuario quiera salir, la contraseña en las Preferencias Compartidas 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 salen 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 …

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

Utilice este código en la actividad principal (no lo use en todas las actividades o actividades secundarias):

 @Override public void onBackPressed() { android.os.Process.killProcess(android.os.Process.myPid()); // This above line close correctly } 

Estás en lo correcto: llamar a 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, startActivityForResult(...) usando startActivityForResult(...) . Cuando desee cerrar toda la aplicación, puede hacer algo como esto:

 setResult(RESULT_CLOSE_ALL); finish(); 

Luego, defina la callback onActivityResult(...) cada actividad para que cuando una actividad regrese con el valor RESULT_CLOSE_ALL , también llame a 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.

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 progtwig. 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 a esta pregunta de la plataforma Android es: “No hagas un botón de salida. Termina las actividades que el usuario ya no quiere y el administrador de actividades las limpiará como lo considere conveniente”.

que se almacena en SharesPreferences siempre que la aplicación lo necesite.

¿Por qué?

Tan pronto como el usuario quiera salir, la contraseña en las Preferencias Compartidas 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).

Mejor aún: no coloque 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 (p. Ej., Expulsados ​​de la memoria RAM para dejar espacio para otras actividades después de que el usuario presione HOME).

Si desea algún tipo de “contraseña de vaciado” proactiva, simplemente establezca el miembro de datos estáticos en null , y haga que sus actividades verifiquen ese miembro y tomen las medidas apropiadas cuando sea null .

Usando el método onBackPressed() :

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

o use el método finish() , tengo algo como

 //Password Error, I call function Quit(); protected void Quit() { super.finish(); } 

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

Mi comprensión del marco de aplicaciones de Android es que esto no está permitido específicamente. 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 indique 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.