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 關注
- 761 瀏覽
添加回答
舉報