加速度计在beginBackgroundTaskWithExpirationHandler中初始化时加速不被调用?

时间:2010-12-12 11:55:05

标签: iphone ios4 background accelerometer

在我的应用程序中,我想在应用程序进入后台时记录加速度计数据(系统授予的到期时间就足够了)。我把它编码如下:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    UIDevice* device = [UIDevice currentDevice];
    BOOL backgroundSupported = NO;

    if ([device respondsToSelector:@selector(isMultitaskingSupported)])
        backgroundSupported = device.multitaskingSupported;


    if (backgroundSupported) {
        UIApplication*    app = [UIApplication sharedApplication];

        bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
            [app endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        }];

        // Start the long-running task and return immediately.
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
            ^{
            // Do the work associated with the task.
            if ([application backgroundTimeRemaining] > 1.0 ) {
                UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
                accel.delegate = self;
                accel.updateInterval = kUpdateInterval;
            }          
        });

在我提到的代表中:

- (void) accelerometer:(UIAccelerometer *)accelerometer 
    didAccelerate:(UIAcceleration *)acceleration {

    if (acceleration.x > kAccelerationThreshold || 
        acceleration.y > kAccelerationThreshold ||
        acceleration.z > kAccelerationThreshold) {

        NSLog(@"Sensed acceleration");
        UILocalNotification *localNotif = [[UILocalNotification alloc] init];

但是,当应用程序进入后台时,didAccelerate不会被触发,而是在applicationWillEnterForeground之后调用它。应用程序重新启动后(从后台),didAccelerate似乎被多次触发(可能是加速计值在后台更改的次数)。当app进入前台时,请求似乎堆积并执行。

当应用程序处于后台状态时,我有什么方法可以记录加速度计值( 在beginBackgroundTaskWithExpirationHandler)里面

请帮忙。

1 个答案:

答案 0 :(得分:1)

您的代码按原样运行,然后应用程序退出正常继续。换句话说,您的加速度计相关代码不同步,因此不会阻止退出过程。

再次阅读评论:

// Start the long-running task and return immediately.

不幸的是,你的任务不是一个“长期”的任务。