APP长时间后台运行
* 参考:http://www.nivalxer.com/archives/187
首先,我要说明的是在iOS中,一般应用程序在后台挂起之后仅拥有3分钟时间来处理相应的未完成事件,但是3分钟之后就会被系统直接杀死;我们这时还可以再次向后台申请10分钟来处理需要处理的未完成事件,但是10分钟之后就再也不能请求道额外的时间来做事情了,然而有时候为了满足功能的需要,我们需要始终的让程序在后台运行,这时候就想到了iOS中的几种特殊的功能:1. voip技术:对于这种技术我也仅仅是知道而已,而且根据查阅的资料觉得这种方法比较麻烦;2.后台始终(循环)播放无声音乐: 这种方法可以使用,但是要注意在上架过程中可能会因为这个原因被拒;3.后台定位:这种技术被运用的较多,特别是一些正好需要定位来支持相应功能的APP(上架时要注意标明)。
下面就是当你使用定位来保持程序后台始终运行的相应代码:
1.因为iOS 9 的特殊性,所以我们先定义一个判断方法以及声明相应的属性


2.下面我就贴出具体的代码了,这些代码是参考别人的,我会在下面解释代码的具体含义,同时给出优化方案,优化后的代码并没有单独写成Demo,所以就不具体的说明了,但是我会把这里的代码给出说明:






好了,这些就是全部的代码,当然如果你什么都不改变,只把你的判断加进去,只求达到目的的整体移植过去也是可以达到目的的,但是个人觉得总重要的还是能够知道每一句代码是干什么的,这样如果后续需求改变或者需要添加改变什么功能,也就能很快找到入口了。不多说了。接下来就来分析一下这部分代码的具体含义吧。
********注意:如果你的项目中本身就需要定位,那么建议不要使用上述代码,直接在appdelegate.m文件中启动定位就可,否则做个太多的无用功。而且上述代码的整体意义就是为了唤醒程序的,并没有其他的特殊意义*************
总的来说,代码是通过3个(个人感觉)死循环来实现的程序唤醒激活,从而保证应用程序不被后台杀死。
首先,我们初始化状态值,(关于iOS判断和相应属性的设置必不可少,否则程序依然会被杀死)紧跟着APP启动后我们会调用-[self monitorBatteryStateInBackground]方法,在这个方法中改变状态,同时调用-
[self startBackgroundTask];方法来开启后台任务,接下来程序进入- (void)applicationDidBecomeActive:(UIApplication *)application方法,并且在这个方法中我们改变状态的BOOL值,此时 _jobExpired BOOL NO false _background BOOL NO false,=======》》
程序这个时候已经在前台运行完毕,而此时其[self startBackgroundTask]依然在运行着。。。我们可以发现此时并没有什么用。
接下来,我们点击Home键,退出前台,进入后台运行,此时调用方法- (void)applicationDidEnterBackground:(UIApplication *)application,这时:_jobExpired BOOL NO false _background BOOL NO false 然后我们看到其调用了最初写的那个回调方法,并且进入后台,再次调用[self monitorBatteryStateInBackground]--------》_jobExpired BOOL NO false _background BOOL YES true
在这里面改变状态值,调用[self startBackgroundTask]方法,此时才可以说进入后台任务,在后台任务中,我们发现那些什么标志位啊,神马的貌似都没有什么用,真正有用的也就是 位置更新 一个计数器的循环工作,以及下面的那个后台时间逐次递减等等。。。。然后切记关注最后依然有一次状态值的改变,在这里的改变是来控制上面的回调方法是否可以进入的判断条件。
总的来说,他就是依赖于BOOL值改变,进入回调循环--计数器循环定位---后台剩余时间循环,来使程序始终运行,不被杀死的。
从上面的分析我们可以看到,对于仅仅达到始终运行的目的来说,很多冗余代码(仅仅对于我们没用,原创肯定有别的用法),而且在一些循环改变BOOL值得过程中,我们可以看到,其实他调用[self monitorBatteryStateInBackground]方法,可以说是多余的,我们完全可以删除这个方法,在需要的时候单独的改变或者开启后台任务,其它的一些不做具体的修改说明。 起初当我需要达到这个目的时,我也是完全套用了原创的做法,然后在逐渐的修改,减少无用代码,最后需求改变。。。要获取物流状态以及实时定位功能,这个正好让我可以达到目的,我就在最初的时候直接开启了定位。。。。当然耗电是肯定的。。内存感觉还可以。。
以上仅仅是我个人的看法以及对代码的理解,可能有很多不到位和错误的地方,希望各位大神给予意见以及修改的方向,让我能够深入的学习研究,多谢!!!!
APP长时间后台运行的更多相关文章
- Android长时间后台运行Service
项目需要在后台获取GPS经纬度.当用户对手机有一段时间没有操作后,屏幕(Screen)将从高亮(Bright)变为暗淡(Dim),如果再过段时间没操作, 屏幕(Screen)将又由暗淡(Di ...
- 实现iOS长时间后台的两种方法:Audiosession和VOIP(转)
分类: Iphone2013-01-24 14:03 986人阅读 评论(0) 收藏 举报 我们知道iOS开启后台任务后可以获得最多600秒的执行时间,而一些需要在后台下载或者与服务器保持连接的App ...
- 实现iOS长时间后台的两种方法:Audiosession和VOIP
http://www.cocoachina.com/applenews/devnews/2012/1212/5313.html 我们知道iOS开启后台任务后可以获得最多600秒的执行时间,而一些需要在 ...
- 判断App是否在后台运行
在一些场景中,经常会需要判断App是否在后台运行,比如是否显示解锁界面,收到新消息是否显示Notification等.需求可能是多样化的,但所依仗的原理是相通的,今天Stay打算说说这些需求的最优解. ...
- ios之申请后台延时执行和做一个假后台的方法(系统进入长时间后台后,再进入前台部分功能不能实现)
转自:http://sis hu ok.com/forum/blogCategory/showByCategory.html?categories_id=138&user_id=10385 ...
- APP长时间处于后台,再次调用时提示用户重新登录
第一步:当应用被处于后台时,调用计时器的start()方法,开始计时 在所有Activity继承的BaseSwiBackAct中的 public void onStop() { EventBus.ge ...
- Android实现app长时间未操作时自动退出app
这里要考虑3个问题,第一个是锁屏问题,第二个是app被切换至后台的问题,第三个是屏幕锁定和解除时app在后台时的问题 一,监听屏幕解锁,锁定 ? 1 2 3 4 5 6 7 8 9 10 11 12 ...
- Android 判断APP前台,后台运行
public void checkAppState() { ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVI ...
- iOS后台运行
http://www.cocoachina.com/bbs/read.php?tid=149564 文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后 ...
随机推荐
- Huffman树进行编码和译码
//编码#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...
- ES6 - Note1:块级作用域与常量
在ES6以前,ES不支持块级作用域,只有全局作用域和函数作用域,所有变量的声明都存在变量声明提升. 1.let 关键字 声明一个块级变量,只在一个代码块中有效,如果在块外面访问便会报错,如下所示: { ...
- 一款开源免费跨浏览器的视频播放器--videojs使用介绍
最近项目中的视频功能,需要做到浏览器全兼容,所以之前用html5实现的视频功能就需要进行改造了.在网上翻了个遍,试来试去,在所有的视频播放器中,就数它最实际了.首先我们来看看它的优点: 1.它是开源免 ...
- 利用private font改变PDF文件的字体
利用private font改变PDF文件的字体 前几天做项目,需要使用未安装的字体来改变PDF的文件.以前并没有实现过类似的功能,幸运的是我在网上找到了类似的教程,并成功实现了这个功能. 下面就跟大 ...
- iOS UIWebView 拦截点击事件(双击缩放)
在平时的开发中,要使用到webview,但类似微信的webview在数据没有加载完成的时候 双击屏幕,webview不会缩放,其实实现这个功能很简单 代码是用swift写的 class YYSimpl ...
- 如何获取byte的各个bit值以及常见位操作
项目中通过信号采集板的数据获取车上仪表盘指示灯的信息,将接收到的数据转成byte后,还要将每一个Byte的各个Bit值分离出来,这样才知道每个bit的值代表的具体信息.这里记录下如何获取byte的各个 ...
- “英雄之旅”见闻和小结----angular2系列(三)
前言: 本系列在前面两篇文章,介绍了Zone.js和angular2的基础概念.而后对于ng2的学习,还是由官方的 Tour of Heroes 开始. 以下内容经过提炼和个人理解,当然也会有不正确的 ...
- 跨域post请求实现方案小结--转
[名词解释] 跨域:https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript 同源策略 ...
- Robot Framework自动化测试 ---视频与教程免费分享
当我第一次使用Robot Framework时,我是拒绝的.我跟老大说,我拒绝其实对于习惯了代码的自由,所以讨厌这种“填表格”式的脚本.老大说,Robot Framework使用简单,类库丰富,还可以 ...
- 【Android】[转] Android屏幕旋转使用OrientationEventListener的监听
说明 遇到一个奇葩的问题,我在使用onConfigChanged拦截屏幕的横竖屏旋转时,发现直接进行180度的横屏/竖屏转换居然没有反应!查找原因发现仅对landscape或者portrait状态有用 ...