1,程序的挂起和退出

由于iOS设备资源有限。当用户点击了home键,或者另一个应用程序启动了。那么原先那个程序便进入后台被挂起,不是退出,只是停止执行代码,同时它的内存被锁定。当应用程序恢复时,它会从停止的位置重新开始。

2,如下特殊的应用程序可以在后台长时间的运行
(1)在后台播放音频的应用程序可以在任意长的时间内保持活动状态,直到用户开始从另一个App播放音乐为止。
(2)在后台跟踪用户位置的应用程序可以运行任意长的时间。
(3)诸如Skype之类的网络协议电话(VoIP)应用程序可以定期运行,以向服务器签到,但除非正在进行通话,否则不允许不加限制地运行。

3,申请程序在后台短时运行
(1)除了上述的特殊应用,App进入后台时便自动挂起。但我们可以申请该应用在后台能短时间运行。但这个时长不能超过10分钟。
(2)后台短时运行的存在是为了让应用程序能够完成一个需要长时间运行的过程。比如将大型文件写会磁盘,完成下载,或者像即时通讯软件给对方发照片(选择发送后,即使进入后台,也能继续发送)。
(3)在10分钟结束时,应用程序必须告诉OS,它已经完成或者被终止。
(4)注意:并不能保证用于后台任务的额外时间是连续的,这些时间可能会被分为很多段,以延长电池寿命。

4,通过样例演示如何在后台运行任务
主页面上通过定时器不断的打印出数字。还有个开关按钮,切换选择程序进入后台后是否继续运行。
开关开启时,按home键退出应用,过一会儿再回来,可以发现数字在后台还会一直打印数字。开关关闭,程序进入后台即挂起,不会再打印数字。
(这个需要使用真机测试,模拟器比较特殊,不管什么情况程序进入后台都会一直运行)
    
--- ViewController.swift ---
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import UIKit
 
class ViewControllerUIViewController {
     
    @IBOutlet weak var textView: UITextView!
     
    @IBOutlet weak var mySwitch: UISwitch!
     
    var i=0
     
    override func viewDidLoad()
{
        super.viewDidLoad()
         
        //创建定时任务
        _ = NSTimer.scheduledTimerWithTimeInterval(1,
            target:self,selector:Selector("tickDown"),
            userInfo:nil,repeats:true)
    }
     
    //计时器每秒触发事件
    func tickDown()
{
        textView.text! += "\(i++)
"
    }
    
    override func didReceiveMemoryWarning()
{
        super.didReceiveMemoryWarning()
    }
}
--- AppDelegate.swift ---
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import UIKit
 
@UIApplicationMain
class AppDelegateUIResponderUIApplicationDelegate {
 
    var window: UIWindow?
     
    //后台任务
    var backgroundTask:UIBackgroundTaskIdentifier!
nil
 
 
    func application(application: UIApplication,
        didFinishLaunchingWithOptions
launchOptions: [
NSObjectAnyObject]?)
-> 
Bool {
        return true
    }
 
    func applicationWillResignActive(application: UIApplication)
{
    }
 
    func applicationDidEnterBackground(application: UIApplication)
{
        let controller:ViewController self.window?.rootViewController asViewController
        controller.textView.text! += "进入后台
"
         
        //如果已存在后台任务,先将其设为完成
        if self.backgroundTask
!= 
nil {
            application.endBackgroundTask(self.backgroundTask)
            self.backgroundTask
UIBackgroundTaskInvalid
        }
         
        //如果要后台运行
        if controller.mySwitch.on
{
            //注册后台任务
            self.backgroundTask
application.beginBackgroundTaskWithExpirationHandler({
                () -> Void in
                //如果没有调用endBackgroundTask,时间耗尽时应用程序将被终止
                application.endBackgroundTask(self.backgroundTask)
                self.backgroundTask
UIBackgroundTaskInvalid
            })
        }
    }
 
    func applicationWillEnterForeground(application: UIApplication)
{
    }
 
    func applicationDidBecomeActive(application: UIApplication)
{
    }
 
    func applicationWillTerminate(application: UIApplication)
{
    }
}


【iOS】swift 让程序挂起后,能在后台继续运行任务的更多相关文章

  1. Swift - 让程序挂起后,能在后台继续运行任务

    1,程序的挂起和退出 由于iOS设备资源有限.当用户点击了home键,或者另一个应用程序启动了.那么原先那个程序便进入后台被挂起,不是退出,只是停止执行代码,同时它的内存被锁定.当应用程序恢复时,它会 ...

  2. (IOS)Swift Music 程序分析

    本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源App Swift Music的研究心得. 项目地址:https://github.com/xujiyao123/SwiftMu ...

  3. 应用程序挂起、复原与终止— IOS开发

    本文转载至 http://justcoding.iteye.com/blog/1473350 一.挂起 当有电话进来或者锁屏,这时你的应用程会挂起,在这时,UIApplicationDelegate委 ...

  4. 详解 IOS 7.1 程序启动原理

    程序都是从Main方法入口的 IOS 也不例外 int main(int argc,char * argv[]) { @autoreleasepool { return UIApplicationMa ...

  5. Cordova or Xamarin 用.net开发IOS和Android程序

    Visual Studio 2015 和 Apache Cordova 在开始前,问一下自己下面这些问题: 熟练掌握web技术的开发者比例是多少?(占所有开发者的比例) 熟练掌握移动开发技术(并且使用 ...

  6. iOS - Swift available 平台判断

    前言 Swift 语言中的 @available 和 #available,Swift 2.0 中,引入了可用性的概念.对于函数,类,协议等,可以使用 @available 声明这些类型的生命周期依赖 ...

  7. Robotium调用getActivity()导致程序挂起的方法

    1. 问题背景的叙述性说明 需要直接用在工作中没有项目的源代码robotium测试目标android平台launcher,该平台的基础上,当前日期的版本号android 4.4.2.之前我用来验证的可 ...

  8. 解决Windows 8.1 应用商店中安装程序挂起的解决

    阅读目录: 在Windows 8.1系统的应用程序商店中安装程序时,总是提醒“挂起”状态.无法进行后续安装,看了下国内不少用户有这个困扰,特此总结自己的解决方案. 1. 确保Windows updat ...

  9. iOS swift项目IM实现,从长连接到数据流解析分析之Socket

    iOS  swift项目IM实现,从长连接到底层数据解析分析之Socket 一:项目简介:  去年开始接手了一个国企移动项目,项目的需求是实现IM即时通讯功能. * 一期版本功能包括了:       ...

随机推荐

  1. css导航条等元素位置不变

    在容器元素中插入 position: fixed; 如果是在微信小程序中,直接用bottom或者top等就可以简单的设置导航条了.

  2. C# Redis实战(七)

    七.修改数据 在上一篇 C# Redis实战(六)中介绍了如何查询Redis中数据,本篇将介绍如何修改Redis中相关数据.大家都知道Redis是key-value型存储系统,所以应该可以修改key, ...

  3. 安装paramiko

    前记: 各种奇葩事情都让我遇上了... 1.准备: 1>需要安装python 2>需要安装PyCrypto 2.安装python---省略 3.安装PyCrypto 1>检查pyth ...

  4. Ext概述

    Ext是一个具有丰富组件的javascript集合类库,除了自身提供的一套选择器.效果.ajax等功能,还提供了大量的javascript创建页面元素的类.方法.这个意味着:只要客户端支持javasc ...

  5. parted分区和挂载及非交互式操作

    author : headsen  chen date : 2017-11-17  09:45:36 个人原创,转载请注明作者,出处,否则依法追究法律责任 1,将磁盘上原有的分区删除掉: 进入:#pa ...

  6. git下载Ardupilot源码

    pwd #确定当前目录 mkdir Copter-3.5.4 #如有需要,新建目录 cd Copter-3.5.4 #进入新目录文件 #克隆指定分支,并且克隆分支对应的git子模块 git clone ...

  7. 第三方工具 - echarts中 设置x||y轴文案、提示文字等为固定字数,超出显示"..."

    起初看到这种需求的时候,我是这个状态 对,我是拒绝的,人家echats画出来就是一个canvas,你让我怎么加... 但是,作为一个"有点追求的"前端,我得想招试试总结下来,唯一的 ...

  8. Navicat通过跳板机连接数据库

    完成对应设置后,即可连接数据库,本人亲测!

  9. Win32 API之绘图函数

    AbortPath 抛弃选入指定设备场景中的所有路径.也取消目前正在进行的任何路径的创建工作 AngleArc 用一个连接弧画一条线 Arc 画一个圆弧 BeginPath 启动一个路径分支 Canc ...

  10. ASP.NET MVC编程——模型

    1 ViewModel 是一种专门提供给View使用的模型,使用ViewModel的理由是实体或领域模型所包含的属性比View使用的多或少,这种情况下实体或领域模型不适合View使用. 2模型绑定 默 ...