web-dev-qa-db-ja.com

AppDelegateでのバックグラウンド/フォアグラウンドメソッドの使用

アプリにマルチタスクを実装する予定です。 AppDelegateapplicationWillResignActiveapplicationDidEnterBackground、...のようなapplicationWillEnterForegroundでそれを行うための多くのメソッドをここで見ることができます。

しかし....それらの使用方法も、ViewControllersに含まれていない理由もわかりません。

つまり、アプリがバックグラウンドで起動したとき、ユーザーがどのビューにいるのかわかりません。そして、アプリがフォアグラウンドになったときに、たとえばビューを更新するために、どうすればよいか、何を呼び出すことができるかをどのように知ることができますか?

それらのメソッドが各View Controllerにある場合、私は理解していたでしょうが、ここでは、それらが具体的な方法で使用できるかわかりません...

これらのメソッドに物事を実装する方法を理解するのを手伝ってもらえますか?

43
Oliver

アプリがバックグラウンドに移行すると、各オブジェクトはUIApplicationDidEnterBackgroundNotification通知を受け取ります。そのため、アプリがバックグラウンドになったときにコードを実行するには、必要な場所でその通知を聞くだけで済みます。

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(appHasGoneInBackground:)
                                             name:UIApplicationDidEnterBackgroundNotification
                                           object:nil];

リスナーを聞く必要がなくなったら、リスナーをリリースすることを忘れないでください。

[[NSNotificationCenter defaultCenter] removeObserver:self];

そして何よりも、次の通知で同じようにプレイできます:

  • UIApplicationDidEnterBackgroundNotification
  • UIApplicationWillEnterForegroundNotification
  • UIApplicationWillResignActiveNotification
  • UIApplicationDidBecomeActiveNotification
131
Oliver

IOSは「デリゲート」デザインパターンを採用しているため、View Controllerには含まれていません。必要に応じて、メソッドがクラス(この場合はアプリケーションのApp Delegate)で起動することが保証されます。

学習プロセスとして、それらのメソッドにNSLogを入れて、それらが起動されるタイミングを確認してみませんか?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{    

    // Override point for customization after application launch.
    NSLog(@"didFinishLaunchingWithOptions");
    [self.window makeKeyAndVisible];

    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.
     */
    NSLog(@"applicationWillResignActive");
}


- (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, called instead of applicationWillTerminate: when the user quits.
     */
    NSLog(@"applicationDidEnterBackground");
}


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


- (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.
     */
    NSLog(@"applicationDidBecomeActive");
}


- (void)applicationWillTerminate:(UIApplication *)application 
{
    /*
     Called when the application is about to terminate.
     See also applicationDidEnterBackground:.
     */
    NSLog(@"applicationWillTerminate");
}
8
Alan Zeino