如何知道任务是否在后台执行

时间:2012-08-25 12:40:44

标签: iphone objective-c ios ipad background

在我的应用程序中,我正在下载方法上的大量图像。

我正在使用

 downloadTask = [[UIApplication sharedApplication]
                   beginBackgroundTaskWithExpirationHandler:^{

                       [[UIApplication sharedApplication] endBackgroundTask:downloadTask]; 
                       downloadTask = UIBackgroundTaskInvalid;

                   }]; 

这个工作正常,如果我按住主页或睡眠按钮,图像会继续下载。

我在UIAlertView中的UIProgressView中显示进度,当百分比为100%时,alertView被忽略,我将viewController更改为我显示已下载图像的其他位置。 但是,如果应用程序在下载完成时非常活跃,我只希望这种情况发生。

我一直在查看应用状态,并在屏幕关闭时下载。

[UIApplication sharedApplication].applicationState

在所有下载过程中,状态是UIApplicationStateActive

如何在关闭或打开屏幕时知道下载是否正在进行?

接受答复后被删除:

我刚刚发现,如果我点击主页按钮,应用程序会进入UIApplicationStateBackground,如果我点击它在UIApplicationStateInactive中输入的唤醒/睡眠

在接近正确答案后,我的应用程序会在两种情况下都进行下载。

2 个答案:

答案 0 :(得分:2)

屏幕在两种状态下关闭(除了应用程序尚未打开时):

  • 已暂停:在这种情况下,您无需担心,因为在应用再次激活之前,下载不会进行;它将在
  • 上进入此状态
  • 背景:在进入暂停状态之前,它处于此状态的时间有限,此时屏幕已经关闭。在这里你可能想检查是否要做你说的所有事情,因为在这种状态下代码仍然可以执行。在此状态下,应用程序状态为 UIApplicationStateBackground ,因此您只需执行以下检查:

您可能想要检查应用程序是否在后台执行以获得结果。就像这样:

if([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) {
  // Do stuff  
}

如果它在后台,则屏幕关闭。

UPDATE :经过几次测试后,我发现你所表现出来的行为可能是由于在主线程上执行了下载。

您应该在(例如)全局队列上发送下载。这样应用程序将按预期进入后台状态:

....
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.bti];
    }];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self doBackgroundStuff];
});
....

这样,如果在下载过程中将应用程序放在后台,则应用程序状态将变为 UIApplicationStateBackground ,然后您可以像我最初写的那样检查它。如果您在进行过程中进行UI更新,请记住将它们发送回主线程(因为下载现在是另一个)。

答案 1 :(得分:1)

您可以通过在指定的应用委托方法applicationDidEnterBackground:applicationWillEnterForeground:中设置标记来检查您的应用是否在后台运行。例如:

- (void)applicationDidEnterBackground:(UIApplication *)application
    _applicationRunsInForeground = NO;
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    _applicationRunsInForeground = YES;
}

如果您不希望在应用程序委托中包含此_applicationRunsInForeground标志,则可以在viewcontroller类中查看委托的NSNotifications(UIApplicationWillEnterForegroundNotificationUIApplicationDidEnterBackgroundNotification)。