2011-06-24 16 views
5

私のアプリケーションをバックグラウンドに移動すると、いつ終了するのか(メモリが枯渇したのかなど)を検出できるようにしたいと考えています。これを行う方法はありますか?アプリケーションがバックグラウンドで終了しようとしているときは、どうすればわかりますか?

特に、バックグラウンドでアプリケーションが終了する前にコードを実行する方法はありますか?

+1

なぜ閉じようと投票したのですか?これは私にとっては良い質問です。 –

+7

@WTPはBradの英雄編集の前にそれを見たことがあります:) –

+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によると、これは正しくありません。アプリケーションがバックグラウンド処理に入った場合は、ユーザーまたはOSが終了する必要がある場合はapplicationWillTerminateを受け取ります(Brad LarsonsのApple docsの引用文を参照してください)。 – RyanR

+0

私はそれが本当だと思います。私が取り組まなかった「バックグラウンド」と「中断」の区別があります。私はそれを修正します。 –

4

アプリケーションがバックグラウンドに移行する際に、アプリケーションでどのようなクリーンアップ(状態やユーザーデータなどを保存する)を行うのが最善の方法です。アプリケーションが中断されている場合、システムによって終了される前に最後のコードを実行する機会はありません。 iOS Application Programming Guideから

アプリケーションが実行されている(フォアグラウンドまたはバックグラウンドのいずれかで )されている場合は 終了時に、システムが アプリケーションデリゲートの applicationWillTerminateを呼び出す:あなたが実行できる方法ので 任意の クリーンアップが必要です。このメソッドを使用して ユーザーデータまたはアプリケーション状態を保存する には、次の起動時にアプリケーションを 現在の状態に復元するために使用する情報を使用できます。 メソッドの実装には タスクを実行して戻るまでに約5秒かかる があります。 時間内に復帰しない場合、アプリケーションは であり、メモリから削除されます。 applicationWillTerminate:メソッドが で現在中断されている場合は、 が呼び出されません。

後でのiOS SDK 4を使用してアプリケーション を開発している場合でも、あなたはまだ 任意の通知なしに殺されるためにアプリケーション のために準備する必要があります。 ユーザーはマルチタスキングUIを使用して明示的にアプリケーション を強制終了できます。 さらに、メモリが に制限されている場合、システムは のメモリをメモリから削除して、 のメモリを増やす可能性があります。アプリケーションが現在 の場合、システムは アプリケーションを終了し、通知なしでメモリ から削除します。ただし、 アプリケーションが現在 のバックグラウンド状態(つまり、 が中断されていない)で実行されている場合、システムは applicationWillTerminate:メソッド を呼び出してアプリケーションの委任を行います。 アプリケーションは、この メソッドから追加の バックグラウンド実行時間を要求できません。

関連する問題