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 文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后 ...
随机推荐
- 访问外网 ML2 的配置 - 每天5分钟玩转 OpenStack(103)
通过 router 可以实现位于不同 vlan 中的 instance 之间的通信. 接下来要探讨的问题是 instance 如何与外部网络通信. 这里的外部网络是指的租户网络以外的网络. 租户网络是 ...
- QuickContactBadge去掉三角
我们首先来分析一下QuickContactBadge源码 在QuickContactBadge构造函数中会给mOverlay赋值 private Drawable mOverlay; public Q ...
- Anliven - 基础知识梳理汇总 - 软件测试
基础知识梳理 - 软件测试 - 概念 基础知识梳理 - 软件测试 - 分类 基础知识梳理 - 软件测试 - 流程 基础知识梳理 - 软件测试 - 用例 基础知识梳理 - 软件测试 - 方法 基础知识梳 ...
- 【面试】输出"蛇形"矩阵
一.题目描述 腾讯实习在线笔试的一道题目. 根据输入的数字(< 1000),输出这样的"蛇形"矩阵,如下.输入n,输出(n * n)阶矩阵,满足由外到内依次增大. 如: 输入 ...
- CoCreateInstance调用返回代码0x80040154的一种解决方法
引言 前面的一篇博文中总结了开发Windows Thumbnail Handler的一些经验.在公司实际项目中,需要同时针对图片和视频实现缩略图.同时还要在图片和视频文件的顶部加上LOGO.像如下这样 ...
- QT5.1 调用https
以VS开发为例.因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com ...
- asp.net开发的一些问题
关于Ajax说法错误的是( ).(选择一项) MVC是一种流行的软件设计模式,它把系统分为三个模块.三个模块为( ). 在ASP.NET中,关于WebService的说法正确的是( ) .NET中Ob ...
- SignalR入门之Hub
在持久性连接的基础上,SignalR提供了一个更高层次的抽象层:Hub,基于javascript的灵活性和C#的动态特性,Hub是一个至关重要的开发模式,它消弭了客户端和服务端这两个独立的物理环境之间 ...
- php语言实现的7种基本的排序方法
今天总结了一下常用的7种排序方法,并用php语言实现. 直接插入排序 /* * 直接插入排序,插入排序的思想是:当前插入位置之前的元素有序, * 若插入当前位置的元素比有序元素最后一个元素大,则什么也 ...
- C++构造函数中不能调用虚函数
在构造函数中调用虚函数,并不会产生多态的效果,就跟普通函数一样. c++ primer 第四版中497页15.4.5构造函数和析构中的虚函数讲到,如果在构造函数或析构函数中调用虚函数,则运行的是为构造 ...