应用最小化后调用方法

在应用最小化后调用方法。

比如,在调用了applicationDidEnterBackground:之后五秒钟实现。

我用的代码test没成功:

- (void)test
{
    printf("Take a photo");
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [self performSelector:@selector(test) withObject:nil afterDelay:5.0];
}

当应用程序进入后台时,系统会终止应用程序的所有线程。因此,在这种情况下,使用performSelector:withObject:afterDelay:方法将不会有任何作用。


如果要在应用程序进入后台后执行某些操作,您可以使用后台任务。


在后台运行任务的方法是使用UIApplication的beginBackgroundTaskWithExpirationHandler:方法,如下所示:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    __block UIBackgroundTaskIdentifier backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{
        // 如果系统没有在后台运行任务的时间到达前结束任务,则此块将被调用
        [application endBackgroundTask:backgroundTaskIdentifier];
        backgroundTaskIdentifier = UIBackgroundTaskInvalid;
    }];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 在后台执行任务
        [self test];

        // 完成后台任务
        [application endBackgroundTask:backgroundTaskIdentifier];
        backgroundTaskIdentifier = UIBackgroundTaskInvalid;
    });
}

请注意,对于后台任务,您应该尽可能短地运行任务,并尽快结束任务。否则,系统可能会终止您的应用程序来腾出空间给其他应用程序。