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

时间:2011-12-05 14:45:35

标签: objective-c ios ios4 multitasking flashlight

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

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

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

2 个答案:

答案 0 :(得分:5)

根据iOS App Programming guide

  

返回前台是您的应用程序重启任务的机会   当它移动到后台时停止了。发生的步骤   移动到前台时如图3-6所示。该   applicationWillEnterForeground:方法应该撤消任何内容   在您的applicationDidEnterBackground:方法和中完成   applicationDidBecomeActive:方法应该继续执行相同的操作   在启动时启动的激活任务

您是否尝试使用applicationDidBecomeActive:方法而不是applicationWillEnterForeground:重新应用设置?

要考虑的另一件事是处理通知:

在AppDelegate的applicationDidBecomeActive:applicationDidBecomeActive:方法中,您可以告诉您的应用委托代表向您的控制器发送通知:

- (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];
}

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

[[NSNotificationCenter defaultCenter] addObserver: self 
                                                 selector: @selector(loadSettings) 
                                                     name: @"didBecomeActive" 
                                                   object: nil];

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

在此示例中,您告诉视图控制器在收到loadSettings通知(由应用代理发布)时执行didBecomeActive方法。

答案 1 :(得分:3)

我只有一个答案,为什么快速停止启动应用程序将显示黑屏,我没有参考只有个人经验和观察。

当应用程序发送到后台时,操作系统会尝试使用屏幕截图而不是Default.png。如果您在拍摄截图之前启动应用程序并且项目中没有Default.png,那么您将获得该应用程序。

还在考虑你的实际问题。