在'applicationDidBecomeActive'之后调用什么方法?

Bar*_*orn 3 objective-c multitasking ios4 ios flashlight

这是我在这里的第一个问题,因为我在开发我的第一个iOS应用时遇到了问题.它是成千上万的手电筒应用程序之一,但我正在努力为它添加尽可能多的功能.其中一个是在应用程序进入后台或终止时保存应用程序的状态.转到前台(iOS 4或更高版本)或重新启动后,我正在从文件加载设置并重新应用它们.其中一个设置显然是AVCaptureDevice.torchMode.但是,我遇到了这个问题.我正在该applicationDidBecomeActive方法中重新应用这些设置.这一切似乎都有效,但是当我快速点击主页按钮然后重新启动应用程序时,应用程序将执行以下操作(我将applicationDidBecomeActive方法延迟观察它):

1.显示黑屏(加载)
2.执行applicationDidBecomeActive并打开LED(我把延迟放在这里)
3.显示我的当前UIViewController和同时关闭LED

只有在它被发送后立即从后台调用应用程序后才会发生.我知道这不是现实的用例场景,但我喜欢认为错误常常"堆积",并且由于这种(可能)糟糕的设计,我将来可能会遇到其他问题.我绝对相信这不是我的代码关闭LED,因为NSLog每当我的代码修改AVCaptureDevice.torchMode属性.所以,确切地说,我的问题是:
什么方法被调用applicationDidBecomeActive,可能与之相关,可能UIViewController会关闭我的火炬?是否有任何可能的解决方案或解决方案?

Mut*_*tix 5

根据iOS应用程序编程指南:

返回前台是您的应用程序有机会重新启动它移动到后台时停止的任务.移动到前台时发生的步骤如图3-6所示.applicationWillEnterForeground:方法应该撤消在applicationDidEnterBackground:方法中执行的任何操作,并且applicationDidBecomeActive:方法应该继续执行与启动时相同的激活任务.

您是否尝试过在applicationDidBecomeActive:方法中重新应用设置而不是applicationWillEnterForeground:

另一件需要考虑的事情是使用通知:

applicationDidBecomeActive:applicationDidBecomeActive:在AppDelegate中的方法,你可以告诉你的应用程序代理派遣通知到你的控制器:

- (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.
     */

    // Dispatch notification to controllers
    [[NSNotificationCenter defaultCenter] postNotificationName: @"didBecomeActive" 
                                                        object: nil 
                                                      userInfo: nil];
}
Run Code Online (Sandbox Code Playgroud)

一旦你有了这个,视图控制器可以注册这些通知(例如,在他们的init方法中),如下所示:

[[NSNotificationCenter defaultCenter] addObserver: self 
                                                 selector: @selector(loadSettings) 
                                                     name: @"didBecomeActive" 
                                                   object: nil];
Run Code Online (Sandbox Code Playgroud)

这样,您的控制器就会意识到应用程序刚刚变为活动状态并且可以执行您想要的任何方法.

在此示例中,您告诉视图控制器loadSettings在收到didBecomeActive通知(由应用程序委托发布)时执行该方法.