La aplicación de Android no llama "onDestroy()" cuando se elimina(ICS)
android-4.0-ice-cream-sandwich (3)
Estoy desarrollando una aplicación para Android que utiliza comunicación por bluetooth (usando un protocolo propio) y necesito capturar el momento en que se elimina la aplicación.
Quería usar el método "onDestroy ()" pero no se llama cada vez que se elimina la aplicación. Noté que se llama cuando presiono el botón Atrás y, solo algunas veces, cuando mato la aplicación desde el administrador de tareas.
La pregunta es: ¿Cómo puedo capturar el momento antes de que se elimine la aplicación?
Aquí está el código que intenté usar:
@Override
public void onDestroy() {
sendMessage(msg);
Log.d("SampleApp", "destroy");
super.onDestroy();
}
@Override
public void finish(){
sendMessage(msg);
Log.d("SampleApp", "finish");
super.finish();
}
Desafortunadamente, nunca se llama a finish () y onDestroy no se llama cada vez que cierro la aplicación desde el administrador de tareas.
¿Cómo puedo manejar esto?
Acabo de resolver un problema similar.
Esto es lo que puede hacer si solo se trata de detener el servicio cuando se elimina la aplicación al deslizar de la lista de aplicaciones recientes.
Dentro de su archivo de Manifiesto, mantenga el indicador stopWithTask
como true
para el Servicio. Me gusta:
<service
android:name="com.myapp.MyService"
android:stopWithTask="true" />
Pero como dice que desea cancelar el registro de oyentes y detener la notificación, etc., sugeriría este enfoque:
Dentro de su archivo de Manifiesto, mantenga el indicador
stopWithTask
comofalse
para el Servicio. Me gusta:<service android:name="com.myapp.MyService" android:stopWithTask="false" />
Ahora, en su servicio
MyService
, anule el métodoonTaskRemoved
. (Esto se activará solo sistopWithTask
está configurado comofalse
).public void onTaskRemoved(Intent rootIntent) { //unregister listeners //do any other cleanup if required //stop service stopSelf(); }
Consulte esta pregunta para obtener más detalles, que también contienen otra parte del código.
- Iniciar el servicio como a continuación
startService (nuevo Intent (this, MyService.class));
Espero que esto ayude.
Como se indica en la documentación here , no hay garantía de que alguna vez se llamará a onDestroy (). En su lugar, use onPause() para hacer las cosas que desea hacer cada vez que la aplicación se mueva en segundo plano, y deje solo el código en onDestroy () que desea ejecutar cuando se elimine su aplicación.
EDITAR:
De sus comentarios, parece que desea ejecutar algún código cada vez que su aplicación pasa al segundo plano, pero no si fue al segundo plano porque lanzó un intento. AFAIK, no hay ningún método en Android que maneje esto de manera predeterminada, pero puedes usar algo como esto:
Tener un booleano como:
boolean usedIntent = false;
Ahora, antes de usar un intento, establece el booleano como verdadero. Ahora en su onPause (), mueva el código para el caso de intención a un bloque if como este:
if(usedIntent)
{
//Your code
}
Finalmente, en su onResume (), establezca el booleano en falso otra vez para que pueda tratar que su aplicación se mueva en segundo plano por un medio no intencional.
Su aplicación no recibirá ninguna devolución de llamada adicional si el proceso finalizó por medios externos (es decir, se eliminó por motivos de memoria o el usuario Force detiene la aplicación). Tendrá que conformarse con las devoluciones de llamada que recibió cuando la aplicación entró en segundo plano para la limpieza de su aplicación.
finish()
sistema solo llama a finish()
cuando el usuario presiona el botón ATRÁS de su Actividad, aunque las aplicaciones a menudo lo llaman directamente para abandonar una Actividad y regresar a la anterior. Esto no es técnicamente una devolución de llamada de ciclo de vida.
onDestroy()
solo recibe una llamada en una Actividad como resultado de una llamada para finish()
, así que principalmente solo cuando el usuario pulsa el botón ATRÁS. Cuando el usuario presiona el botón INICIO, la actividad de primer plano solo pasa por onPause()
y onStop()
.
Esto significa que Android no proporciona mucha información a una Actividad para diferenciar a un usuario que va a Inicio en lugar de pasar a otra Actividad (desde su aplicación o cualquier otra); la Actividad en sí misma simplemente sabe que ya no está en primer plano. Una aplicación de Android es más una colección suelta de Actividades que un concepto singular estrechamente integrado (como puede estar acostumbrado en otras plataformas), por lo que no hay devoluciones de llamadas reales del sistema para saber cuándo se ha adelantado o movido su aplicación en su conjunto. hacia atrás.
En última instancia, le insto a que reconsidere su arquitectura de aplicación si se basa en el conocimiento de si ALGUNA actividad en su aplicación está en primer plano, pero dependiendo de sus necesidades, puede haber otras formas más amigables con el marco para lograrlo. Una opción es implementar un Service
vinculado dentro de su aplicación al que se enlaza cada Activity
mientras está activo (es decir, entre onStart()
y onStop()
). Lo que esto le proporciona es la capacidad de aprovechar el hecho de que un Service
vinculado solo tiene vida mientras los clientes estén vinculados a él, por lo que puede monitorear los onCreate()
y onDestroy()
del Servicio para saber cuándo está la tarea actual en primer plano. No es parte de su aplicación.
También es posible que este artículo escrito por Dianne Hackborn sea interesante y cubra con más detalle la arquitectura de Android y la forma en que Google cree que debería usarse.