当应用程序进入前台状态时,如何自动停止所有后台任务

时间:2011-07-20 15:24:06

标签: iphone

我正在使用以下代码

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000
if ([[UIApplication sharedApplication]
     respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)])
{
    UIBackgroundTaskIdentifier bgTask = [[UIApplication sharedApplication]
                                         beginBackgroundTaskWithExpirationHandler:^{}];

    // Perform work that should be allowed to continue in background
    [self changeCounter];
    //[NSThread detachNewThreadSelector:@selector(changeCounter) toTarget:self withObject:_viewController];

    [[UIApplication sharedApplication] endBackgroundTask:bgTask];
}
#endif

changeCounter包含可能在一段时间后结束的循环。但是在结束循环之前如果app进入前景,那么我只能看到黑屏直到循环结束。 那么,当应用程序进入前台时,如何停止所有任务

这是changeCounter的代码

 -(void)changeCounter{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

while(back==1.0f){
    NSLog(@"loop is runnig");
    [NSThread sleepForTimeInterval:1.0];

if(_viewController.minutes<0){

    if(_viewController.fadeSeconds>0){
        float div=_viewController.deviceVolume/[_viewController.volumeData.fadeTime floatValue];
        _viewController.musicPlayer.volume=_viewController.musicPlayer.volume-div;
        _viewController.fadeSeconds-=1;

    }
    else {
        [self stop];
        //self.musicPlayer.volume=0.0f;
        // counter=0;
        NSLog(@"closing the sound");
        [_viewController.musicPlayer pause];
        NSLog(@"fade seconds %i minutes ",_viewController.fadeSeconds);
        if(_viewController.dvol==0){
            _viewController.musicPlayer.volume=deviceVolume;
            _viewController.dvol=1;
        }
        back=0.0f;
    }// end of the else

}

1 个答案:

答案 0 :(得分:1)

我认为您的[self changeCounter]方法正在应用程序的主线程上运行,这就是为什么在操作完成之前您会看到黑屏。您应该考虑是否适合在主线程上运行该操作,或者是否应将其移动到后台线程。当你回到前台时,你真的想要杀死任务吗?只要UI没有被锁定,你是否可以完成任务?