美文网首页
iOS - 应用程序进入后台,继续执行某个任务

iOS - 应用程序进入后台,继续执行某个任务

作者: HanZhiZzzzz | 来源:发表于2018-12-28 13:41 被阅读0次

方案一:

情景分析:
IOS 应用程序在进入后台之后一般几秒钟之后系统就会把主线程挂起,当然对应的子线程也会被挂起.但是,如果在应用接入后台之前,请求了某个网络数据,当时尚未请求到数据,此时我们想让应用在后台继续尝试请求数据,该如何做呢?

IOS 为我们提供了 - -

-(UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void(^ __nullable)(void))handler ;
endBackgroundTask​ ;

​两者必须成对使用;

具体实现:​

// 监听按下Home键,程序进入后台(UIApplicationWillResignActiveNotification-系统提供的监听)

   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(WillResignActiveNotification) name:UIApplicationWillResignActiveNotification object:nil];
 
- (void)WillResignActiveNotification{

//得到当前应用程序的UIApplication对象
UIApplication *app = [UIApplication sharedApplication];
    
 //一个后台任务标识符
 UIBackgroundTaskIdentifier taskID;
 taskID = [app beginBackgroundTaskWithExpirationHandler:^{
 //如果超时(一般超时时间为10min),将执行这个程序块,并停止运行应用程序,     
   [app endBackgroundTask:taskID];
    }];
  }
    // 要执行的请求任务
-(void)task{
//  请求任务
}

//请求完成,告诉系统我们完成了,

[app endBackgroundTask:taskID];

摘自:http://blog.sina.com.cn/s/blog_9cd71e570102wlbf.html

方案二:

正常程序退出后,会在几秒内停止工作;
要想申请更长的时间,需要用到
beginBackgroundTaskWithExpirationHandler
endBackgroundTask
一定要成对出现

- (void)applicationDidEnterBackground:(UIApplication *)application {
  
  [self beginTask];
  //在非主线程开启一个操作在更长时间内执行; 执行的动作
  aa =0;
  _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(go:) userInfo:nil repeats:YES]; 
}

-(void)go:(NSTimer *)tim
{
  NSLog(@"%@==%ld ",[NSDate date],aa);
  aa++;
  if (aa==9) {
      [_timer invalidate];
          [self endBack]; // 任务执行完毕,主动调用该方法结束任务
  }
}

-(void)beginTask
{
  NSLog(@"begin=============");
 _backIden = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
     NSLog(@"begin  bgend=============");
     [self endBack]; // 如果在系统规定时间内任务还没有完成,在时间到之前会调用到这个方法,一般是10分钟
 }];
}

-(void)endBack
{
  NSLog(@"end=============");
  [[UIApplication sharedApplication] endBackgroundTask:_backIden];
  _backIden = UIBackgroundTaskInvalid;
}

摘自:https://www.jianshu.com/p/a668f1770efb

相关文章

  • iOS - 应用程序进入后台,继续执行某个任务

    方案一: 情景分析:IOS 应用程序在进入后台之后一般几秒钟之后系统就会把主线程挂起,当然对应的子线程也会被挂起....

  • Alamofire与原生URLSession后台下载

    后台下载顾名思义既 iOS 应用程序放到后台时继续执行下载任务。但还是有几处需要额外处理的,需要稍微注意下。 UR...

  • iOS 后台相关

    在iOS后台执行是本文要介绍的内容,大多数应用程序进入后台状态不久后转入暂停状态。在这种状态下,应用程序不执行任何...

  • iOS后台模式借助位置更新实现

    需求:iOS系统下使我们的app在后台下(点击Home键进入后台)仍能继续运行任务. 阅读前提: 了解后台任务机制...

  • 13.Linux程序与资源管理

    Linux后台工作管理&:后台执行某个任务 command & bg 将当前任务放到后台++++++ fi...

  • 后台延迟线程挂起

    问题:一般APP在切入后台5s后,线程挂起进入休眠状态。为了使APP进入后台后继续执行任务,则需要延迟后台休眠状态...

  • IOS后台挂起时继续执行任务

    在APP进入后台时,会自动中断正在执行的任务。例如你正在下载一个文件时,不小心退出了当前屏幕(ReturnBack...

  • iOS后台任务崩溃处理方式

    iOS App 后台任务的坑 大多数 iOS App 在进入后台之后都会将一些关键任务封装到 Background...

  • iOS APP在后台执行任务

    正常APP在切换到后台后不能继续执行代码,有时我们有任务需要继续执行,目前了解到可以使用以下方法: 使用后台任务...

  • Android性能优化

    合理管理内存 节制的使用Service 如果应用程序需要使用Service来执行后台任务的话,只有当任务正在执行的...

网友评论

      本文标题:iOS - 应用程序进入后台,继续执行某个任务

      本文链接:https://www.haomeiwen.com/subject/bfvslqtx.html