官方文档:http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

中文的好文章

http://www.devdiv.com/thread-47004-1-1.html

http://www.cnblogs.com/haipingwu/archive/2011/03/18/1987962.html

iOS4 请求更多后台时间

http://blog.csdn.net/zhangao0086/article/details/6739266

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

判断是否支持多线程

[html] view plaincopy
  1. <span style="font-size:16px;">UIDevice* device = [UIDevice currentDevice];
  2. BOOL backgroundSupported = NO;
  3. if ([device respondsToSelector:@selector(isMultitaskingSupported)])
  4. backgroundSupported = device.multitaskingSupported; </span>

声明你需要的后台任务

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

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

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

voip:在后台使用VOIP功能

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

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

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

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

实现长时间的后台任务

应用程序可以请求在后台运行以实现特殊的服务。这些应用程序并不连续的运行,但是会被系统框架在合适的时间唤醒,以实现这些服务

1.追踪用户位置:略

2.在后台播放音频:

[html] view plaincopy
  1. 1. //后台播放
  2. AVAudioSession *session = [AVAudioSession sharedInstance];
  3. [session setActive:YES error:nil];
  4. [session setCategory:AVAudioSessionCategoryPlayback error:nil];
  5. 2. 让后台可以处理多媒体的事件
  6. [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
  7. Remote-control events originate as commands issued by headsets and external accessories that are intended to control multimedia presented by an application. To stop the reception of remote-control events, you must call endReceivingRemoteControlEvents.
  8. 3.系统进入后台运行时,让程序可以运行一段时间。使用此方法争取一定的时间,在程序进入后台后处理一些事情。
  9. - (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void(^)(void))handler
  10. This method lets your application continue to run for a period of time after it transitions to the background.
  11. your application could call this method to ensure that had enough time to transfer an important file to a remote server or at least attempt to make the transfer and note any errors. You should not use this method simply to keep your application running after it moves to the background.

3.实现VOIP应用:

在后台完成有限长度的任务

官方文档http://developer.apple.com/library/iOS/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

在被终止之前的任意时间,应用程序会调用beginBackgroundTaskWithExpirationHandler:方法让系统给出额外 的时间来完成一些需要在后台长时间执行的任务。(UIApplication的backgroundTimeRemaining属性包含程序运行的总时 间)

可以使用task completion去保证那些比较重要但是需要长时间运行的程序不会由于用户切入后台而突然关闭。比如,你可以用这项功能来将用户的信息保存到disk上或者从网络下载一个重要的文件。有两种方式来初始化这样的任务:

1、将长时间运行的重要任务用beginBackgroundTaskWithExpirationHandler:和endBackgroundTask:包装。这样就在程序突然切入后台的时候保护了这些任务不被中断。

2、当你的应用程序委托applicationDidEnterBackground:方法被调用时再启动任务

中的两个方法必须是一一对应的,endBackgroundTask:方法告诉系统任务已经完成,程序在此时可以被终止。由于应用程序只有有限的时 间去完成后台任务,你必须在超时或系统将要终止这个程序之前调用这个方法。为了避免被终止,你也可以在一个任务开始的时候提供一个expiration handler和endBackgroundTask:方法。(可以查看backgroundTimeRemaining属性来确定还剩多少时间)。

一个程序可以同时提供多个任务,每当你启动一个任务的时候,beginBackgroundTaskWithExpirationHandler: 方法将返回一个独一无二的handler去识别这个任务。你必须在endBackgroundTask:方法中传递相同的handler来终止该任务。

[html] view plaincopy
  1. Listing 4-2 Starting a background task at quit time
  2. - (void)applicationDidEnterBackground:(UIApplication *)application
  3. {
  4. UIApplication* app = [UIApplication sharedApplication];
  5. bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
  6. [app endBackgroundTask:bgTask];
  7. bgTask = UIBackgroundTaskInvalid;
  8. }];
  9. // Start the long-running task and return immediately.
  10. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
  11. 0), ^{
  12. // Do the work associated with the task.
  13. [app endBackgroundTask:bgTask];
  14. bgTask = UIBackgroundTaskInvalid;
  15. });
  16. }

上述例子中,bgTask变量是一个类的成员变量,存储着指向该后台任务标示的指针。

在expriation handler中,可以添加关闭任务所需的代码。尽管如此,加入的代码不能执行太长的时间,当expriation handler被调用的时候,该程序已经非常接近被关闭,所以只有极短的时间来清除状态信息并终止任务。

安排Local Notification的传递

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类方法提供选项去确定是立即传递还是在指定的时间传递

[html] view plaincopy
  1. Listing 4-3 Scheduling an alarm notification
  2. - (void)scheduleAlarmForDate:(NSDate*)theDate
  3. {
  4. UIApplication* app = [UIApplication sharedApplication];
  5. NSArray* oldNotifications = [app scheduledLocalNotifications];
  6. // Clear out the old notification before scheduling a new one.
  7. if ([oldNotifications count] > 0)
  8. [app cancelAllLocalNotifications];
  9. // Create a new notification.
  10. UILocalNotification* alarm = [[[UILocalNotification alloc] init] autorelease];
  11. if (alarm)
  12. {
  13. alarm.fireDate = theDate;
  14. alarm.timeZone = [NSTimeZone defaultTimeZone];
  15. alarm.repeatInterval = 0;
  16. alarm.soundName = @"alarmsound.caf";
  17. alarm.alertBody = @"Time to wake up!";
  18. [app scheduleLocalNotification:alarm];
  19. }
  20. }

(可以最多包含128个 local notifications active at any given time, any of which can be configured to repeat at a specified interval.)如果在调用该notification的时候,程序已经处于前台,那么 application:didReceiveLocalNotification:方法将取而代之。

小结:关于详解在IOS后台执行的内容介绍完了,希望本文对你有所帮助!

iOS 切换到后台任务执行相关推荐

  1. 一个Java Web后台任务执行工具的设计与实现

    一个Java Web后台任务执行工具的设计与实现 提到后台任务,最容易想到的恐怕就是Java 中的Timer或者大名鼎鼎的开源定时器Quartz,但是,从本质讲,他们都是定时器,以时间间隔严格的进行间 ...

  2. linux切换用户并执行命令

    在当前用户下,不切换用户的前提下,用另一个用户执行命令 一:在shell脚本里切换用户执行命令,适合复杂命令 新建文件: cat test.sh 编辑文件内容: #!/bin/bash su - te ...

  3. 安卓自动点击器和iOS切换控制在移动端测试中的应用

    在移动端测试工作中有一些需要长时间进行简单且重复操作的场景,这种情况可以借助一些简单的小工具来实现自动化点击操作.能够应用以下工具的场景需要满足两个条件:1.操作简单,只涉及一些点击.滑动.长按.双击 ...

  4. redis一主一从一哨兵,第一次主从切换成功,再次主从切换无法正常执行?

    自己在服务器学着搭建redis主从复制和哨兵模式.为了简单,一开始只是搭建了一主(port 9001),一从(port 6379),一哨兵(26379) 主从哨兵都在一台服务器上,并且主从服务器均设置 ...

  5. Xamarin iOS 切换开发者账号之后的签名标识和预配配置文件更新方法

    其实这一篇和 Xamarin 开发几乎没有关系,这是苹果开发的一个坑.在原有开发者账号下的设备上,切换为另一个开发者账号,此时的部署也许会找错 预配配置 文件和证书.苹果:渣渣开发者,这是特性 在 X ...

  6. iOS快捷指令:执行Python脚本(利用iSH Shell)

    文章目录 前言 核心逻辑 配置iSH 安装Python 创建Python脚本 配置启动文件 测试效果 快捷指令 前言 iOS快捷指令所能做的操作极为有限.假如快捷指令能运行Python程序,那么可操作 ...

  7. ios切换android不用电脑,非 Power User 的无痛切换:iOS to Android

    设备 iPhone 6s to OnePlus 5T 起源 手头上的 iPhone 6s 约莫用了两年多,今年虽然换了电池,续航和流畅度的表现却仍然有些遗憾.然而你果一年一更的新特性却一直没能吸引到我 ...

  8. iOS 延迟1.5s 执行方法

    1. [self performSelector:@selector(fangfa) withObject:nil afterDelay:0.5];  // performSelector   2.  ...

  9. iOS NSOperation 非并发执行

    NSOperation提供了一种面向对象的方法来封装任务.NSOperation可以单独执行,也可以放到NSOperationQueue中执行. NSOperation是虚基类不能直接使用,但Coco ...

最新文章

  1. 对Apache2进行简单配置
  2. Thinkpad R400 a16驱动安装笔记
  3. Java里的线程控制
  4. lucky前面加a还是an_“不可数”名词前何时加a/an,何时不加?来自本站教师群的两道典型题问答,揭示了规律 白话英语201931...
  5. mysql change命令_Mysql 操作基本命令大全
  6. abaqus python二次开发攻略_基于CAE二次开发进行弹簧批量建模
  7. Python3.6 deep learning first step
  8. 【2】最简单的Laravel5.1程序分析
  9. 2c语言程序设计_大学生学C语言的理由是什么
  10. 计算机发展史的内容概述,计算机及其发展史概述
  11. python决策树预测模型_「数据挖掘入门系列」数据挖掘模型之分类与预测 - 决策树...
  12. Java实现布隆过滤器(已爬URL过滤)
  13. 微信读书 iOS 性能优化总结
  14. 定制通达信多周期同列版面
  15. python 哈希_python实现哈希集合
  16. python 单词拆音节_实用小技巧,Python一秒将全部中文姓名转为拼音!
  17. 50位中外AI领袖论剑AI World,世界人工智能大会10大亮点全回顾
  18. 一加官方证实保留耳机插孔,全面屏新品命名一加5T
  19. BF发卡网开源源码+详细教程
  20. 大一新生必看,自学必看,里昂详解数据结构之图

热门文章

  1. Android 写自己的开源库,发布到 JitPack
  2. 约翰·聂夫:31年22次跑赢市场、55倍投资回报,传奇投资大师的7种投资武器!
  3. vmware虚拟机卸载清理工具 1.3 最新版
  4. 技术点:前端缓存分类及使用
  5. 3分钟详解服务器入网带宽出网带宽和入流量出流量
  6. servlet 3.0 slf4j +log4j2 始终无法写入log文件的解决
  7. git init 命令详解
  8. 2021年12种高级UX / UI设计趋势
  9. java开发简单解释器,实现一个简单的解释器(5)
  10. mac word打印一张红色(带颜色)的A4纸