3 回答
TA贡献1802条经验 获得超6个赞
回答:
应用程序将在各种情况下调用活动调用...并且从我的所有测试中,即使您的应用程序在后台运行时保持清醒状态,也无法确定屏幕是否已锁定(CPU速度未报告,总线速度保持不变,mach_time denom / numer不会改变)......
但是,当设备锁定时,Apple似乎关闭了加速计... 在屏幕锁定时启用iPhone加速计 (在iPhone 4上测试iOS4.2有此行为)
从而...
在您的应用程序委托中:
- (void)applicationWillResignActive:(UIApplication *)application{ NSLog(@"STATUS - Application will Resign Active"); // Start checking the accelerometer (while we are in the background) [[UIAccelerometer sharedAccelerometer] setDelegate:self]; [[UIAccelerometer sharedAccelerometer] setUpdateInterval:1]; // Ping every second _notActiveTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(deviceDidLock) userInfo:nil repeats:NO]; // 2 seconds for wiggle}//Deprecated in iOS5- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{ NSLog(@"STATUS - Update from accelerometer"); [_notActiveTimer invalidate]; _notActiveTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(deviceDidLock) userInfo:nil repeats:NO];}- (void)deviceDidLock{ NSLog(@"STATUS - Device locked!"); [[UIAccelerometer sharedAccelerometer] setDelegate:nil]; _notActiveTimer = nil;}- (void)applicationDidBecomeActive:(UIApplication *)application{ NSLog(@"STATUS - Application did become active"); [[UIAccelerometer sharedAccelerometer] setDelegate:nil]; [_notActiveTimer invalidate]; _notActiveTimer = nil;}
我知道......这是一种黑客攻击,但到目前为止,它对我来说就像是一种魅力。如果您发现任何阻止其工作的问题,请更新。
TA贡献1824条经验 获得超5个赞
有一种更漂亮的方式可以分辨任务切换和屏幕锁定发起的applicationWillResignActive:
回调,甚至不涉及无记录功能,如加速度计状态。
当应用程序移动到后台时,应用程序委托首先发送一个applicationWillResignActive:
,然后发送一个applicationDidEnterBackground:
。当通过按下“锁定”按钮或来电来中断应用程序时,不会调用后一种方法。我们可以使用此信息来区分这两种情况。
假设您希望screenLockActivated
在屏幕被锁定时在方法中回调。这是魔术:
- (void)applicationWillResignActive:(UIApplication*)aApplication{ [self performSelector:@selector(screenLockActivated) withObject:nil afterDelay:0];}- (void)applicationDidEnterBackground:(UIApplication*)aApplication{ [NSObject cancelPreviousPerformRequestsWithTarget:self];}- (void)screenLockActivated{ NSLog(@"yaay");}
说明:
默认情况下,我们假设每次调用applicationWillResignActive:
都是因为活动 - >非活动状态转换(如锁定屏幕时),但我们慷慨地让系统通过延迟在超时(在这种情况下,单个runloop循环)中证明相反打电话给screenLockActivated
。如果屏幕被锁定,系统将完成当前的runloop循环,而不会触及任何其他委托方法。但是,如果这是一个active-> background状态转换,它也会applicationDidEnterBackground:
在循环结束之前调用,这允许我们从那里简单地取消先前调度的请求,从而防止它在不应该被调用时被调用。
请享用!
- 3 回答
- 0 关注
- 712 浏览
添加回答
举报