2011-06-24 3 views
5

Когда мое приложение перемещено в фоновом режиме, я хотел бы иметь возможность обнаруживать, когда он будет прекращен (для исчерпания памяти или по другим причинам). Есть ли способ сделать это?Как определить, когда приложение будет завершено в фоновом режиме?

В частности, есть способ выполнить какой-либо код до того, как приложение будет завершено, когда в фоновом режиме?

+1

Почему голосовали, чтобы закрыть? Это кажется хорошим вопросом для меня. –

+7

@WTP должен был видеть это перед героическим правлением Брэда :) –

+2

@Michael Stum: на самом деле этот комментарий старше, чем редактирование. Некоторые грамматические ошибки действительно не имеют значения для меня. Если понятно, что задают, это потрясающе. –

ответ

4

Вы можете сделать это в -[<UIApplicationDelegate> applicationWillTerminate:] метод вашего приложения делегата, как это:

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

Это будет выполняться каждый раз, когда приложение собирается быть прекращено, если оно не выходит из строя.

+1

Это не относится к приложениям, которые приостановлены в фоновом режиме. Из руководства по программированию приложений iOS (http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/CoreApplication/CoreApplication.html#//apple_ref/doc/uid/TP40007072-CH3- SW10): «Если ваше приложение в настоящее время приостановлено, система убивает ваше приложение и удаляет его из памяти без каких-либо уведомлений». Вы получите этот обратный вызов только в том случае, если ваше приложение активно работает в фоновом режиме. –

+0

@Brad Larson Затем вы должны выполнить код для сохранения данных в '- [ applicationDidEnterBackground:]' или иначе я не увижу. Это хорошая идея. –

1

Это зависит.

Если вы хотите получить уведомление, когда ваше приложение приостановлено в фоновом режиме, нет способа узнать; метод applicationWillTerminate: не запускается, если вы приостановлены. Рекомендуемый подход заключается в том, чтобы сохранить любое требуемое состояние, когда вы получаете сообщение applicationWillEnterBackground:, так что если вас убьют в фоновом режиме, вы готовы снова запустить его.

Если вы на самом деле в «выполняющейся в фоновом режиме» состоянии (которое может произойти короткое после выхода из приложения или если приложение запросило время временного выполнения фона), то в applicationWillTerminate:будут будет называться так же, как вам Ожидаю.

+0

По словам Apple, это неверно. Если ваше приложение вошло в фоновую обработку, оно получит applicationWillTerminate, если пользователю или ОС необходимо его прекратить (см. Ответ Брэда Ларсона, который цитирует документы Apple). – RyanR

+0

Я думаю, это правда; существует различие между «фоном» и «приостановленным», к которому я не обращался. Я исправлю это. –

4

Лучше всего делать то, что нужно сделать в вашем приложении (сохранение состояния или данных пользователя и т. Д.), Когда ваше приложение переходит на задний план. Если ваше приложение приостановлено, у вас не будет возможности выполнить какой-либо последний код до его завершения системой.

От iOS Application Programming Guide:

Если ваше приложение работает на время окончания (либо на переднем или заднем плане ), система вызывает вашего приложения делегат applicationWillTerminate: метод так , что вы можете выполнить любая требуемая очистка . Вы можете использовать этот метод для сохранить данные пользователя или состояние приложения информацию, которую вы использовали бы в , для восстановления вашего приложения в его текущем состоянии при последующем запуске. Реализация вашего метода имеет приблизительно 5 секунд для выполнения любых задач и возврата . Если он не возвращает вовремя, приложение будет убито и удалено из памяти. applicationWillTerminate: метод не вызывается, если ваше приложение в настоящее время приостановлено.

Даже если вы разрабатываете приложение с помощью IOS SDK 4, а затем, вы должны еще быть готовым для применения быть убитым без какого-либо уведомления. Пользователь может убить приложения явно используя многозадачный интерфейс. Кроме того, если память становится , система может удалить приложений из памяти, чтобы сделать больше номер.Если ваша заявка находится в настоящий момент приостановлена, система уничтожает ваше приложение и удаляет его из памяти без предупреждения. Однако если ваше приложение в настоящее время работает в состоянии фона (другими словами, не приостановлено), система вызывает приложение WillTerminate: метод вашего делегата приложения. Ваша заявка не может запросить дополнительные время выполнения фона из этого метода .

Смежные вопросы