应用如何在后台执行

转:http://izhuaodev.blog.51cto.com/6266344/1108483

当一个iOS 应用被送到后台,它的主线程会被暂停。你用NSThread的detachNewThreadSelector:toTarget:withObject:类方法创建的线程也被挂起了。如果你想在后台完成一个长期任务,就必须调用UIApplication
的beginBackgroundTaskWithExpirationHandler:实例方法,来向iOS 借点时间。UIApplication的
backgroundTimeRemaining属性包含了程序完成他的任务可以使用的秒数。如果在这个期限内,长期任务没有被完成,iOS 将终止程序。每个对beginBackgroundTaskWithExpirationHandler:方法的调用,必须要相应的调用endBackgroundTask:方法(UIApplication的另一个实例方法)。也就是说,如果你向iOS 要更多时间来完成一个任务,你必须告诉iOS 你什么时候能完成那个任务,那时,你的程序将和其所有被暂停的线程被放入后台。 
 
          当你的程序在前台时,UIApplication的backgroundTimeRemaining属性等于DBL_MAX常量,这是double类型可表示的最大值(和这个值相当的integer 通常等于-1)。在iOS 被要求在程序被完全挂起之前给于更多的执行时间,这个属性指明了在完成任务前程序拥有多少秒。 
 
         在程序中你可以多次调用beginBackgroundTaskWithExpirationHandler:方法。要记住的重点是,当iOS 为你的程序返回一个token 或者任务标识(task  identifier)时,你都必须调用endBackgroundTask:方法,在运行的任
务结束时,用来标志任务结束。如果你不这么做的话,iOS 会终止你的程序。 
 
        在后台时,程序不应该执行完全的功能,也不应该处理大量数据。事实上,他们只应该完成一个长期任务。 
 
比如,一个程序正在调用一个web  service  API,并且还没有从服务器上的那个API接收到响应。在此期
间,如果程序被送入后台,它可以请求更多的时间,直到它从服务器收到响应。一旦响应被接收,程序必须保存其状态,并调用UIApplication的endBackgroundTask:实例方法将任务标记为完成。

下面我们看看代码实现的步骤:

1、定义一个任务标识

  1. @property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backtaskIdentifier;

2、当ios app 进入后台时,会自动调用appdelegate的

- (void)applicationDidEnterBackground:(UIApplication *)application   方法,在这里我们编写要执行的任务

  1. - (void)applicationDidEnterBackground:(UIApplication *)application
  2. {
  3. //检测多任务的可用性
  4. if ([self isMultitaskingSupported] == NO) {
  5. return;
  6. }
  7. //定义要完成的任务 ,开始执行,
  8. ......
  9. //返回一个任务标识
  10. self.backtaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^(void){
  11. // do something 。。。
  12. //结束该任务
  13. [[UIApplication sharedApplication] endBackgroundTask:self.backtaskIdentifier];
    //将任务标识符标记为 UIBackgroundTasksInvalid,标志任务结束
  14. self.backtaskIdentifier = UIBackgroundTaskInvalid;
  15. }];
  16. }

如上代码所示,我们在使用多任务的前提,一定是我们的系统支持多任务,可见检测任务的可用性是一项必不可少的步骤:

  1. - (BOOL) isMultitaskingSupported{
  2. BOOL result;
  3. if ([[UIDevice currentDevice]respondsToSelector:@selector(isMultitaskingSupported)]) {
  4. result = [[UIDevice currentDevice] isMultitaskingSupported];
  5. }
  6. return result;
  7. }

我们调用 beginBackgroundTaskWithExpirationHandler: (UIApplication的一个实例方法) 方法,为app 返回了一个token 或任务标识,那么我们必须调用   endBackgroundTask:  (UIApplication的另一个实例方法)方法来结束该任务.

在后台任务的 完成处理者 (即beginBackgroundTaskWithExpirationHandler: 的块函数,)中,我们结束了任务,并进行必要的清理工作。

3、当我们的app回到前台的时候会调用- (void)applicationWillEnterForeground:(UIApplication *)application  方法,此时如果后台任务还在进行中我们就要结束他。

时间: 2024-08-09 20:54:34

应用如何在后台执行的相关文章

如何让程序在后台执行

示例:查看系统负载的脚本 #!/bin/sh while true do uptime >/tmp/uptime.log sleep 1 done [[email protected] scripts]# tail -f /tmp/uptime.log 21:37:26 up 5:49, 2 users, load average: 0.00, 0.00, 0.00 tail: /tmp/uptime.log: file truncated 21:37:27 up 5:49, 2 users,

forever让nodejs应用后台执行

nodejs一般是当成一条用户命令执行的,当用户断开客户连接,运用也就停了,很烦人.如何让nodejs应用当成服务,在后台执行呢? 最简单的办法: $ nohup node app.js & 但是,forever能做更多的事情,比如分别记录输出和错误日志,比如可以在js中作为api使用. $ sudo npm install forever -g #安装 $ forever start app.js #启动 $ forever stop app.js #关闭 $ forever start -l

后台执行进程的方法

后台进程: 我们每次在终端窗口执行命令的时候,进程总会一直占用着终端,走到进程结束,这段时间内,我们在终端的输入是没有用的.而且,当终端窗口关闭或网络连接失败后,再次打开终端,会发现进程已经中断了.这是因为用户注销或者网络断开时,SIGHUP信号会被发送到会话所属的子进程,而此 SIGHUP 的默认处理方式是终止收到该信号的进程.所以若程序中没有捕捉该信号,当终端关闭后,会话所属进程就会退出. 我们要实现后台执行的目的,实际上是要完成如下两个目标: 使进程让出前台终端,让我们可以继续通过终端与系

后台执行脚本管理

防止脚本执行中断的方法: a.sh while.sh & b.screen 总结此命令 c.nohup /server/script/02/while.sh & crtl + c   停止任务 ctrl + z   暂停任务 bg     把任务放到后台执行 fg 把后台的第一个任务放到前台执行,如果有多个任务,可以用fg 加任务编号调出 jobs   查看当前执行的脚本或者任务 top 显示进程 nice 改变系统优先级 nohup 用户退出系统之后可以继续工作 pgrep 查看匹配条件

所经历的大文件数据导出(后台执行,自动生成)

所经历的大文件数据导出(后台执行,自动生成) http://www.cnblogs.com/fanfan259/p/4710019.html 阅读目录 一.前言 二.生成excel文件 三.让程序在后台执行 四.显示文件生成进度 五.下载文件 六.上线后出现的问题 七.相应的后续优化 八.后记 一.前言 记录一下以前做的后台excel格式导出统计信息的功能,也是最近同事问到了相关东西,一时之间竟忘了具体的细节,因此记录一下: 大家知道,excel导出数据的功能,后台几乎是必须功能,一般都是点击后

后台执行shell脚本

执行方式: nohup sh export_data.sh 20150102 >20150102.log 2>&1 & [1] 29531 其中 0.1.2分别代表如下含义: 0 – stdin (standard input) 1 – stdout (standard output) 2 – stderr (standard error) nohup+最后面的& 是让命令在后台执行 >out.log 是将信息输出到out.log日志中 2>&1 是

如何后台执行脚本程序?

文章来自:http://www.cnblogs.com/hark0623/p/4196381.html    转载请注明 需要在你的脚本前面添加nohub,后边添加&.例如下面的脚本: nohup ./flume_client.sh & nohup的作用:当你的SecureCRT会话关闭后,保证你的脚本还在Linux后台执行 &的作业:在你的会话中后台执行脚本. 如果不添加&的话,那么你关闭SecureCRT(这时也就是关闭了会话)后,你的脚本一定也会断掉的

linux 如何让程序后台执行

$ (./test.sh &) $ setsid ./test.sh & $ nohup ./test.sh & 具体的转自:http://digdeeply.org/archives/06281192.html 在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了: Example 1 2 3 4 5 $ ./test.sh & [1] 17208 $ jobs -l [1]+ 17208 Run

Linux命令后台执行技巧小结

1.最简单的方法: command & 例如: top & 此时显示job编号和后台进程号 [1] 14814 2.正在运行的程序放入后台 Ctrl - Z 3.查看有哪些后台进程及状态 jobs 4.将后台进程切换到前台执行 fg job编号 5.让后台暂停的进程继续执行 bg job编号 6.杀死后台执行程序 kill %job编号 7.让程序在后台执行,关闭终端也不退出 例如一个不断输出程序test.sh,如下 while [ True ] do echo hello sleep 1

Linux前台的程序转到后台执行(关闭终端而不杀死命令)

你是否经常遇到这样的情况,通过SSH或者终端putty连接到一台linux/unix机器,执行一个程序.一个脚本或者一条命令,但现在你需要关闭SSH或者终端,由于该该程序.脚本或者命令正在运行,一旦你直接关闭而不做任何处理这个进程就会一起关闭,做到一半的工作就这样浪费掉,实在是可惜! 下面介绍一种方法可以在需要关闭终端的时,让正在运行的程序.脚本或命令转到后台执行,假设你的程序.脚本或者命令正在执行,下面可进行这样操作: 1.按下ctrl+z2.输入命令bg3.输入disown (在输入时可能只