IOS 后台运行申请更多的时间

当应用程序进入后台时,系统会自动回调应用程序委托的applicationDidEnterBackground:方法。

应用可以在该方法中完成转入后台前需要做的准备工作,所有的应用需要做以下事情。

释放所有可以释放的内存。

保存用户数据或状态信息,所有没写入磁盘的文件或信息,在进入后台之前,都应该写入磁盘,因为程序可能在后台被杀死。

进入后台时释放内存

当程序进入后台之后,为了确保获得最佳的用户体验,建议释放那些占用内存较大且可以重新获取的资源—-

这是因为当应用处于后台时,iOS系统会优先终止那些占用内存大的应用。如果应用尽可能释放其所占用的内存,

那么应用就可以在后台存或更久。从这个角度来看,可以得到一个结论:应用暂停时所占用的内存减少,iOS彻底终止该应用的风险就越低。

如果应用没有启用ARC机制,程序需要在应用进入后台时,将那些需要释放的资源的引用计数变为0,从而让系统回收这些资源。

当应用转入前台时,系统需要重新恢复这些资源。

如果应用启用了ARC机制,程序只要在应用进入后台时,将应用那些需要释放的资源的变量赋为nil即可。当应用转入前台时,

系统需要重新恢复这些资源。



//  使用默认的通知中心监听应用转入前台的过程

//  应用转入前台时会向通知中心发送UIApplicationWillEnterForegroundNotification

//  从而激发enterFore:方法

[[NSNotificationCenter defaultCenter] addObserver:self  selector:@selector:@selector(enterBack:) name:UIApplicationWillEnterForegroundNotification

object:[UIApplication sharedApplication]];

//  使用默认的通知中心监听应用转入前台的过程

//  应用转入前台时会向通知中心发送UIApplicationDidEnterBackgroundNotification

//  从而激发enterFore:方法

[[NSNotificationCenter defaultCenter] addObserver:self  selector:@selector:@selector(enterBack:) name:UIApplicationDidEnterBackgroundNotification

object:[UIApplication sharedApplication]];


说明


上面程序控制当应用转入前台时,该视图控制器的enterFore:方法被调用;当应用转入后台时,该控制器的enterBack:方法被调用,下面是enterBack:方法的代码


- (void) enterBack:(NSNotification *)notification

{

NSLog(@”—enterBack—”);

// 转入后台时将可以迅速重建,而且占用内存较大的对象设为nil,以便系统释放内存

bgLayer1.contents = nil;

bgLayer2.contents = nil;

ePlaneImage1 = nil;

}


说明


由于该应用已经启用了ARC机制,因此上面方法只要将这些图片、音乐资源的变量设为nil,系统就可以回收这些图片、音乐资源所占用的内存。

当应用再次转入前台时,该控制器的enterFore:方法被调用,该方法将负责再次加载这些图片、音乐资源。下面是enterFore:方法的代码。


代码片段


-  (void) enterFore:(NSNotification *)notification

{

NSLog(@”===enterFore===”);

bgLayer1.contents = (id)[bgImage CGImage];

bgLayer2.contents = (id)[bgImage CGImage];

ePlaneImage1 = [UIImage imageNamed:@”e1”];

}


说明


通过上面的处理方法,程序可以在应用转入后台时释放大部分内存,使得该应用在后台以少量内存运行,从而降低该应用被iOS系统终止的风险。当该应用转入前台时,系统将会再次初始化 这些资源,从而保证iOS应用可以迅速恢复。

进入后台时保存状态

当应用进入后台时,如果程序有一些状态数据没有保存,而iOS系统可能在内存紧张时终止该应用,那么就可能导致该应用丢失这些状态数据。

为了让应用不会丢失状态数据,程序可以在应用转入后台时记录应用状态,应用转入后台时将会调用视图控制器的enterBack:方法,因此在该方法后面增加如下代码:

// 使用NSUserDefaults存储系统积分

[[NSUserDefaults standardUserDefaults] setInteger:score forkey:@”score”];

上面的代码只是简单地使用了NSUserDefault来保存程序状态。如果程序需要保存的状态数据较多,也可采用plist属性文件或者其他形式来保存程序状态。

接下来同样可以在应用转入前台时恢复程序状态,应用转入前台时将会调用视图控制器的enterFore:方法,因此在该方法后面增加如下代码:

// 使用NSUserDefaults读取系统已经保存的积分

NSNumber* scoreNumber;

if((scoreNumber = [[NSUserDefault standardUserDefaults]

objectForKey:@”score”]))

{

score = scoreNumber.integerValue;

}

请求更多的后台时间

当应用转入后台后,不要在主线程中执行超过5秒的任务,如果应用进入后台花费了太多时间(即applicationDidEnterBackground:方法的执行体花费太多时间),应用可能从内存中被删除.

假如应用程序正在执行文件下载或文件传输等,当应用进入后台时,如果该任务还没有执行完成,应用转入后台该任务就会被暂停.千万不要强制在applicationDidEnterBackground:方法中直接完成该任务—-因为这会导致应用进入后台花费太多时间,iOS系统可能直接从内存中删除该应用.正确的做法是: 以applicationDidEnterBackground:方法为平台,告诉系统进入后台还是更多的任务需要完成,从而向系统申请更多的后台时间.在这种方式下,当我们的应用处于后台时,即使用户正在使用其他应用,只要系统还是足够的内存,我们的应用就可以保存在内存中,iOS系统会保留应用运行一段时间。


为了请求更多的后台时间,按如下步骤执行:


1.调用UIApplication对象的beginBackgroundTaskWithExpirationHandler:方法请求获取更多的后台执行时间,该方法默认请求额外获得10分钟后台时间。该方法需要传入一个代码块作为参数,如果请求获取后台执行时间失败,将会执行该代码块。该变量可作为后台任务的标识符。


2.调用dispatch_async()方法将指定代码块提交给后台执行.


3.后台任务执行完成时,调用UIApplication对象的endBackgroundTask:方法结束后台任务


例如如下示例应用,该应用在系统转入后台时请求了后台执行时间,然后启动一个代码块,该代码块循环100次,模拟执行一个耗时的下载任务.从该程序转入后台的执行过程可以看出,通过这种机制即可让iOS应用在后台执行更长时间.


下面是该应用的视图控制器类的实现部分代码


ViewController.m

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

// 使用默认的通知中心监听应用转入后台的过程

//  应用转入后台时会向通知中心发送UIApplicationDidEnterBackgroundNotification

// 从而激发enterBack:方法

[[NSNotificationCenter defaultCenter]  addObserve:self

selector:@selector(enterBack:)

name:UIApplicationDidEnterBackgroundNotification

object:[UIApplication sharedApplication]];

}

- (void)enterBack:(NSNotification *)notification

{

UIApplication *app = [UIApplication sharedApplication];

// 定义一个UIBackgroundTaskIdentifier类型(本质就是NSUInteger)的变量

// 该变量将作为后台任务的标识符

__block UIBackgroundTaskIdentifier backTaskId;

backTaskId = [app beginBackgroundTaskWithExpirationHandler:^

{

NSLog(@”===在额外申请的10分钟内依然没有完成任务===”);

// 结束后台任务

[app endBackgroundTask:backTaskId];

}];

if(backTaskId == UIBackgroundTaskInvalid)

{

NSLog(@”===iOS版本不支持后台运行,后台任务启动失败===”);

return;

}

// 将代码块以异步方式提交给系统的全局并发队列

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

, ^{

NSLog(@”===额外申请的后台任务时间为: %f===”

,  app.backgroundTimeRemaining);

// 其他内存清理的代码也可以在此处完成

for(int i = 0 ; i < 100 ; i++)

{

NSLog(@”下载任务完成了%d%%” , i);// 转换成百分比

// 暂停10秒模拟正在执行后台下载

[NSThread sleepForTimeInterval:10];

}

NSLog(@”===剩余的后台任务时间为: %f===”

,  app.backgroundTimeRemaining);

// 结束后台任务

[app endBackgroundTask:backTaskId];

});

}

@end

时间: 2024-08-04 16:32:24

IOS 后台运行申请更多的时间的相关文章

IOS后台运行机制 与 动作

当用户按下"Home"键或者系统启动另外一个应用时,前台foreground应用首先切换到Inactive状态,然后切换到Background状态.此转换将会导致先后调用应用代理的applicationWillResignActive:和applicationDidEnterBackground:方法. 在applicationDidEnterBackground:方法返回后,大部分应用在之后不久转入suspended状态.对于请求特定后台background任务的应用,比如播放音乐应

iOS 后台运行实现

iOS 后台运行的规则 应用的运行状态分为以下五种:Not running:应用还没有启动,或者应用正在运行但是途中被系统停止.Inactive:当前应用正在前台运行,但是并不接收事件(当前或许正在执行其它代码).一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态.唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电.有未读短信等)事件的时候.Active:当前应用正在前台运行,并且接收事件.这是应用正在前台运行时所处的正常状态Su

iOS 后台运行 类型

iOS后台运行,需要有特定的类型才可以进行.这些内容并不是一直不变的,苹果也在逐步的更新这些内容. 本文内容是2015年11月03日时苹果支持的后台运行类型. 这是官方连接地址 其中较为重要的是下面这张表,我已截图出来. 解释一下: 1. 音频播放和录制: 2. 位置更新: 3. VOIP: *4. 后台下载(此处指预更新): 5. 使用External Accessory framework库(通常是通过MFI认证的蓝牙应用): 6. 蓝牙应用(使用Core Bluetooth framewo

iOS 后台运行实现 --备用

文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以,1.音乐2.location 3.voip 文二 在IOS后台执行是本文要介绍的内容,大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间,以提供这些服务. 判断是否支持多线程 UIDevice* device = [UIDevice c

iOS后台运行

我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间.还有三种类型的可以运行在后以,1.音乐2.location3.voip 文二 在IOS后台执行是本文要介绍的内容,大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间,以提供这些服务. 判断是否支持多线程 UIDevice* device = [UIDevice curren

ios后台运行机制

IOS长时间后台运行的实现代码 1.检查设备是否支持多任务 Apple出于性能的考虑,并不是所有的iOS设备升级到iOS4以后都支持多任务,比如iPhone 3G.如果你的应用在没有多任务特性时会出问题,为了保持应用的健壮性,你应该对此进行判断并处理.你可以通过调用UIDevice对象的multitaskingSupported属性来获取当前设备是否支持多任务. [cpp] view plaincopy if(![UIDevicecurrentDevice].multitaskingSuppor

IOS后台运行浅析

在之前的文章<App States and Multitasking IOS应用程序状态和多任务>说到IOS程序有前台后台之分.在IOS程序进入后台之后,程序就会不执行代码,如果非要有什么必须执行的过程,可以申请大约600s的时间,如果在这段时间内程序还没有完成则会被系统杀死.出现:has active assertions beyond permitted time. 更多IOS后台内容参考:<IOS7 Background Fetch后台应用程序刷新> <IOS 7四种后

IOS 后台运行 播放音乐

iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,AvPlayer播放的话,要实现完美的后台音频播放,依据app的功能需要,可能需要实现几个关键的功能. 首先,播放音频之前先要设置AVAudioSession模式,通常只用来播放的App可以设为AVAudioSessionCategoryPlayback即可.模式意义及其他模式请参考文档. 1 //后台

IOS后台运行 之 后台播放音乐

iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,AvPlayer播放的话,要实现完美的后台音频播放,依据app的功能需要,可能需要实现几个关键的功能. 首先,播放音频之前先要设置AVAudioSession模式,通常只用来播放的App可以设为AVAudioSessionCategoryPlayback即可.模式意义及其他模式请参考文档. //后台播放