studio - curso android desarrollo de aplicaciones móviles pdf
Cerrar la aplicación de Android (12)
Antes de hacerlo, lea esta otra question también:
android.os.Process.killProcess(android.os.Process.myPid());
Esta pregunta ya tiene una respuesta aquí:
- ¿Dejar de usar una aplicación desaprobada? 38 respuestas
Sugiera cómo puedo cerrar toda mi aplicación Android con un código de línea.
Ese es uno de los deseos más inútiles de los desarrolladores principiantes de Android, y lamentablemente parece ser muy popular. ¿Cómo se define "cerrar" una aplicación de Android? Ocultar su interfaz de usuario? Interrumpir el trabajo de fondo? Deja de manejar transmisiones?
Las aplicaciones de Android son un conjunto de módulos, incluidos en .apk y expuestos al sistema a través de AndroidManifest.xml. Las actividades se pueden organizar y reorganizar a través de diferentes apilamientos de tareas, y finalizar () o cualquier otro que se aleje de una sola actividad puede significar cosas totalmente diferentes en diferentes situaciones. Una sola aplicación puede ejecutarse dentro de múltiples procesos, por lo que matar un proceso no necesariamente significa que no habrá código de aplicación en ejecución. Y finalmente, el sistema puede llamar a BroadcastReceivers en cualquier momento, recreando los procesos necesarios si no están en ejecución.
Lo principal es que no necesita detener / matar / cerrar / lo que sea su aplicación a través de una sola línea de código. Hacerlo es una indicación de que te perdiste un punto importante en el desarrollo de Android. Si por alguna extraña razón tiene que hacerlo, debe finalizar () todas las actividades, detener todos los servicios y desactivar todos los BroadcastReceivers declarados en AndroidManifest.xml. Esa no es una sola línea de código, y quizás lanzar la Actividad que desinstala su propia aplicación hará el trabajo mejor.
La respuesta depende de lo que quiere decir con "cerrar aplicación". En términos de android, se trata de una "actividad" o un grupo de actividades en una orden temporal / ancestral llamada "tarea".
Actividad final: simplemente llame a finish()
Tarea final:
- claro actividad de la tarea-pila
- navegar a la actividad raíz
- luego llama a terminar en él.
Esto terminará toda la "tarea"
No creo que puedas hacerlo en una línea de código. Intente abrir sus actividades con startActivityForResult. Como resultado, puede pasar algo como un CLOSE_FLAG, que informará a su actividad principal que su actividad infantil ha finalizado.
Dicho eso, probablemente deberías leer question .
Puede cerrar su aplicación Android llamando a System.exit (0).
Puede finalizar su actividad llamando a Activity.finish() . Sin embargo, cuídate del ciclo de vida de la actividad de Android .
Sí - ¿Por qué ?, ¿cómo? (Tipo de):
Respuesta corta:
System.exit(0);
Esto finaliza de manera agradable y limpia toda la máquina java que está dedicada a ejecutar la aplicación. Sin embargo, debes hacerlo desde la actividad principal, de lo contrario, Android puede reiniciar tu aplicación automáticamente. (Probado esto en Android 7.0)
Detalles y explicación de por qué esta es una buena pregunta y un programador puede tener una razón muy legítima para finalizar su aplicación de esta manera:
Realmente no veo la ganancia al hablar con dureza a alguien que está buscando una manera de terminar su aplicación.
Good es un recordatorio amigable para los principiantes de que en Android no tienes que preocuparte por cerrar tu aplicación, pero algunas personas realmente quieren terminar su aplicación aunque sepan que no tienen que hacerlo, y su pregunta de cómo hacerlo es una pregunta legítima con una respuesta válida.
Quizás muchas personas viven en un mundo ideal y no se dan cuenta de que hay un mundo real donde la gente real está tratando de resolver problemas reales.
El hecho es que incluso con Android, todavía es una computadora y esa computadora aún ejecuta código, y es perfectamente comprensible por qué alguien realmente desea salir de su "aplicación" (es decir, todas las actividades y recursos que pertenecen a su aplicación). .)
Es cierto que los desarrolladores de Google diseñaron un sistema en el que creían que nadie necesitaría salir de su aplicación. ¡Y tal vez el 99% del tiempo tienen razón!
¡Pero una de las cosas asombrosas de permitir que millones de programadores escriban código para una plataforma es que algunos de ellos intentarán llevar la plataforma al límite para hacer cosas increíbles! - ¡Incluyendo cosas que los desarrolladores de Android nunca soñaron!
Hay otra necesidad de poder cerrar un programa, y eso es para solucionar problemas. Eso es lo que me trajo a este hilo: estoy aprendiendo cómo utilizar la función de entrada de audio para hacer DSP en tiempo real.
Ahora, no olviden que dije lo siguiente: bien sé que cuando todo esté bien hecho, no necesitaré matar a mi aplicación para restablecer la interfaz de audio.
PERO: ¡recuerde, las aplicaciones perfectas no comienzan como aplicaciones perfectas! Comienzan como aplicaciones que apenas funcionan y crecen hasta convertirse en aplicaciones ideales.
Entonces, lo que encontré fue que mi pequeña aplicación de prueba de osciloscopio de audio funcionaba muy bien hasta que presioné el botón de inicio de Android. Cuando volví a lanzar mi aplicación de osciloscopio, ya no había audio entrando.
Al principio iría a Settings->Applications->Manage Applications->AppName->Force Stop.
(Tenga en cuenta que si el proceso real de Linux no se está ejecutando, el botón Force Stop se desactivará. Si el botón está habilitado, ¡entonces el proceso de Linux aún se está ejecutando!)
Luego, pude volver a ejecutar mi aplicación y funcionó de nuevo.
Al principio, solo estaba usando dividir por cero para bloquearlo, y funcionó muy bien. Pero decidí buscar una mejor manera, ¡que me trajo aquí!
Así que aquí está la forma en que lo intenté y lo que descubrí:
Antecedentes: Android se ejecuta en Linux. Linux tiene procesos e ID de procesos (PID) como lo hace Windows, solo que mejor. Para ver qué procesos se están ejecutando en su android (con él conectado en el USB y todo) ejecute adb shell top
y obtendrá una lista de actualización de todos los procesos que se ejecutan en Linux bajo android.
Si tienes linux en tu PC también, puedes escribir
adb shell top | egrep -i ''(User|PID|MyFirstApp)'' --line-buffered
para obtener solo los resultados de su aplicación llamada MyFirstApp. Puede ver cuántos procesos de Linux se están ejecutando con ese nombre y qué cantidad de energía de la CPU están consumiendo.
(Como el administrador de tareas / lista de procesos en Windows)
O si solo quieres ver las aplicaciones en ejecución:
adb shell top | egrep -i ''(User|PID|app_)'' --line-buffered
También puede matar cualquier aplicación en su dispositivo ejecutando adb shell kill 12345
donde 12345 es su número PID.
Por lo que puedo decir, cada aplicación de un único subproceso solo usa un solo proceso de Linux.
Entonces, lo que descubrí fue que (por supuesto) si solo activé la opción de inicio de Android, mi aplicación continúa ejecutándose. Y si uso Activity.finish()
, aún deja el proceso en ejecución. Dividir por cero definitivamente termina el proceso de Linux que se está ejecutando. Asesinar el PID desde la aplicación parece ser el mejor hasta ahora que he encontrado, al menos para fines de depuración.
Inicialmente resolví mi necesidad de matar mi aplicación agregando un botón que causaría una división por cero, como esta en mi MainActivity.java
:
public void exit(View view)
{
int x;
x=1/0;
}
Luego, en mi sección de archivo XML de diseño para ese botón, simplemente configuro el android: onClick = "exit".
Por supuesto, dividir por cero es desordenado porque siempre muestra "Esta aplicación se detuvo ..." o lo que sea.
Entonces intenté el final, así:
public void exit(View view)
{
finish();
}
Y eso hizo que la aplicación desapareciera de la pantalla, pero aún se ejecutaba en segundo plano.
Entonces probé:
public void exit(View view)
{
android.os.Process.killProcess(android.os.Process.myPid());
}
Hasta ahora, esta es la mejor solución que he probado.
ACTUALIZACIÓN: es la misma que la anterior ya que termina de manera instantánea el proceso de Linux y todos los hilos de la aplicación:
public void exit(View view)
{
System.exit(0);
}
Al instante hace una buena salida completa del hilo en cuestión sin decirle al usuario que la aplicación se colgó.
Se liberará toda la memoria utilizada por la aplicación. (Nota: en realidad, puede establecer parámetros en su archivo de manifiesto para hacer que diferentes subprocesos se ejecuten en diferentes procesos de Linux, por lo que se vuelve más complicado en ese momento).
Al menos para pruebas rápidas y sucias, si es absolutamente necesario que sepa que el hilo se ha eliminado por completo, el proceso de matar lo hace muy bien. Sin embargo, si está ejecutando varios hilos, puede que tenga que matar a cada uno de ellos, probablemente desde dentro de cada hilo.
EDITAR: Aquí hay un excelente enlace para leer sobre el tema: http://developer.android.com/guide/components/fundamentals.html
Explica cómo se ejecuta cada aplicación en su propia máquina virtual y cada máquina virtual se ejecuta por sí sola. identidad de usuario.
Aquí hay otro excelente enlace que explica cómo (a menos que se especifique lo contrario en el manifiesto), una aplicación y todos sus hilos se ejecutan en un único proceso de Linux: http://developer.android.com/guide/components/processes-and-threads.html
Como regla general, una aplicación realmente es un programa que se ejecuta en la computadora y la aplicación realmente puede ser eliminada por completo, eliminando todos los recursos de la memoria al instante.
(Al instante me refiero a CUANTO ANTES - no más tarde cuando sea necesario el ariete).
PD: ¿Alguna vez se ha preguntado por qué va a contestar su teléfono Android o inicia su aplicación favorita y se congela por un segundo? ¿Alguna vez reinicias porque te cansas de eso? Probablemente se deba a todas las aplicaciones que ejecutó la semana pasada y pensó que se dio por vencido, pero sigue usando la memoria. ¡El teléfono los mata cuando necesita más memoria, causando un retraso antes de cualquier acción que quisieras hacer!
Actualización para Android 4 / Gingerbread: se aplica lo mismo que arriba, excepto cuando una aplicación sale o se cuelga y todo su proceso de máquina virtual java muere, todavía aparece como ejecutándose en el administrador de la aplicación, y usted todavía tiene el "forzar cierre" opción o lo que sea. 4.0 debe tener una lista independiente de las aplicaciones que cree que se están ejecutando en lugar de verificar si realmente se está ejecutando una aplicación.
Según mi conocimiento, la función de finalización cierra la pantalla mostrada solamente.
Consulte este example (donde vea la respuesta dada por ''plusminus''), seguramente lo ayudará a cerrar su aplicación.
Si cierras la Actividad principal usando Activity.finish()
, creo que cerrará todas las actividades. PUEDE anular la función predeterminada e implementarla de forma estática, no estoy seguro
no es una solución de código de una línea, sino bastante fácil:
Actividad de subclase, luego anular y agregar el método finish () a onPause ()
de esta manera, la actividad desaparecerá una vez que entre en segundo plano, por lo tanto, la aplicación no guardará una pila de actividades, puede finalizar () la actividad actual y ¡la aplicación se ha ido!
simplemente llame a finish () en el método en el que desea finalizar la actividad, por ejemplo, cuando usa el método onCreate (), al final del método, simplemente agregue finish () y verá que la actividad termina tan pronto como es creado!
android.os.Process.killProcess(android.os.Process.myPid());
Este código elimina el proceso del sistema operativo. Al usar este código, se altera el sistema operativo. Así que te recomendaría usar el siguiente código
this.finish();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);