博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UIApplication委托信息(多任务)
阅读量:5867 次
发布时间:2019-06-19

本文共 2564 字,大约阅读时间需要 8 分钟。

一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间。

还有三种类型的可以运行在后台,

1.音乐 2.location 3.voip

大多数应用程序进入后台状态不久后转入暂停状态。在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除。应用程序提供特定的服务,用户可以请求后台执行时间,以提供这些服务。

判断是否支持多线程

  1. UIDevice* device = [UIDevice currentDevice];  
  2. BOOL backgroundSupported = NO;  
  3. if ([device respondsToSelector:@selector(isMultitaskingSupported)])  
  4. backgroundSupported = device.multitaskingSupported;

 

声明你需要的后台任务

Info.plist中添加UIBackgroundModes键值,它包含一个或多个string的值,包括

audio:在后台提供声音播放功能,包括音频流和播放视频时的声音

location:在后台可以保持用户的位置信息

voip:在后台使用VOIP功能

前面的每个value让系统知道你的应用程序应该在适当的时候被唤醒。例如,一个应用程序,开始播放音乐,然后移动到后台仍然需要执行时间,以填补音频输出缓冲区。添加audio键用来告诉系统框架,需要继续播放音频,并且可以在合适的时间间隔下回调应用程序;如果应用程序不包括此项,任何音频播放在移到后台后将停止运行。

除了添加键值的方法,IOS还提供了两种途径使应用程序在后台工作:

Task completion—应用程序可以向系统申请额外的时间去完成给定的任务

Local notifications—应用程序可以预先安排时间执行local notifications 传递

 

Task completion:

iOS不是真正的多任务系统,在用户按下Home按钮后,所有应用程序都会进入后台状态,并且大部分都会迅速进入暂停状态,应用程序的所有工作内存都在RAM中,在暂停时它完全不执行。因此,切换回这样的应用程序非常快。但是如果系统需要更多的内存给当前处于活动状态的应用程序,就有可能终结暂停状态的应用程序,它们的内存也将被释放。

一方面,应用程序在进入后台状态时,需要释放一些资源,使自身的暂停快照更小,从而减少从RAM中清除的风险,另一方面,为了避免被终结而丢失用户的数据,需要在用户离开时保存他们的进度信息,这些工作,需要在5秒钟内完成,不然会被系统认定有异常被强制退出。可能通过接收应用程序发送的通知(UIApplicationDidEnterBackgroundNotification)来触发处理,如果在处理代码中加上下面这条语句则必然会导致异常退出:

[NSThread sleepForTimeInterval:10];

可以通过一种方法来请求更多后台时间来避免此问题。假设接收通知而触发的处理方法是applicationDidEnterBackground:

-(void)applicationDidEnterBackground{      NSLog(@"%@",NSStringFromSelector(_cmd));  //得到当前应用程序的UIApplication对象      UIApplication *app = [UIApplication sharedApplication];  //一个后台任务标识符      UIBackgroundTaskIdentifier taskID;      taskID = [app beginBackgroundTaskWithExpirationHandler:^{  //如果系统觉得我们还是运行了太久,将执行这个程序块,并停止运行应用程序          [app endBackgroundTask:taskID];      }];  //UIBackgroundTaskInvalid表示系统没有为我们提供额外的时候      if (taskID == UIBackgroundTaskInvalid) {          NSLog(@"Failed to start background task!");  return;      }      NSLog(@"Starting background task with %f seconds remaining", app.backgroundTimeRemaining);      [NSThread sleepForTimeInterval:10];      NSLog(@"Finishing background task with %f seconds remaining",app.backgroundTimeRemaining);  //告诉系统我们完成了      [app endBackgroundTask:taskID];  }

Local notifications:

UILocalNotification类提供了一种方法来传递local notifications。和push notifications需要设置remote server不同,local notifications 在程序中安排并在当前的设备上执行。满足如下条件可以使用该能力:

1、一个基于时间的程序,可以在将来特定的时间让程序post 一个alert,比如闹钟

2、一个在后台运行的程序,post 一个local notification去引起用户的注意

为了安排local notification 的传递,需要创建一个UILocalNotification的实例,并设置它,使用UIApplication类方法来安排它。Local notification对象包含了所要传递的类型(sound,alert,或者badge)和时间何时呈现) 。UIApplication类方法提供选项去确定是立即传递还是在指定的时间传递。

转载地址:http://jcnnx.baihongyu.com/

你可能感兴趣的文章
xx项目性能测试的一般过程
查看>>
JDK8中ArrayList的工作原理剖析
查看>>
获取AFP共享的文件夹及其权限
查看>>
安装Ubuntu虚拟系统
查看>>
访问网站出现图片破裂
查看>>
安装gulp及相关插件
查看>>
如何在Linux用chmod来修改所有子目录中的文件属性?
查看>>
项目: Zabbix监控搭建部署
查看>>
Windows7配置python环境变量
查看>>
学习mysql
查看>>
Applet
查看>>
gNewsense设置自动登录
查看>>
iostream与iostream.h的区别
查看>>
Java微信公众平台开发(十三)--微信JSSDK中Config配置
查看>>
移动端链接、点击事件、输入框去除背景高亮
查看>>
SQL 优化原则(转)
查看>>
神奇代码
查看>>
android pop3与imap方式接收邮件(javamail)
查看>>
如果不能显示真正的考验个别车型toast问题解决
查看>>
unity3D分辨率适应
查看>>