当前位置: 首页 > news >正文

应用如何在后台执行

转:http://izhuaodev.blog.51cto.com/6266344/1108483

     当一个iOS 应用被送到后台,它的主线程会被暂停。你用NSThread的detachNewThreadSelector:toTarget:withObject:类方法创建的线程也被挂起了。如果你想在后台完成一个长期任务,就必须调用UIApplication
的beginBackgroundTaskWithExpirationHandler:实例方法,来向iOS 借点时间。UIApplication的
backgroundTimeRemaining属性包含了程序完成他的任务可以使用的秒数。如果在这个期限内,长期任务没有被完成,iOS 将终止程序。每个对beginBackgroundTaskWithExpirationHandler:方法的调用,必须要相应的调用endBackgroundTask:方法(UIApplication的另一个实例方法)。也就是说,如果你向iOS 要更多时间来完成一个任务,你必须告诉iOS 你什么时候能完成那个任务,那时,你的程序将和其所有被暂停的线程被放入后台。 
 
          当你的程序在前台时,UIApplication的backgroundTimeRemaining属性等于DBL_MAX常量,这是double类型可表示的最大值(和这个值相当的integer 通常等于-1)。在iOS 被要求在程序被完全挂起之前给于更多的执行时间,这个属性指明了在完成任务前程序拥有多少秒。 
 
         在程序中你可以多次调用beginBackgroundTaskWithExpirationHandler:方法。要记住的重点是,当iOS 为你的程序返回一个token 或者任务标识(task  identifier)时,你都必须调用endBackgroundTask:方法,在运行的任
务结束时,用来标志任务结束。如果你不这么做的话,iOS 会终止你的程序。 
 
        在后台时,程序不应该执行完全的功能,也不应该处理大量数据。事实上,他们只应该完成一个长期任务。 
 
比如,一个程序正在调用一个web  service  API,并且还没有从服务器上的那个API接收到响应。在此期
间,如果程序被送入后台,它可以请求更多的时间,直到它从服务器收到响应。一旦响应被接收,程序必须保存其状态,并调用UIApplication的endBackgroundTask:实例方法将任务标记为完成。

下面我们看看代码实现的步骤:

1、定义一个任务标识

  1. @property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backtaskIdentifier; 

2、当ios app 进入后台时,会自动调用appdelegate的   

      - (void)applicationDidEnterBackground:(UIApplication *)application   方法,在这里我们编写要执行的任务

  1. - (void)applicationDidEnterBackground:(UIApplication *)application 
  2.    //检测多任务的可用性 
  3.     if ([self isMultitaskingSupported] == NO) { 
  4.         return; 
  5.     }    
  6.     //定义要完成的任务 ,开始执行,
  7. ......
  8.  
  9. //返回一个任务标识
  10. self.backtaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^(void){ 
  11.         // do something 。。。
  12.  
  13. //结束该任务
  14. [[UIApplication sharedApplication] endBackgroundTask:self.backtaskIdentifier];
    //将任务标识符标记为 UIBackgroundTasksInvalid,标志任务结束
  15. self.backtaskIdentifier = UIBackgroundTaskInvalid;
  16.     }];  
  17.  

 如上代码所示,我们在使用多任务的前提,一定是我们的系统支持多任务,可见检测任务的可用性是一项必不可少的步骤:

  1. - (BOOL) isMultitaskingSupported{ 
  2.      
  3.     BOOL result; 
  4.     if ([[UIDevice currentDevice]respondsToSelector:@selector(isMultitaskingSupported)]) { 
  5.         result = [[UIDevice currentDevice] isMultitaskingSupported]; 
  6.     } 
  7.     return result; 

 我们调用 beginBackgroundTaskWithExpirationHandler: (UIApplication的一个实例方法) 方法,为app 返回了一个token 或任务标识,那么我们必须调用   endBackgroundTask:  (UIApplication的另一个实例方法)方法来结束该任务.

在后台任务的 完成处理者 (即beginBackgroundTaskWithExpirationHandler: 的块函数,)中,我们结束了任务,并进行必要的清理工作。

3、当我们的app回到前台的时候会调用- (void)applicationWillEnterForeground:(UIApplication *)application  方法,此时如果后台任务还在进行中我们就要结束他。

 

转载于:https://www.cnblogs.com/manle/p/5209295.html

相关文章:

  • c语言随机数
  • 混合使用Azure LB和ILB访问相同web服务(3)
  • git服务器修改ssh端口后配置方法
  • POJ 1005 I Think I Need a Houseboat
  • compileDebugJavaWithJavac
  • OSI七层与TCP/IP四层模型
  • 3-9-模拟银行排队过程-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版...
  • 《从零开始学Swift》学习笔记(Day 24)——枚举(Day 24)——枚举
  • 日志管理
  • 初探验证码识别
  • HttpClient4.5教程-基础 1.1
  • Spring的IoC容器(转)BeanFactory
  • 最短路问题------分别用深搜和广搜去解题
  • linux ps 查看耗cpu高的线程
  • LVS-NAT 模式配置
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【剑指offer】让抽象问题具体化
  • 【刷算法】从上往下打印二叉树
  • golang 发送GET和POST示例
  • HashMap ConcurrentHashMap
  • Java的Interrupt与线程中断
  • JWT究竟是什么呢?
  • leetcode46 Permutation 排列组合
  • PermissionScope Swift4 兼容问题
  • php的插入排序,通过双层for循环
  • Terraform入门 - 1. 安装Terraform
  • unity如何实现一个固定宽度的orthagraphic相机
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 开源SQL-on-Hadoop系统一览
  • 区块链将重新定义世界
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 实现菜单下拉伸展折叠效果demo
  • 事件委托的小应用
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 一道面试题引发的“血案”
  • ​决定德拉瓦州地区版图的关键历史事件
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (11)MSP430F5529 定时器B
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (4)Elastix图像配准:3D图像
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)hibernate配置管理
  • (二)WCF的Binding模型
  • (四) Graphivz 颜色选择
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • .NET 4.0中的泛型协变和反变
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET性能优化(文摘)
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @GlobalLock注解作用与原理解析