IOS后台运行机制 与 动作

当用户按下"Home"键或者系统启动另外一个应用时,前台foreground应用首先切换到Inactive状态,然后切换到Background状态。此转换将会导致先后调用应用代理的applicationWillResignActive:和applicationDidEnterBackground:方法。

  在applicationDidEnterBackground:方法返回后,大部分应用在之后不久转入suspended状态。对于请求特定后台background任务的应用,比如播放音乐应用,或者那些请求需要额外执行时间的应用,可能会继续执行更长一段时间。

  具体流程如下图所示:

  

  注:应用从froeground切换到background只有在支持多任务并且运行iOS4.0或更新版本系统的设备上才会发生。所有其它的情况,应用不是切向后台,而是直接终止,并且从内存中清除。

  应用切向后台background时应该做什么:

  应用可以在applicationDidEnterBackground:方法中做些切向background状态前需要做的一些准备工作,当切向background状态时,所有的应用需要做以下事情:

  (1)应用界面快照。当applicationDidEnterBackground:方法返回时,系统保存应用界面的快照,并且使用快照图片作为转换动画。如果在你的应用界面中有涉及到敏感信息的视图,则你应该在applicationDidEnterBackground:方法返回前隐藏或者修改这些视图。

  (2)保存用户数据和应用状态信息。所有没有保存的改变都应该在切向background状态前写入磁盘以保存。这一步是必须的,因为你的应用在后台时很有可能因为多种其它原因而被很快kill掉。根据需要你可以在background
thread后台线程中执行这些操作。

  (3)释放尽可能多的内存资源。

  applicationDidEnterBackground:方法允许最多有5秒的时间去完成任何任务然后返回。实际中,此方法应该尽可能快的返回。如果在时间到期之后,此方法没有返回,则应用即被kill掉,并且清除所占用的内存。如果你的应用确实需要更多的时间去执行任务,可以调用beginBackgroundTaskWithExpirationHandler:方法请求后台执行时间,然后启动一个能长期执行任务的线程。无论你是否启动一个执行后台任务的线程,applicationDidEnterBackground:方法都必须在5秒后退出。

  注:UIApplicationDidEnterBackgroundNotification通知也会发送,以让应用对此通知感兴趣的部分知道当前应用正切向background状态。你的应用中的对象可以使用默认的通知中心注册这个通知。

  依据不同的应用场合,应用切向后台时还有很多其它的事情需要做,比如active状态的Bonjour服务应该暂停,应用应该停止调用OpenGL
ES函数。

  因为前台应用在使用系统资源和硬件时一直比后台应用具有更高的优先权。运行在后台的应用应该对此差异有心理准备,并且在后台运行时要调整它们的访问资源行为。特别的,当应用切向background时尤其要遵循以下几点:

  (1)不要在应用代码中调用任何OpenGL ES的东西。当应用在后台运行时不可以创建EAGLContext对象或者发出任何OpenGL
ES绘画命令,使用这些调用将会导致应用立即被kill掉。应用也必须保证先前提交发出的所有命令在应用切向background状态前都已执行完毕。具体细节请参考“OpenGL ES Programming Guide for iOS”中“Implementing a Multitasking-aware OpenGL ES Application”部分。

  (2)在应用挂起suspended之前取消所有Bonjour相关的服务。当应用转向后台,并且在被挂起前,应用应该unregister
Bonjour服务并且关掉任何和网络服务相关的sockets监听。挂起的应用是没法响应这些服务请求的。如果你的应用不关掉这些和Bonjour相关的服务,当应用被挂起的时候,系统会自动帮你关掉这些服务。

  (3)在基于网络sockets的应用中,需要处理连接失败的情况。当你的应用因为某些原因而被挂起时,系统可能会拆除socket连接。只要你的应用对尽可能多的网络错误情况都有很好的处理,像丢掉信号等,此类问题不会导致你的应用出现不正常。当应用从后台退出恢复执行时,如果遇到sockets使用错误,简单的重建socket连接即可。

  (4)在切向background状态前保存应用状态。在低内存告警时,后台应用可能会被清除出内存以释放空间。处于suspended状态的应用被优先清除内存,并且在被清除前不会给出任何通知。因此,当应用切入background状态前一定要保存足够多的应用状态信息以便后面恢复时使用。

  (5)当切向后台时,释放所有不再需要的内存。如果你的应用保持着一个很大的内存缓存对象(比如图像),则切入后台前,释放所有的对这些缓存对象的引用。

  (6)在被挂起前停止使用系统共享资源。使用系统共享资源(比如Address Book或Calendar
Data)的应用,在被挂起前必须停止对这些共享资源的使用。对这些资源的使用,前台应用具有更高的优先使用权,如果发现你的应用在被挂起后还没有停止对这些共享资源的使用,则应该将被kill掉。

  (7)避免更新应用窗口和视图。当应用处在后台时,应用窗口和视图是不可见的,所以不需要更新它他。尽管在后台创建和操纵窗口和视图对象并不会导致应用被kill掉,但是可以考虑将这些工作推迟到应用返回前台时执行。

  (8)响应外部附件连接和失去连接通知。针对和外部附件有通信的应用,当应用切向background状态时,系统会发送一个disconnection通知。应用必须注册此通知并且使用它去关掉当前的附件访问session。当应用返回foreground时,会有一个与之匹配的通知被发送,给应用提供重新建立session的机会。

  (9)切向后台时,清除行为警告相关的资源。为了在应用相互切换之间保存应用上下文,当应用切向后台时,系统并不自动dismiss
action sheets(UIActionSheet)和alert views(UIAlertView)。由应用设计者去提供具本的清除方案。对于运行在iOS4.0版本之前的应用,在退出时action sheets和alerts仍然被dismiss掉,以让应用的取消处理函数有机会去运行。

  (10)切向后台时,移除所有敏感视图信息。因为系统会快照应用界面并且生成应用切换动画,所以带有敏感信息的视图或窗口必须隐藏或移除,具体原因前面已介绍。

  (11)应用在后台运行时执行最少量化的工作。系统给后台运行的应用的执行时间和给前台运行的应用相比,通常非常有限。如果应用在后台播放音频或者监测位置变化,则应用应该仅关注此任务,所有不必要的任务都应该被推迟。在后台执行时间过长的应用会被系统throttled
back或者直接被kill掉。

下来我们操作一下看看:

AppDelegate.h:

///

UIBackgroundTaskIdentifier bgTask;

NSUInteger counter;

AppDelegate.m:

- (void)backgroundHandler {

NSLog(@"### -->backgroundinghandler");

UIApplication* app = [UIApplication
sharedApplication];

bgTask = [app
beginBackgroundTaskWithExpirationHandler:^{

[app endBackgroundTask:bgTask];

bgTask =
UIBackgroundTaskInvalid;

}];

// Start the long-running task

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0), ^{

while (1) {

NSLog(@"counter:%d",
counter++);

[[UIApplication
sharedApplication] setApplicationIconBadgeNumber:numbers++];

sleep(1);

}

});

}

- (void)applicationDidEnterBackground:(UIApplication *)application {

/*

Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.

If your application supports background execution, called instead of applicationWillTerminate: when the user quits.

*/

printf("\n applicationDidEnterBackground \n");

//////////////////////////////////////

BOOL backgroundAccepted = [[UIApplication
sharedApplication] setKeepAliveTimeout:600
handler:^{

[self
backgroundHandler];

}];

if (backgroundAccepted)

{

NSLog(@"backgrounding accepted");

}

[self
backgroundHandler];

}

info.plist:

Required background modes字段:

App provides Voice over IP services;

OK就可以看到后台程序在运行了!

可加QQ细聊64874940

IOS后台运行机制 与 动作

时间: 2024-10-27 13:28:48

IOS后台运行机制 与 动作的相关文章

iOS后台运行机制简解

1.iOS其实是伪后台 为什么说iOS是伪后台?首先需要了解一下iOS中的后台进程到底是怎么回事.iOS中所谓的“后台驻留”并不是指执行中的程序,而是指最近使用过的程序.当我们是一个进程进入到后台的时候,可以想象成是Command+Tab键盘. 一般来说,当把一个app退到后台的时候都会有5s的时间执行缓冲,有些程序可以要求达到10分钟(这个是需要开发人员来决定的),因此在按下Home键之后,本来的程序就会退到后台中去,最多10分钟之后还是会被终止的,这当然和苹果的后台管理机制有关.   2.i

iOS后台运行机制-实践总结

从2015年,接触到的项目里,就会有这样的需求:APP需要像Android那样,在后台状态下,执行正常的功能.到现在已经一年多了吧,一直在研究这个方面,写下一些心得,希望与大家共同交流探讨. 首先,我们要知道,苹果对APP占用硬件资源管的很严,更不要说应用后台时候的资源占用了.正常情况下,使用应用时,APP从硬盘加载到内存,开始工作:当用户按下home键,APP便被挂起,依然驻留在内存中,这种状态下,不调用苹果已开放的几种后台方法,程序便不会运行:如果在这个时候,使程序继续运行,则为后台状态:如

ios后台运行机制

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

iOS 后台运行实现

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

ios后台传输机制

http://www.appcoda.com/background-transfer-service-ios7/ http://www.raywenderlich.com/51127/nsurlsession-tutorial https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html ios后台传输机制

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 后台运行申请更多的时间

当应用程序进入后台时,系统会自动回调应用程序委托的applicationDidEnterBackground:方法. 应用可以在该方法中完成转入后台前需要做的准备工作,所有的应用需要做以下事情. 释放所有可以释放的内存. 保存用户数据或状态信息,所有没写入磁盘的文件或信息,在进入后台之前,都应该写入磁盘,因为程序可能在后台被杀死. 进入后台时释放内存 当程序进入后台之后,为了确保获得最佳的用户体验,建议释放那些占用内存较大且可以重新获取的资源—- 这是因为当应用处于后台时,iOS系统会优先终止那

iOS后台运行

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