




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ios之申请后台延时执行和做一个假后台的方法我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法。/当应用程序掉到后台时,执行该方法- (void)applicationDidEnterBackground:(UIApplication*)application我们已经知道:当一个iOS应用被送到后台,它的主线程会被暂停。你用NSThread的detachNewThreadSelector:toTar get:withObject:类方法创建的线程也被挂起了。我们假设有这么一种情况:当我们的应用程序从前台被送到了后台。这时候,我们的程序将执行委托方法applicationDidEnterBackground。但是,这时候,应用程序只给了我们可怜的一点点时间(也就是秒级别的)来处理东西,然后,所有的线程都被挂起了。而实际中,我们可能需要更长的时间来完成我们的需要的必要操作:1.我们需要在应用程序推到后台时,能够有足够的时间来完成将数据保存到远程服务器的操作。2.有足够的时间记录一些需要的信息操作。怎么办?!因为我们需要的时间可能会有点长,而默认情况下,iOS没有留给我们足够的时间。悲剧了总需要有一个办法来解决向iOS申请,在后台完成一个Long-Running Task任务当一个iOS应用被送到后台,它的主线程会被暂停。你用NSThread的detachNewThreadSelector:toTar get:withObject:类方法创建的线程也被挂起了。如果你想在后台完成一个长期任务,就必须调用UIApplication的beginBackgroundTaskWithExpirationHandler:实例方法,来向iOS借点时间。默认情况下,如果在这个期限内,长期任务没有被完成,iOS将终止程序。怎么办?可以使用beginBackgroundTaskWithExpirationHandler:实例方法,来向iOS再借点时间。既然是借时间,那么就需要有一些约定俗成的方式。先贴代码吧:1.项目的AppDelegate.h文件中声明一个UIBackgroundTaskIdentifier,相当于一个借据吧。告诉iOS,我们的程序将要借更多的时间来完成Long-Running Task任务。property(nonatomic,unsafe_unretained)UIBackgroundTaskIdentifierbackgroundTaskIdentifier;property(nonatomic,strong)NSTimer*myTimer;2.项目的AppDelegate.m文件中1.注意在applicationDidEnterBackground方法中,完成借据的流程即:self.backgroundTaskIdentifier=applicationbeginBackgroundTaskWithExpirationHandler:(void) selfendBackgroundTask;/当应用程序掉到后台时,执行该方法/当一个iOS应用被送到后台,它的主线程会被暂停。你用NSThread的detachNewThreadSelector:toTar get:withObject:类方法创建的线程也被挂起了。/如果你想在后台完成一个长期任务,就必须调用UIApplication的beginBackgroundTaskWithExpirationHandler:实例方法,来向iOS借点时间。/默认情况下,如果在这个期限内,长期任务没有被完成,iOS将终止程序。/怎么办?可以使用beginBackgroundTaskWithExpirationHandler:实例方法,来向iOS再借点时间。- (void)applicationDidEnterBackground:(UIApplication*)application /使用这个方法来释放公共的资源、存储用户数据、停止我们定义的定时器(timers)、并且存储在程序终止前的相关信息。 /如果,我们的应用程序提供了后台执行的方法,那么,在程序退出时,这个方法将代替applicationWillTerminate方法的执行。 /标记一个长时间运行的后台任务将开始 /通过调试,发现,iOS给了我们额外的10分钟(600s)来执行这个任务。 self.backgroundTaskIdentifier=applicationbeginBackgroundTaskWithExpirationHandler:(void) /当应用程序留给后台的时间快要到结束时(应用程序留给后台执行的时间是有限的), 这个Block块将被执行 /我们需要在次Block块中执行一些清理工作。 /如果清理工作失败了,那么将导致程序挂掉 /清理工作需要在主线程中用同步的方式来进行 selfendBackgroundTask; /模拟一个Long-Running Task self.myTimer=NSTimerscheduledTimerWithTimeInterval:1.0ftarget:selfselector:selector(timerMethod:) userInfo:nilrepeats:YES;2.完成后,要告诉iOS,任务完成,提交完成申请“好借好还”:UIApplicationsharedApplicationendBackgroundTask:self.backgroundTaskIdentifier;strongSelf.backgroundTaskIdentifier=UIBackgroundTaskInvalid;);- (void) endBackgroundTask dispatch_queue_tmainQueue =dispatch_get_main_queue();AppDelegate*weakSelf =self;dispatch_async(mainQueue, (void) AppDelegate*strongSelf = weakSelf;if(strongSelf !=nil)strongSelf.myTimerinvalidate;/停止定时器 /每个对beginBackgroundTaskWithExpirationHandler:方法的调用,必须要相应的调用endBackgroundTask:方法。这样,来告诉应用程序你已经执行完成了。 /也就是说,我们向iOS要更多时间来完成一个任务,那么我们必须告诉iOS你什么时候能完成那个任务。 /也就是要告诉应用程序:“好借好还”嘛。 /标记指定的后台任务完成 UIApplicationsharedApplicationendBackgroundTask:self.backgroundTaskIdentifier;/销毁后台任务标识符strongSelf.backgroundTaskIdentifier=UIBackgroundTaskInvalid;);/模拟的一个Long-Running Task方法- (void) timerMethod:(NSTimer*)paramSender / backgroundTimeRemaining属性包含了程序留给的我们的时间 NSTimeIntervalbackgroundTimeRemaining =UIApplicationsharedApplicationbackgroundTimeRemaining;if(backgroundTimeRemaining =DBL_MAX) NSLog(Background Time Remaining = Undetermined);else NSLog(Background Time Remaining = %.02f Seconds, backgroundTimeRemaining);3.记住,借和换必须成双成对!具体的解释,我也写在了方法中,如果有错误之处,还希望能够指正!谢谢!4.如果,程序提前完成了,也可以提前结束:UIApplicationsharedApplicationendBackgroundTask:self.backgroundTaskIdentifier; self.backgroundTaskIdentifier=UIBackgroundTaskInvalid;向iOS申请,在后台无限时间经过证明,即使时执行Long-Running Task 任务,当程序被调到后台后,也是有时间限制的。一般为10分总(600s)。如何向程序申请无限时间呢?!那就欺骗iOS系统吧。让它感觉你的程序还是在运行。那就在后台用AVAudioPlayer无限循环播放一个音频文件。呵呵,如果播放一个无声音的音频文件呢?!步骤:1.在plish文件中加入背景播放的支持。加入项:Required background modes。并设置为:audio2.初始化一个AVAudioPlayer音频,并且无限制的播放下去。- (void)viewDidLoad superviewDidLoad; dispatch_queue_tdispatchQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);dispatch_async(dispatchQueue, (void) NSError*audioSessionError =nil;AVAudioSession*audioSession = AVAudioSessionsharedInstance;if(audioSessionsetCategory:AVAudioSessionCategoryPlaybackerror:&audioSessionError) NSLog(Successfully set the audio session.);else NSLog(Could not set the audio session);NSBundle*mainBundle = NSBundlemainBundle;NSString*filePath = mainBundlepathForResource:mySongofType:mp3;NSData*fileData = NSDatadataWithContentsOfFile:filePath;NSError*error =nil;self.audioPlayer= AVAudioPlayerallocinitWithData:fileDatae
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 产褥期产妇护理测试题库及答案
- 整体护理护师考试题库及答案
- 单调分类考试题及答案
- 赏景心情一次户外写生经历9篇
- 业务订单管理自动化系统基础架构模板
- 阅读中的深度思考与推理能力训练:高中阅读课教学教案
- 行政后勤费用合理化建议模板
- 合规数据资源承诺书4篇
- 商业保温材料供货协议
- 企业组织架构及职责权限明晰工具
- 无痛人流患者护理查房
- DDI:制造业人才发展成功实践手册
- 老年照护芳香疗法应用规范
- 2025年抗菌药物授权培训
- 风力发电征地协调方案(3篇)
- 2025至2030年中国汽车制动器行业市场分析研究及发展战略研判报告
- 2025至2030中国淀粉粘合剂行业现状调查与前景竞争对手分析报告
- 黑龙江:装配式混凝土矩形渠道应用技术规范(DB23-T 2334-2019)
- JG/T 127-2017建筑门窗五金件滑撑
- T/CGCC 7-2017焙烤食品用糖浆
- 江苏省2025年中职职教高考文化统考数学试题答案
评论
0/150
提交评论