让程序支持后台处理

iOS支持4种主要的后台处理:应用程序挂起、本地通知、任务特定的后台处理和完成长时间运行的后台任务。

iOS4.0以后的设备都已经支持多任务了,如果项目要在更早版本的系统中运行,可以通过下面代码检测设备是否支持多任务:

UIDevice *device = [UIDevice currentDevice];
BOOL backgroundSupported = NO;
if([device respondsToSelector:@selector(isMultitaskingSupported)])
{
    backgroundSupported = device.multitaskingSupported;
}

先来看一下如何禁用后台处理:

如图所示,在info选项卡的Custom iOS Target Properties属性列表里添加一个新行:”Application does not run in background”,并将值设为YES即可禁用后台处理。

挂起

应用程序挂起时,它将暂停执行代码,但保留当前状态。用户返回到应用程序时,它看起来像是一直在运行。实际上,所有的任务都停止了,以免应用程序占用设备的资源。

在应用程序挂起时,除执行清理工作外,还需要负责从挂起状态恢复,并更新在挂起期间将发生变化的应用程序内容(时间/日期等)。

任何应用程序都默认支持后台挂起。为支持后台挂起,只需利用开发工具创建iOS4.0以上的项目即可。

可以创建一个计时器程序,当计数为10时,按home键退出程序,这样你过一段时间再返回程序,发现会从10开始继续计数,而不是挂起时仍然在继续计数。

本地通知

下面的代码演示了本地通知的使用,一旦生效,即使程序并没有运行,也会按设定的触发通知。

[[UIApplication sharedApplication] cancelAllLocalNotifications];

UILocalNotification *localNotif = [[UILocalNotification alloc] init];
localNotif.applicationIconBadgeNumber = 1;
localNotif.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
localNotif.timeZone = [NSTimeZone defaultTimeZone];
localNotif.repeatInterval = NSMinuteCalendarUnit;
localNotif.soundName = @"msg.wav";
localNotif.alertBody = @"This is a notice!";

[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
UILocalNotification *localNotif = [[UILocalNotification alloc] init];

这行代码取消了应用程序以前可能调度了的所有通知,以提供干净的平台。

UILocalNotification类的各属性释义:

applicationIconBadgeNumber — 触发通知时显示在应用程序图标中的徽章计数。

fireDate — 一个NSDate对象,指定通知将在未来的什么时间触发。

timeZone — 用于调度通知的时区。几乎总是设置为本地时区,即[NSTimeZone defaultTimeZone]。

repeatInterval — 重复触发通知的频率。可选择的值可能有NSDayCalendarUnit(每天)、NSHourCalendarUnit(每小时)、和NSMinuteCalendarUnit(每分钟)等。

soundName — 一个字符串(NSString),包含通知触发时将播放的声音源。

alertBody — 一个字符串,包含要向用户显示的文本消息。

[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];

开始调度通知

任务特定的后台处理

这种情况有一个很典型的应用,就是后台音乐播放:我们在程序里播放一首歌曲,当按下Home键或屏幕进入待机,我们仍然希望音乐继续播放。

首先建立简单代码:

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic,strong) AVAudioPlayer *audioPlayer;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //播放音频之前先要设置AVAudioSession模式,设为AVAudioSessionCategoryPlayback即可。模式意义及其他模式请参考文档。
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setActive:YES error:nil];
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];

    NSString *strSoundFile = [[NSBundle mainBundle] pathForResource:@“mymusic1” ofType:@"mp3"];

    self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:strSoundFile] error:nil];
    self.audioPlayer.delegate = self;
    [self.audioPlayer play];
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    NSLog(@"播放结束");
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end

然后需要选择项目的顶级编组,并单击目标—项目名,展开Custom iOS Target Properties选项卡,在属性列表里添加一行名为”Required background modes”的Key,然后展开这个键,在其中添加一个新值:”App plays audio or streams audio/video using AirPlay”。

修改保存后,再次运行程序,并按下home键返回,将发现音乐会继续在后台播放。另一个比较典型的应用就是定位服务,需要添加”App registers for location updates”。

完成长时间运行的后台任务

对于每项要启用后台完成的任务,都需要有自己的UIBackgroundTaskIdentifier。初始化方式如下:

UIBackgroundTaskIdentifier counterTask = [[UIApplication sharedApplication]
                                         beginBackgroundTaskWithExpirationHandler:^{
                                                //超时后的处理
                                                NSLog(@"超时");
                                         }];

完成初始化的同时也正式开启了后台处理,要停止后台处理,可以做如下操作:

[[UIApplication sharedApplication] endBackgroundTask:self.counterTask];

每个程序的后台处理时间是有限的,一般只有几分钟;通过UIApplication的backgroundTimeRemaining属性可以查询后台处理剩余时间:

NSTimeInterval timeInterval = [[UIApplication sharedApplication] backgroundTimeRemaining];

int hour = (int)(timeInterval/3600);
int minute = (int)(timeInterval - hour*3600)/60;
int second = timeInterval - hour*3600 - minute*60;

NSLog(@"%@",[NSString stringWithFormat:@"%d时%d分%d秒", hour, minute,second]);

下面创建了一个不停计数的程序,运行后尝试退出程序(不是结束程序),过一段时间后返回程序,发现计数还在后台进行,而不是像之前挂起那样暂停计数:

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic) UIBackgroundTaskIdentifier counterTask;
@property (strong, nonatomic) IBOutlet UILabel *lblNum;
@property (nonatomic) int count;
@property (nonatomic,weak) NSTimer *myTimer;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.counterTask = [[UIApplication sharedApplication]
                                             beginBackgroundTaskWithExpirationHandler:^{
                                                    //超时后的处理
                                                    NSLog(@"超时");
                                             }];

    self.myTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countUp) userInfo:nil repeats:YES];
}

- (void)countUp
{
    if(self.count==600)
    {
        [self.myTimer invalidate];
        [self setMyTimer:nil];
        [[UIApplication sharedApplication] endBackgroundTask:self.counterTask];
    }
    else
    {
        self.count++;
        self.lblNum.text = [[NSString alloc] initWithFormat:@"%d",self.count];
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

让程序支持后台处理

时间: 2024-10-22 02:26:55

让程序支持后台处理的相关文章

原创翻译:iOS 应用程序 蓝牙后台运行

默认情况下,普通的CoreBluetooth 任务中的大多数,无论是Central还是peripheral ,在后台或者挂起状况下都是无法进行的.也就是说,你可以通过宣布你的应用程序支持后台处理模式来允许你的一个应用程序把你从一个挂起状态中唤醒来执行某些蓝牙相关的事件. 即使你的应用程序支持一种或者两种CoreBluetooth后台执行模式,那么他也不会永远运行.在某些时候,系统也许由于当前的前台应用程序而终止你的应用程序来释放内存,这将会导致任何活跃的或者挂起的连接会丢失.在iOS7中,Cor

Linux之nohup命令:实现退出终端后程序继续后台运行

转自:http://tech.ccidnet.com/art/302/20070618/1115599_1.html 简单而有用的nohup命令在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程(本站有文章介绍过),比较麻烦:另一种方法是仍然用普通方法编程,然后用nohup命令启动程序: nohup<程序名>& 则控制台logout后,进程仍然继续运行,起到守护进程的作

让你的.NET程序支持多语言

辛辛苦苦做出来的软件,我们当然希望能让更多的人用,支持多语言是必须的.下面我将以Asp.net Web Form为例来介绍如何支持多语言.其他程序比如windows程序,过程都是大同小异的. 大概分以下几个步骤: 生成默认资源文件,翻译资源文件. 写一点代码实现语言切换 一些高级话题.例子总是简单的,真实项目会遇到哪些问题? 下面是详细步骤: 生成默认资源文件,翻译资源文件. 创建一个Asp.net web form 项目,添加一个WebForm, 里面加上一些元素,比如label,button

IOS 后台挂起程序 当程序到后台后,继续完成Long-Running Task 任务

我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法. // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackground:(UIApplication *)application { } 我们已经知道: 当一个 iOS 应用被送到后台,它的主线程会被暂停.你用 NSThread 的 detachNewThreadSelector:toTar get:withObject:类方法创建的线程也被挂起了. 我们假设有这么一种情况:

iOS后台挂起程序 当程序到后台后,继续完成Long-Running Task 任务

我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法. // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackground:(UIApplication *)application { } 我们已经知道: 当一个 iOS 应用被送到后台,它的主线程会被暂停.你用 NSThread 的 detachNewThreadSelector:toTar get:withObject:类方法创建的线程也被挂起了. 我们假设有这么一种情况:

开源一个golang小程序商城后台(moshopserver)

开源一个golang小程序商城后台(moshopserver) golang和c/c++比起来是一门新的语言,一直想学,网上搜集了一些资料,有些人说很容易上手,确实是这样,和C/C++比起来,少了很多乱七八糟的语法.学一门新的语言,最好的方法就是动手写一些东西,最近小程序也比较火,也想学一下,网络上搜索的一些开源项目,基本上没有golang实现的,大部分都是nodejs和java写的,那么我就来实现一个golang版的吧,一石二鸟. 开发小程序前后端都需要开发,自己的前端经验很少,搜索了一些开源

微信小程序结合后台数据管理实现商品数据的动态展示、维护

微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,本篇随笔介绍微信小程序结合后台数据管理实现商品数据的动态展示.维护,介绍如何实现商品数据在后台管理系统中的维护管理,并通过小程序的请求Web API 平台获取JSON数据在小程序界面上进行动态展示. 1.整体性的架构设计 我们整体性的架构设计,包含一个Web管理后台.一个Web API统一接口层.当然还有数据库什么,另外还有一个小程序客户端.整个架构体系还是以我之前随笔介绍的<整合微信小程序的Web API接口层的架

iOS 程序进入后台,包含用户上拉快捷菜单导致程序失去活跃的研究

今日在使用某App时候,突然发现上拉菜单.程序视频扔在播放,咦!引起了我的兴趣. 首先,列出两个方法, 第一个方法是AppDelegate的代理.当程序进入后台时候调用 - (void)applicationDidEnterBackground:(UIApplication *)application NS_AVAILABLE_IOS(4_0); 第二个方法是.注冊系统通知,name是UIApplicationWillResignActiveNotification,当程序释放活跃的时候调用.

学习IOS开发项目篇--如何让程序在后台保持挂起状态

程序的状态分为:前台运行,后台挂起,后台休眠,为了让项目的网络请求保持活跃状态,需要对程序进行设置. 在applicationDidEnterBackground方法中调用下面的方法,可以让程序进入挂起状态,但在未知时间内,可能会被系统设置为休眠,如果在将程序设置为播放器,并且循环播放一个MP3文件,可以保持永久挂起状态. UIBackgroundTaskIdentifier task =[application beginBackgroundTaskWithExpirationHandler: