定义两个宏:
1
2
3
4
| //监听锁屏事件
#define kNotificationLock CFSTR("com.apple.springboard.lockcomplete")
//监听屏幕状态变化事件
#define kNotificationChange CFSTR("com.apple.springboard.lockstate")
|
注册达尔文通知:
注意此处CFNotificationCenterAddObserver() 为C的函数,其第三个参数需要传一个回调函数
1
2
3
4
5
6
7
8
9
10
| - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
//监听锁屏事件
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, screenLockStateChanged, kNotificationLock, NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
//监听屏幕状态变化事件
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, screenLockStateChanged, kNotificationChange, NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
return YES;
}
|
定义一个全局变量stateChaned,用来判断屏幕变化的状态
1
2
| @property (nonatomic, assign)BOOL stateChanged;
|
定义AppDelegate的单例,以便在回调函数中调用stateChanged
1
2
3
4
5
| //定义AppDelegate单例
+ (AppDelegate *)sharedDelegate{
return (AppDelegate *)[UIApplication sharedApplication].delegate;
}
|
实现通知回调函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| static void screenLockStateChanged(CFNotificationCenterRef center,void* observer,CFStringRef name,const void* object,CFDictionaryRef userInfo){
NSString* lockstate = (__bridge NSString*)name;
if ([lockstate isEqualToString:(__bridge NSString*)kNotificationLock]) {
[AppDelegate sharedDelegate].stateChanged = YES;
NSLog(@"锁屏");
}
else{
if ([AppDelegate sharedDelegate].stateChanged) {
[AppDelegate sharedDelegate].stateChanged = NO;
}else{
NSLog(@"解锁");
}
}
}
|
运行效果:
Perfect! 锁屏 解锁只会打印一次。
这样把你的锁屏、解锁时触发的代码放在其中就可以了!