3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
回答:
應(yīng)用程序?qū)⒃诟鞣N情況下調(diào)用活動(dòng)調(diào)用...并且從我的所有測(cè)試中,即使您的應(yīng)用程序在后臺(tái)運(yùn)行時(shí)保持清醒狀態(tài),也無法確定屏幕是否已鎖定(CPU速度未報(bào)告,總線速度保持不變,mach_time denom / numer不會(huì)改變)......
但是,當(dāng)設(shè)備鎖定時(shí),Apple似乎關(guān)閉了加速計(jì)... 在屏幕鎖定時(shí)啟用iPhone加速計(jì) (在iPhone 4上測(cè)試iOS4.2有此行為)
從而...
在您的應(yīng)用程序委托中:
- (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;}
我知道......這是一種黑客攻擊,但到目前為止,它對(duì)我來說就像是一種魅力。如果您發(fā)現(xiàn)任何阻止其工作的問題,請(qǐng)更新。

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
有一種更漂亮的方式可以分辨任務(wù)切換和屏幕鎖定發(fā)起的applicationWillResignActive:
回調(diào),甚至不涉及無記錄功能,如加速度計(jì)狀態(tài)。
當(dāng)應(yīng)用程序移動(dòng)到后臺(tái)時(shí),應(yīng)用程序委托首先發(fā)送一個(gè)applicationWillResignActive:
,然后發(fā)送一個(gè)applicationDidEnterBackground:
。當(dāng)通過按下“鎖定”按鈕或來電來中斷應(yīng)用程序時(shí),不會(huì)調(diào)用后一種方法。我們可以使用此信息來區(qū)分這兩種情況。
假設(shè)您希望screenLockActivated
在屏幕被鎖定時(shí)在方法中回調(diào)。這是魔術(shù):
- (void)applicationWillResignActive:(UIApplication*)aApplication{ [self performSelector:@selector(screenLockActivated) withObject:nil afterDelay:0];}- (void)applicationDidEnterBackground:(UIApplication*)aApplication{ [NSObject cancelPreviousPerformRequestsWithTarget:self];}- (void)screenLockActivated{ NSLog(@"yaay");}
說明:
默認(rèn)情況下,我們假設(shè)每次調(diào)用applicationWillResignActive:
都是因?yàn)榛顒?dòng) - >非活動(dòng)狀態(tài)轉(zhuǎn)換(如鎖定屏幕時(shí)),但我們慷慨地讓系統(tǒng)通過延遲在超時(shí)(在這種情況下,單個(gè)runloop循環(huán))中證明相反打電話給screenLockActivated
。如果屏幕被鎖定,系統(tǒng)將完成當(dāng)前的runloop循環(huán),而不會(huì)觸及任何其他委托方法。但是,如果這是一個(gè)active-> background狀態(tài)轉(zhuǎn)換,它也會(huì)applicationDidEnterBackground:
在循環(huán)結(jié)束之前調(diào)用,這允許我們從那里簡(jiǎn)單地取消先前調(diào)度的請(qǐng)求,從而防止它在不應(yīng)該被調(diào)用時(shí)被調(diào)用。
請(qǐng)享用!
- 3 回答
- 0 關(guān)注
- 760 瀏覽
添加回答
舉報(bào)