这是我的第一个问题,因为我在开发第一个iOS应用时遇到了问题。它是成千上万的手电筒应用程序之一,但我正在努力为它添加尽可能多的功能。其中一个是在应用程序进入后台或终止时保存应用程序的状态。转到前台(iOS 4或更高版本)或重新启动后,我正在从文件加载设置并重新应用它们。其中一个设置显然是AVCaptureDevice.torchMode
。但是,我遇到了这个问题。我正在applicationDidBecomeActive
方法中重新应用这些设置。这一切似乎都有效,但是当我快速点击主页按钮然后重新启动应用程序时,应用程序将执行以下操作(我将applicationDidBecomeActive
方法延迟观察它):
1。显示黑屏(加载)
2。执行applicationDidBecomeActive
并打开LED(我把延迟放在这里)
3。显示我当前的UIViewController
,并在同一时刻关闭LED
只有在将应用程序发送到应用程序后才从后台调用应用程序。我知道这不是现实的用例场景,但我喜欢认为错误常常“堆积”,并且由于这种(可能)糟糕的设计,我将来可能会遇到其他问题。我绝对相信,每当我的代码修改NSLog
属性时,我的代码都不会关闭,因为我AVCaptureDevice.torchMode
。所以,确切地说,我的问题是:
applicationDidBecomeActive
之后可能与UIViewController
相关的方法,可以让我的火炬关闭?是否有任何可能的解决方案或解决方法?
答案 0 :(得分:5)
返回前台是您的应用程序重启任务的机会 当它移动到后台时停止了。发生的步骤 移动到前台时如图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
,那么您将获得该应用程序。
还在考虑你的实际问题。