如何区分锁屏和home

  最近的项目中,当app进入后台时,需要执行一些操作。根据需求,还需要判断,是哪种操作导致app进入后台的:按home键;按锁屏键;在app中跳转到别的app。目前遇到的情况,就这三种。

  进入正题,找到AppDelegate.m 文件,然后:

  1、在方法 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中,添加如下代码:

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),

                                   NULL,

                                   displayStatusChanged,

                                   CFSTR("com.apple.springboard.lockcomplete"),

                                   NULL,

                                CFNotificationSuspensionBehaviorDeliverImmediately);


  2、在AppDelegate.m文件中,实现上一步中所出现的displayStatusChanged方法:

staticvoid displayStatusChanged(CFNotificationCenterRef center,

                                 void *observer,

                                 CFStringRef name,

                                 const void *object,

                                 CFDictionaryRef userInfo) {

   if (name ==CFSTR("com.apple.springboard.lockcomplete")) {

        [[NSUserDefaultsstandardUserDefaults] setBool:YESforKey:@"kDisplayStatusLocked"];

        [[NSUserDefaultsstandardUserDefaults] synchronize];

    }

}


  3、在方法- ( void)applicationDidEnterBackground:( UIApplication *)application中,添加如下代码:

UIApplicationState state = [[UIApplicationsharedApplication] applicationState];

   if (state ==UIApplicationStateInactive) {

       NSLog(@"按了锁屏键");

    }

   else if (state == UIApplicationStateBackground) {

       if (![[NSUserDefaultsstandardUserDefaults] boolForKey:@"kDisplayStatusLocked"]) {

           NSLog(@"按了home键,或者跳转到另一个app");

        }

        else {

           NSLog(@"按了锁屏键");

        }

    }


  4、在方法- ( void)applicationWillEnterForeground:( UIApplication *)application 中,添加如下代码:
[[ NSUserDefaults standardUserDefaults] setBool: NO forKey: @"kDisplayStatusLocked"];

[[NSUserDefaultsstandardUserDefaults] synchronize];


  5、真机调试,查看输出。

  个人理解:这个判断思路主要是根据,当锁屏时,iOS系统会触发一个通知,即com.apple.springboard.lockcomplete,当接收到这个通知时,我们设置一个标志位,即kDisplayStatusLocked,接着在applicationDidEnterBackground方法中(以下简称后台方法),判断该标志位的值。可能有的小伙伴会问,后台方法中出现的UIApplicationStateInactive是个什么什么鬼?我的理解是,iOS7之前,若是按锁屏键进入后台,则后台方法中,application.state是UIApplicationStateInactive,而按home键进入后台,application的状态是UIApplicationStateBackground。而iOS7之后,无论是锁屏,还是home键,进入后台时,application的状态都是UIApplicationStateBackground。因此,这个含有UIApplicationStateInactive的if语句,其实是用来适应iOS7之前的系统。

  
  PS:若有错误,请不吝赐教。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值