1

我使用 beginBackgroundTaskWithExpirationHandler:^{ } 设置了一个后台任务,甚至在使用结束任务之后

    if ([[UIDevice currentDevice] isMultitaskingSupported]) {
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
    backgroundTaskID = UIBackgroundTaskInvalid;
    }

    NSLog(@"App State -- %d", [[UIApplication sharedApplication] applicationState]);


    if([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive)
    {
       //OpenGL operations
    }

我得到的是 UIApplicationStateActive。这是一个错误吗?我如何确定该应用程序确实在后台?

4

2 回答 2

1

与其依赖 applicationState 值,不如在后台任务结束时发布自定义通知?

设置为您的自定义通知的观察者:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(backgroundTaskDidFinish:) name:@"BackgroundTaskDidFinish" object:<either nil or the object that will post the notification>];
}

在后台任务完成时发布您的自定义通知

if ([[UIDevice currentDevice] isMultitaskingSupported]) {
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
    backgroundTaskID = UIBackgroundTaskInvalid;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"BackgroundTaskDidFinish" object:self]
}

响应通知,当您的应用真正返回到活动状态时应该收到该通知

- (void)backgroundTaskDidFinish:(NSNotification *)notification
{
   //OpenGL operations
}

或者,您可以查找表明您的应用真正处于活动状态的其他通知消息之一。

例如,将您的对象添加为 UIApplicationWillEnterForeground 的观察者。当您收到该通知时设置一个 BOOL 值。然后,查找该 BOOL 值以及 UIApplicationState 值。

当然,在某些时候,您必须清除 BOOL - 例如,当您开始该后台任务时 - 所以除非应用程序确实变得活跃,否则它将是 NO。

于 2014-05-04T03:53:05.317 回答
0

您可以尝试使用 NSNotification 来确定它:

- (void)viewDidLoad {
[super viewDidLoad];
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];
}
- (void)applicationWillResignActive:(NSNotification *)notification {
//do what you want when your app is in background
}
于 2013-11-25T20:27:32.713 回答