*  参考: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. 访问外网 ML2 的配置 - 每天5分钟玩转 OpenStack(103)

    通过 router 可以实现位于不同 vlan 中的 instance 之间的通信. 接下来要探讨的问题是 instance 如何与外部网络通信. 这里的外部网络是指的租户网络以外的网络. 租户网络是 ...

  2. QuickContactBadge去掉三角

    我们首先来分析一下QuickContactBadge源码 在QuickContactBadge构造函数中会给mOverlay赋值 private Drawable mOverlay; public Q ...

  3. Anliven - 基础知识梳理汇总 - 软件测试

    基础知识梳理 - 软件测试 - 概念 基础知识梳理 - 软件测试 - 分类 基础知识梳理 - 软件测试 - 流程 基础知识梳理 - 软件测试 - 用例 基础知识梳理 - 软件测试 - 方法 基础知识梳 ...

  4. 【面试】输出"蛇形"矩阵

    一.题目描述 腾讯实习在线笔试的一道题目. 根据输入的数字(< 1000),输出这样的"蛇形"矩阵,如下.输入n,输出(n * n)阶矩阵,满足由外到内依次增大. 如: 输入 ...

  5. CoCreateInstance调用返回代码0x80040154的一种解决方法

    引言 前面的一篇博文中总结了开发Windows Thumbnail Handler的一些经验.在公司实际项目中,需要同时针对图片和视频实现缩略图.同时还要在图片和视频文件的顶部加上LOGO.像如下这样 ...

  6. QT5.1 调用https

    以VS开发为例.因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com ...

  7. asp.net开发的一些问题

    关于Ajax说法错误的是( ).(选择一项) MVC是一种流行的软件设计模式,它把系统分为三个模块.三个模块为( ). 在ASP.NET中,关于WebService的说法正确的是( ) .NET中Ob ...

  8. SignalR入门之Hub

    在持久性连接的基础上,SignalR提供了一个更高层次的抽象层:Hub,基于javascript的灵活性和C#的动态特性,Hub是一个至关重要的开发模式,它消弭了客户端和服务端这两个独立的物理环境之间 ...

  9. php语言实现的7种基本的排序方法

    今天总结了一下常用的7种排序方法,并用php语言实现. 直接插入排序 /* * 直接插入排序,插入排序的思想是:当前插入位置之前的元素有序, * 若插入当前位置的元素比有序元素最后一个元素大,则什么也 ...

  10. C++构造函数中不能调用虚函数

    在构造函数中调用虚函数,并不会产生多态的效果,就跟普通函数一样. c++ primer 第四版中497页15.4.5构造函数和析构中的虚函数讲到,如果在构造函数或析构函数中调用虚函数,则运行的是为构造 ...