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) {
    }
}

Swift - 让程序挂起后,能在后台继续运行任务的更多相关文章

  1. 【iOS】swift 让程序挂起后,能在后台继续运行任务

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

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

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

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

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

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

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

  5. ubuntu 16.04 挂起后WiFi链接不上

    在笔记本上安装ubuntu 16.04后,使用挂起系统功能后发现WIFI链接不上去,然后使用以下指令多WIFI服务进行重启,发觉可以了. sudo service network-manager re ...

  6. vmware虚拟机挂起后无法再恢复(转)

    之前一直使用vmware调试程序,但有一天它被挂起后,就一直无法恢复. 提示: 无法获取该配置文件上的排他锁 另一个VMware进程可能正在使用此配置文件. 后来在google里查了一下,发现其实是一 ...

  7. 正尝试在 OS 载入程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起。

    出错提示: 正尝试在 OS 载入程序锁内执行托管代码. 不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中添加了42种非常强大的调试助 ...

  8. AppDelegate关于应用程序挂起、复原与终止的代理方法

    AppDelegate关于应用程序挂起.复原与终止的代理方法: 首次运行: - (BOOL)application:(UIApplication *)application didFinishLaun ...

  9. 在AE二次开发中出“正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”异常解决方案

    今天的一个项目总用到了AE的开发组件,也就是ESRI公司提供的一系列的开发包(组件)都是以dll(动态链接库的形式)然后今天在调试的时候却出现了“正试图在 OS 加载程序锁内执行托管代码.不要尝试在 ...

随机推荐

  1. HDU 5384 字典树、AC自动机

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 #include<stdio.h> #includ ...

  2. Java设计模式 之 命令模式

    1      从属模式分类 行为性模式 2      命令模式意图 命令模式可将动作的请求者和动作的执行者对象中解耦. 该模式将一个行为操作发起者的请求封装到对象中,该请求由另外一个对象执行. 将动作 ...

  3. BZOJ 2654: tree

    Description \(n\) 个点, \(m\) 条边,边有权值和黑/白色,求含有 \(need\) 个白边的生成树. Sol 二分+Kruskal. 将每条白边都加上一个权值,然后跑最小生成树 ...

  4. BZOJ 2438: [中山市选2011]杀人游戏

    Description 给你一个有向图,求至少询问多少次能够得到全部点的信息. Sol Tarjan + 强连通分量缩点 + 判断. 先缩点,如果我们知道了强连通分量里的任意一个点,我们就可以知道这些 ...

  5. 32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络

    32 GroupSock(AddressPortLookupTable)——live555源码阅读(四)网络 32 GroupSock(AddressPortLookupTable)——live555 ...

  6. 1.4---字符串空格变成20%(CC150)

    import CtCILibrary.AssortedMethods; public class Question { // Assume string has sufficient free spa ...

  7. linux中用shell获取昨天、明天或多天前的日期

    linux中用shell获取昨天.明天或多天前的日期 时间 -- :: BlogJava-专家区 原文 http://www.blogjava.net/xzclog/archive/2015/12/0 ...

  8. stty命令使用

    stty [ -a ] [ -g ] [ Options ]   stty(set tty)命令用于显示和修改当前注册的终端的属性. UNIX系统为键盘的输入和终端的输出提供了重要的控制手段,可以通过 ...

  9. Git SourceTree 冲突解决方案

    Git现在越来越火,很多人都从Svn迁移到Git上面,Git让我们更加与世界接轨,不再是"局域网"的程序猿,特别是掌握了Git之后,会发现它真的很好用,本文对Git中比较烦人的冲突 ...

  10. POJ 2121

    http://poj.org/problem?id=2121 一道字符串的转换的题目. 题意:就是把那个英文数字翻译成中文. 思路:首先打表,然后把每一个单独的单词分离出来,在组合相加相乘. #inc ...