225

アプリケーションがバックグラウンドからウェイクアップしていて、アクティブになる準備をしたい場合に実装する適切なデリゲートはどれですか?

applicationWillEnterForegroundとapplicationDidBecomeActive-違いは何ですか?

アプリケーションがスリープ状態になり、データをクリーンアップして保存する準備をしたい場合に実装する適切なデリゲートはどれですか?

applicationWillResignActiveとapplicationDidEnterBackground-違いは何ですか?

また、着信SMSまたは通話が着信したときにapplicationWillResignActiveが呼び出されるのに、ユーザーが[OK]をクリックして続行することを選択したことに気付きました。このような場合、アプリにアクションを実行させたくありません。ユーザーがアプリを終了しなかったので、中間のクリーンアップなしで実行し続けたいだけです。したがって、applicationDidEnterBackgroundだけでクリーンアップ作業を行う方が理にかなっていると思います。

起床してスリープ状態になるために実装するデリゲートを選択したり、SMS /通話の中断などのイベントを検討したりする際に従うべき、ベストプラクティスについてのご意見をいただければ幸いです。

ありがとう

4

7 に答える 7

467

ウェイクアップするとき、つまりアプリを再起動するとき(スプリングボード、アプリの切り替え、またはURLのいずれかを介して)applicationWillEnterForeground:が呼び出されます。アプリがバックグラウンドに置かれた後、使用できるようになったときに1回だけ実行されますが、applicationDidBecomeActive:起動後に複数回呼び出される場合があります。これはapplicationWillEnterForeground:、再起動後に1回だけ実行する必要があるセットアップに最適です。

applicationWillEnterForeground:と呼ばれます:

  • アプリが再起動されたとき
  • applicationDidBecomeActive:

applicationDidBecomeActive:と呼ばれます:

  • アプリが最初に起動された後application:didFinishLaunchingWithOptions:
  • 処理するURLがapplicationWillEnterForeground:ない場合。
  • application:handleOpenURL:が呼び出されます。
  • applicationWillResignActive:ユーザーが電話やSMSなどの中断を無視した場合。

applicationWillResignActive:と呼ばれます:

  • 電話のような中断があるとき。
    • ユーザーが電話に出るapplicationDidEnterBackground:と呼び出されます。
    • ユーザーが無視した場合、呼び出しapplicationDidBecomeActive:が呼び出されます。
  • ホームボタンが押されたとき、またはユーザーがアプリを切り替えたとき。
  • ドキュメントはあなたがすべきだと言います
    • 進行中のタスクを一時停止します
    • タイマーを無効にする
    • ゲームを一時停止します
    • OpenGLフレームレートを下げる

applicationDidEnterBackground:と呼ばれます:

  • applicationWillResignActive:
  • ドキュメントはあなたがすべきだと言っています:
    • 共有リソースを解放する
    • ユーザーデータを保存する
    • タイマーを無効にする
    • アプリの状態を保存して、アプリが終了した場合に復元できるようにします。
    • UIの更新を無効にする
  • 必要なことを実行してメソッドを返すのに5秒あります
    • 5秒以内に戻らない場合、アプリは終了します。
    • あなたはより多くの時間を求めることができますbeginBackgroundTaskWithExpirationHandler:

公式ドキュメント。

于 2012-03-25T13:15:38.127 に答える
28

アプリのライフ サイクルの管理は、あなたの質問に役立ちます。簡単な概念については、そのドキュメントの図を参照してください。XCode Wizard によって生成されたコードからコメントを読み取ることもできます。次のようにリストされます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    /*
     Sent when the application is about to move from active to inactive state. 
     This can occur for certain types of temporary interruptions (such as an 
     incoming phone call or SMS message) or when the user quits the application 
     and it begins the transition to the background state.
     Use this method to pause ongoing tasks, disable timers, and throttle down 
     OpenGL ES frame rates. Games should use this method to pause the game.
     */
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    /*
     Use this method to release shared resources, save user data, invalidate 
     timers, and store enough application state information to restore your 
     application to its current state in case it is terminated later. 
     If your application supports background execution, this method is called 
     instead of applicationWillTerminate: when the user quits.
     */
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    /*
     Called as part of the transition from the background to the active state; 
     here you can undo many of the changes made on entering the background.
     */
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    /*
     Restart any tasks that were paused (or not yet started) while the 
     application was inactive. If the application was previously in the 
     background, optionally refresh the user interface.
     */
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    /*
     Called when the application is about to terminate.
     Save data if appropriate.
     See also applicationDidEnterBackground:.
     */
}

より詳細な説明については、UIApplicationDelegateの公式ドキュメントを参照してください。

于 2011-11-10T08:05:25.760 に答える
13

私はまだダノの答えに少し混乱していたので、参考のために特定のシナリオでイベントの流れを取得するために少しテストを行いましたが、それはあなたにも役立つかもしれません. UIApplicationExitsOnSuspendこれは、info.plist で使用しないアプリ用です。これは iOS 8 シミュレーターで実施され、iOS 7 デバイスで確認されました。Xamarin のイベント ハンドラ名についてはご容赦ください。それらは非常に似ています。

  • 実行されていない状態からの最初の起動とその後のすべての起動:

打ち上げ完了

オンアクティベート

  • 割り込み(電話、上スライドダウン、下スライドアップ):
  • ホーム ボタンを 2 回押して非アクティブなアプリを一覧表示し、アプリを再選択します。

OnResignActivation


オンアクティベート

  • ホーム ボタンを 2 回押して非アクティブなアプリを一覧表示し、別のアプリを選択してから、アプリを再起動します。
  • ホームボタンを 1 回押してから再起動します。
  • ロック (オン/オフ ボタン) してから、ロックを解除します。

OnResignActivation

ディエンターバックグラウンド


ウィルエンターフォアグラウンド

オンアクティベート

  • ホームボタンを 2 回押して、アプリを終了します (その後の再起動が最初のケースです)。

OnResignActivation

ディエンターバックグラウンド

DidEnterBackground (iOS 7 のみ?)

はい、DidEnterBackgroundiOS7 デバイスでは 2 回呼び出されます。どちらの場合も、UIApplication の状態は Background です。ただし、iOS 8 シミュレーターはそうではありません。これは、iOS 8 デバイスでテストする必要があります。手に入れたら答えを更新するか、他の誰かが確認できます。

于 2014-09-23T01:27:07.613 に答える
9

applicationWillEnterForegroundと呼ばれます:

アプリが再起動されたとき (バックグラウンドからフォアグラウンドに移行) このメソッドは、アプリが初めて起動したとき、つまり が呼び出されたときに呼び出されず、バックグラウンドから起動したときにapplicationDidFinishLaunchのみ呼び出されます applicationDidBecomeActive

applicationDidBecomeActiveと呼ばれる

処理する URL がない場合、アプリが最初に起動されたときdidFinishLaunchingapplicationWillEnterForegroundafterapplication:handleOpenURL:が呼び出されます。applicationWillResignActiveユーザーが電話や SMS などの割り込みを無視した場合。アプリケーションからどこでもalertViewが消えた後

于 2014-11-04T01:15:28.753 に答える
7

applicationWillResignActive は、システムが許可を求めるときに呼び出されます。(iOS 10)。誰かが私と同じトラブルに巻き込まれた場合に備えて...

于 2016-12-03T00:44:02.407 に答える
5

iOS 8 以降では、電話を受ける際に微妙ではあるが重要な違いがあります。

iOS 7 では、ユーザーが電話を受けると、applicationWillResignActive: と applicationDidEnterBackground: の両方が呼び出されます。ただし、iOS 8 以降では、applicationWillResignActive: のみが呼び出されます。

于 2015-01-30T05:54:20.533 に答える