2011-06-24 11 views
5

Cuando mi aplicación se mueve a un segundo plano, me gustaría poder detectar cuándo está a punto de finalizar (por agotamiento de memoria u otras razones). ¿Hay alguna forma de hacer esto?¿Cómo puedo determinar cuándo terminará mi aplicación en segundo plano?

En particular, ¿hay alguna forma de ejecutar algún código antes de que la aplicación finalice cuando está en segundo plano?

+1

¿Por qué hemos votado para cerrar? Esta parece una buena pregunta para mí. –

+7

@WTP debería haberlo visto antes de la edición heroica de Brad :) –

+2

@Michael Stum: en realidad, ese comentario es anterior a la edición. Algunos errores gramaticales realmente no me importan. Si está claro lo que se está preguntando, es increíble. –

Respuesta

4

Usted puede hacer esto en el método -[<UIApplicationDelegate> applicationWillTerminate:] de su delegado aplicación, así:

- (void)applicationWillTerminate:(UIApplication *)application { 
    [database save]; // or whatever you want to do 
} 

Esto se ejecuta cada vez que la aplicación está a punto de ser terminado, a menos de que se estrelle.

+1

Esto no es cierto para aplicaciones que están suspendidas en segundo plano. De la [Guía de programación de aplicaciones de iOS] (http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/CoreApplication/CoreApplication.html#//apple_ref/doc/uid/TP40007072-CH3- SW10): "Si su aplicación está actualmente suspendida, el sistema mata su aplicación y la elimina de la memoria sin previo aviso". Solo recibirá esta devolución de llamada si su aplicación ejecuta código activamente en segundo plano. –

+0

@Brad Larson Luego debe ejecutar el código para guardar los datos en '- [ applicationDidEnterBackground:]' o no veré otra forma. Esta es una buena idea de todos modos. –

1

Depende.

Si se refiere a recibir una notificación mientras la aplicación está suspendida en segundo plano, no hay forma de saberlo; el método applicationWillTerminate: no se ejecuta si estás suspendido. El enfoque recomendado es guardar cualquier estado requerido cuando recibe el mensaje applicationWillEnterBackground:, de modo que si lo matan en segundo plano, está listo para volver a iniciarse.

Si usted está realmente en un estado de "ejecución en segundo plano", (lo que puede ocurrir brevemente después de salir de la aplicación o si la aplicación ha solicitado el tiempo de ejecución fondo temporal), entonces se applicationWillTerminate: se llama igual que lo esperaríamos

+0

Según Apple, esto no es correcto. Si su aplicación ha ingresado el procesamiento en segundo plano, recibirá applicationWillTerminate si el usuario o sistema operativo necesita terminarlo (consulte la respuesta de Brad Larsons que cita los documentos de Apple). – RyanR

+0

Supongo que es verdad; hay una distinción entre "atrasado" y "suspendido" que no aborde. Lo arreglaré. –

4

Lo mejor que puede hacer es hacer las tareas de limpieza necesarias en su aplicación (guardar el estado o los datos del usuario, etc.) a medida que su aplicación pasa a segundo plano. Si su aplicación se suspende, no tendrá la posibilidad de realizar ningún código anterior antes de que el sistema lo finalice.

Desde el iOS Application Programming Guide:

Si se ejecuta la aplicación (ya sea en el primer o segundo plano) en tiempo de terminación, el sistema llama de su delegado aplicación applicationWillTerminate: método por lo que puede realizar cualquier limpieza requerida . Puede usar este método para guardar datos de usuario o información de estado de aplicación que usaría para restaurar su aplicación a su estado actual en un lanzamiento posterior. Su implementación de método tiene aproximadamente 5 segundos para realizar cualquier tarea y devolver. Si no se devuelve en el tiempo , la aplicación es eliminada y eliminada de la memoria. El método WillTerminate: no se llama si su aplicación es actualmente suspendida.

Incluso si usted desarrolla su aplicación utilizando el SDK de iOS 4 y posterior, debe todavía estar preparado para su aplicación morir sin ninguna notificación. El usuario puede eliminar aplicaciones explícitamente utilizando la interfaz de usuario multitarea. Además, si la memoria se vuelve limitada a , el sistema podría eliminar las aplicaciones de la memoria para crear más espacio en .Si su aplicación está actualmente suspendida, el sistema mata su aplicación y la elimina de la memoria sin aviso. Sin embargo, si la aplicación se está ejecutando actualmente en el estado de fondo (en otras palabras, no se suspende ), el sistema llama al applicationWillTerminate : Forma de su delegado aplicación. Su aplicación no puede solicitar un tiempo de ejecución de fondo adicional a partir de este método .

Cuestiones relacionadas