*  参考: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. call,apply,bind

    一.call&apply call, apply都属于Function.prototype的方法,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法 ...

  2. Rust初步(五):Rust与C#性能比较

    我学习Rust的目的并不是说期望用它来取代掉现有的开发平台或语言.相反,我认为当前绝大部分研发团队,都不可能只用一个平台或者一个语言. 当组织增长,他们越来越依赖大量的编程语言.不同的编程语言有不同的 ...

  3. OracleDBA之数据库管理

    以下这些东西是我的麦库上存的当时学Oracle的学习笔记今天拿出来和大家分享一下,转载请注明出处,下面用的Oracle的版本是10g,用的时WinServer2003的操作系统,可能有些命令和Orac ...

  4. golang获取程序运行路径

    golang获取程序运行路径: /* 获取程序运行路径 */ func getCurrentDirectory() string { dir, err := filepath.Abs(filepath ...

  5. mysql default unix_timestamp(now())

    按照mssql的创建方式,去创建mysql的默认值时间戳是不能被允许的,例如下面代码: CREATE TABLE USERINFO( CREATETIME INT NOT NULL DEFAULT U ...

  6. PC网站CSS分享

    这里想总结些编写网页的经验,以PC端的为主,前面总结过后台的,今天写些前台的,参考了bootstrap3.3.5.bootstrip2.3.2和模版matrix. 前段时间还写过一篇<前端基础学 ...

  7. Handle类与线程

    首先声明Handle对象和该类的handleMessage方法: Handler BarHandler = new Handler(){ @Override public void handleMes ...

  8. 自己动手丰衣足食之轮播图一动态修改marginTop属性实现轮播图

    引言 学习jQuery有年头了,刚开始学习时自己动手写过轮播图,放的久了以至于忘了大致思路了.现在转而做前端,抽空把jquery轮播图拿出来写一写,把各种思路都自己练习练习,这里主要使用动态修改mar ...

  9. Android监听系统短信数据库变化-提取短信内容

    由于监听系统短信广播受到权限的限制,所以很多手机可能使用这种方式没法监听广播,从而没办法获取到系统短信,所以又重新开辟一条路. Android监听系统短信数据库内容变化使用场景: 1.监听短信数据库的 ...

  10. TCP的定时器

    TCP的定时器 在TCP协议中有的时候需要定期或者按照某个算法对某个事件进行触发,那么这个时候,TCP协议是使用定时器进行实现的.在TCP中,会有四种定时器: 重传定时器 坚持定时器 保活定时器 2M ...