【问题标题】:What method is called after 'applicationDidBecomeActive'?在'applicationDidBecomeActive'之后调用什么方法?
【发布时间】:2011-12-05 14:45:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c ios ios4 multitasking flashlight


    【解决方案1】:

    根据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];
    

    这样,您的控制器就会知道应用程序刚刚激活并且可以执行您想要的任何方法。

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

    【讨论】:

    • 是的,你显然是对的,applicationDidBecomeActive 将在applicationWillEnterForeground 之后被调用。我是认真的,但是测试了两种方法,结果是一样的,抱歉。已经编辑了我的问题。关于通知中心:刚刚测试过,并没有解决问题。其实,既然我在applicationDidBecomeActive中“通知”了UIViewController,那是不是和我现在一样直接在applicationDidBecomeActive中加载设置?我的调试显示 applicationDidBecomeActive... 之后发生了一些事情
    【解决方案2】:

    关于为什么快速停止启动App会黑屏,我只有一个答案,我没有参考,只是个人经验和观察。

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

    仍在考虑您的实际问题。

    【讨论】:

    • 尽管这不是我的问题的答案,但我赞成,因为我不知道这个截图参与。使用Default.png 会完全禁用它吗?也许避免在关闭时发生一项操作至少可以使我的问题中的情况不那么常见?编辑:嗯,我想我需要更多的声誉来投票。如果我没有忘记,我会在有能力的时候做到这一点。
    • 谢谢。遗憾的是没有,Default.png 仅在无法截取屏幕截图时使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多