这是我在这里的第一个问题,因为我在开发我的第一个 iOS 应用程序时遇到了问题。它是数以千计的手电筒应用程序之一,但我正在尝试为它添加尽可能多的功能。其中之一是在应用程序进入后台或终止时保存应用程序的状态。进入前台(iOS 4 或更高版本)或重新启动后,我正在从文件加载设置并重新应用它们。显然,其中一项设置是AVCaptureDevice.torchMode
. 但是,我遇到了这个问题。我在applicationDidBecomeActive
方法中重新应用这些设置。这一切似乎都有效,但是当我很快点击主页按钮然后重新启动应用程序时,应用程序将执行以下操作(我延迟了applicationDidBecomeActive
观察它的方法):
1.显示黑屏(加载)
2.执行applicationDidBecomeActive
并打开 LED(我把延迟放在这里)
3. 显示我的电流UIViewController
,同时关闭 LED
它只发生在从后台调用应用程序后立即发送到那里。我知道这不是现实的用例场景,但我喜欢认为错误经常“堆积”,并且由于这种(可能)糟糕的设计,我将来可能会遇到其他问题。我绝对确定这不是我关闭 LED 的代码,因为NSLog
每当我的代码修改AVCaptureDevice.torchMode
属性时。所以,确切地说,我的问题是:
在 之后调用什么方法applicationDidBecomeActive
,可能与 相关UIViewController
,可以关闭我的手电筒?是否有任何可能的解决方案或解决方法?
2 回答
返回前台是您的应用程序有机会重新启动它在移动到后台时停止的任务。移至前台时发生的步骤如图 3-6 所示。applicationWillEnterForeground: 方法应该撤消在 applicationDidEnterBackground: 方法中所做的任何事情,并且applicationDidBecomeActive: 方法应该继续执行与启动时相同的激活任务。
您是否尝试过在方法中重新应用您的设置applicationDidBecomeActive:
而不是applicationWillEnterForeground:
?
要考虑的另一件事是使用通知:
在 AppDelegate 的applicationDidBecomeActive:
orapplicationDidBecomeActive:
方法中,您可以告诉您的应用委托将通知发送到您的控制器:
- (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
通知(由应用代理发布)时执行该方法。
I only have an answer as to why a quick stop start of the App will display a black screen, I have no reference only personal experience and observation.
When the App is sent to the background the OS attempts to take a screen shot to use instead of the Default.png
. If you start the App before a screenshot is taken and you don't have a Default.png
in your project then you will get that.
Still thinking about your actual question.