*  参考: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长时间后台运行的更多相关文章

  1. Android长时间后台运行Service

         项目需要在后台获取GPS经纬度.当用户对手机有一段时间没有操作后,屏幕(Screen)将从高亮(Bright)变为暗淡(Dim),如果再过段时间没操作, 屏幕(Screen)将又由暗淡(Di ...

  2. 实现iOS长时间后台的两种方法:Audiosession和VOIP(转)

    分类: Iphone2013-01-24 14:03 986人阅读 评论(0) 收藏 举报 我们知道iOS开启后台任务后可以获得最多600秒的执行时间,而一些需要在后台下载或者与服务器保持连接的App ...

  3. 实现iOS长时间后台的两种方法:Audiosession和VOIP

    http://www.cocoachina.com/applenews/devnews/2012/1212/5313.html 我们知道iOS开启后台任务后可以获得最多600秒的执行时间,而一些需要在 ...

  4. 判断App是否在后台运行

    在一些场景中,经常会需要判断App是否在后台运行,比如是否显示解锁界面,收到新消息是否显示Notification等.需求可能是多样化的,但所依仗的原理是相通的,今天Stay打算说说这些需求的最优解. ...

  5. ios之申请后台延时执行和做一个假后台的方法(系统进入长时间后台后,再进入前台部分功能不能实现)

    转自:http://sis hu ok.com/forum/blogCategory/showByCategory.html?categories_id=138&user_id=10385   ...

  6. APP长时间处于后台,再次调用时提示用户重新登录

    第一步:当应用被处于后台时,调用计时器的start()方法,开始计时 在所有Activity继承的BaseSwiBackAct中的 public void onStop() { EventBus.ge ...

  7. Android实现app长时间未操作时自动退出app

    这里要考虑3个问题,第一个是锁屏问题,第二个是app被切换至后台的问题,第三个是屏幕锁定和解除时app在后台时的问题 一,监听屏幕解锁,锁定 ? 1 2 3 4 5 6 7 8 9 10 11 12 ...

  8. Android 判断APP前台,后台运行

    public void checkAppState() { ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVI ...

  9. iOS后台运行

    http://www.cocoachina.com/bbs/read.php?tid=149564 文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后 ...

随机推荐

  1. php面向对象基础

    1.类 由众多对象抽象出来的 它包含了对象通用的特性 2.对象 一切皆对象 它是由实例化出来的 例: 求两个圆之间阴影的面积 <!DOCTYPE html PUBLIC "-//W3C ...

  2. Chrome开发工具之Console

    Chrome开发工具-Console 看了别人的博客,才发现在百度主页用开发工具“Console”可以看到百度的招聘信息 前端调试工具可以按F12打开,谷歌的开发工具中的Console面板可以查看错误 ...

  3. Pointer is missing a nullability type specifier (__nonnull or __nullable)

    我们都知道在swift中,可以使用!和?来表示一个对象是optional的还是non-optional,如view?和view!.而在Objective-C中则没有这一区分,view即可表示这个对象是 ...

  4. 符合我公司GIS开源解决方案的探讨

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 这一周,我对GIS开源解决方案中涉及到的开源软件以及相关技术 ...

  5. ASP.NET CMS模板培训教程

    注意:此文档中出现所有的类,都是公司内部的,也就是说,只是给公司内部人员培训的一篇文章而已,如果其他的人看到了, 看不懂里面的类,那是因为这都是我公司内部的框架. 首先是进入我们的系统的后台,然后选择 ...

  6. jQuery-1.9.1源码分析系列(十) 事件系统——主动触发事件和模拟冒泡处理

    发现一个小点,先前没有注意的 stopPropagation: function() { var e = this.originalEvent; ... if ( e.stopPropagation ...

  7. 关于dijkstra算法的一点理解

    最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...

  8. [转载]C/C++框架和库

    C/C++框架和库 装载自:http://blog.csdn.net/xiaoxiaoyeyaya/article/details/42541419 值得学习的C语言开源项目 Webbench Web ...

  9. HTML5填充颜色的fillStyle测试

    效果:http://hovertree.com/texiao/html5/canvas/1/ 代码: <html> <head> <meta http-equiv=&qu ...

  10. C#如何静态调用C++中的方法(静态调用dll)

    当我们想要在C#中使用C++项目的方法时,这个时候就可以通过调用C++项目的dll来实现,它有静态和动态调用两种方法. DLL(Dynamic Link Library)文件为动态链接库文件,又称“应 ...