单个长寿ios后台任务(voip)

时间:2013-01-09 09:10:42

标签: ios objective-c

我正在开发一个应用程序,需要定期(经常)在后台进行一些工作,即使应用程序本身没有显示。我已经启动它,甚至在10分钟(600秒)后自动重启,宣布它为VOIP应用程序。该应用程序不适用于App Store。

大约300-400秒后,系统会生成一个新线程(正确),但它不会关闭最后一个线程。这意味着每600秒产生一个新线程,增加了我的应用程序的内存和电池消耗。不好。

关于如何在创建新线程后关闭第一个衍生线程的任何线索?

此应用程序关闭后,此代码将启动后台处理程序。它还定期启动一个600s间隔的新处理程序

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    isInBackground = YES;
    BOOL backgroundAccepted = [[UIApplication sharedApplication]
        setKeepAliveTimeout:600 handler:^{ [self startBackgroundHandler]; }];
    if (backgroundAccepted)
    {
        NSLog(@"VOIP backgrounding accepted");
    }
    [self startBackgroundHandler];
}

此代码启动一个定期执行某些工作的线程(每个5s):

- (void)startBackgroundHandler
{       
    UIApplication*    app = [UIApplication sharedApplication];
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    // Start the long-running task
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        while (1)
        {
            NSLog(@"BGTime left: %f", [UIApplication
               sharedApplication].backgroundTimeRemaining);
            sleep(5);
        }
    });
}

1 个答案:

答案 0 :(得分:0)

一段时间以来一直在努力解决这个问题,但在Stackoverflow上写完之后就找到了解决方案。

刚刚更换

while (1)

int localThreadId = ++threadId;
while (threadId == localThreadId)

其中线程id是int。因此,当新线程启动时,threadId会增加,而旧的线程会停止。