后台运行

设备运行的五种状态

Not running 程序未启动 或者已经被杀死
Inactive 当前应用正在前台运行,但是并不接收事件 中途过渡会短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候
Active 当前应用正在前台运行,并且接收事件 即App在线
Suspended 应用处在后台,并且已停止执行代码 另一称呼为挂起状态,APP依然处在系统内存中,当系统发出低内存警告时,会杀死这个进程以保证其他的前台应用正常运行,我们要做的也就是防止app被挂起 从而能够进入后台模式
Background 应用处在后台,并且还在执行代码。一般的应用,会在此状态停留10分钟, 而iOS为了在某些情况下提供更好的体验,提供了一些选项,满足这些选项就可以在后台运行很长一段时间

后台运行_第1张图片
Paste_Image.png

应用程序生命周期

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

      NSLog(@"\n ===> 程序启动 !");
    return YES;
}
//  当有电话进来或者锁屏,这时你的应用程会挂起  你可以重写这个方法,做挂起前的工作,比如关闭网络,保存数据
//  游戏应该用这个方法暂停游戏
- (void)applicationWillResignActive:(UIApplication *)application {
     NSLog(@"\n ===> 程序暂行 !");
}
/*
    用这个方法来释放共享资源,保存用户数据,销毁计时器,并储存足够的应用程序状态信息来恢复您的应用程序的当前状态
    如果您的应用程序支持后台执行,这种方法被称为替代applicationWillTerminate:当用户退出
 */
- (void)applicationDidEnterBackground:(UIApplication *)application {
     NSLog(@"\n ===> 程序进入后台 !");
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
     NSLog(@"\n ===> 程序进入前台 !");
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
     NSLog(@"\n ===> 程序重新激活 !");
}
/*
 当用户按下按钮,或者关机,程序都会被终止。当一个程序将要正常终止时会调用 applicationWillTerminate 方法。但是如果长主按钮强制退出,则不会调用该方法。这个方法该执行剩下的清理工作,比如所有的连接都能正常关闭,并在程序退出前执行任何其他的必要的工作
 杀死程序
 */
- (void)applicationWillTerminate:(UIApplication *)application {
    NSLog(@"\n ===> 程序被kill!");
}

向系统借10分钟后台运行时间

1.借条

@interface AppDelegate : UIResponder 
@property (strong, nonatomic) UIWindow *window;
/**
 *  借条
 */
@property (nonatomic, unsafe_unretained)UIBackgroundTaskIdentifier backgroundTaskIdentifier;
@end

2.10分钟内需要做的事

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 if ([self isMultitaskingSupported]) {
   self.myTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(print) userInfo:nil repeats:YES];
    NSLog(@"\n ===> 程序启动 !");
}
    return YES;
}

- (void)print
{
    NSLog(@"更新时间");
}

3.时间到了之后应该做的事


- (void)applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"\n ===> 程序进入后台 !");
    self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{
         // 当应用程序留给后台的时间快要到结束时 这个Block块将被执行
        [self endBackgroundTask];
    }];
}

- (void) endBackgroundTask{
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    AppDelegate *weakSelf = self;
    dispatch_async(mainQueue, ^(void) {
        AppDelegate *strongSelf = weakSelf;
        if (strongSelf != nil)
        {
            [strongSelf.myTimer invalidate];// 停止定时器
            // 标记指定的后台任务完成
            [[UIApplication sharedApplication]endBackgroundTask:self.backgroundTaskIdentifier];
            // 销毁后台任务标识符
            strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
        }
    });
    
}

你可能感兴趣的:(后台运行)