咱们日常使用APP时,通常人都会知道有:简单的正在使用状态;经过home键等方式离开应用,可是不关闭应用,即后台状态;以及调出后台程序管理后向上滑动将应用“杀死”,三种状态。而咱们开发者则会了解得更深便于进行开发工做。还有更多更深的知识还须要在将来进行探索后总结。而接下来将对当前初级阶段对APP的生命周期所学知识进行总结。缓存
应用尚未启动,或者应用正在运行可是途中被系统中止。bash
当前应用正在前台运行,可是并不接收事件(当前或许正在执行其它代码)。通常每当应用要从一个状态切换到另外一个不一样的状态时,中途过渡会短暂停留在此状态。例如用户锁屏或者接到通知去响应别的事件的时候。网络
当前应用正在前台运行,而且接收事件。这是应用正在前台运行时所处的正常状态。app
应用处在后台,而且还在执行代码。大多数将要进入Suspended状态的应用,会先短暂进入此状态。除了一些通过特殊的请求后能够长期处于此状态的应用。存在一些启动后会直接进入background状态的应用。函数
应用处在后台,而且已中止执行代码。系统会自动把程序变成这个状态并且不会发出通知。当挂起时,程序仍是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。优化
可由下图作一个总览:spa
其中,监听系统事件的方法在AppDelegate.m文件中,里面的几个方法代理的回调分别解释为:线程
// 告诉代理启动基本完成程序准备开始运行
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
复制代码
// 当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,好比打来电话
- (void)applicationWillResignActive:(UIApplication *)application
复制代码
// 当应用程序入活动状态执行,此方法跟上面那个方法相反
- (void)applicationDidBecomeActive:(UIApplication *)application
复制代码
// 当程序被推送到后台的时候调用。因此要设置后台继续运行,则在这个函数里面设置便可
- (void)applicationDidEnterBackground:(UIApplication *)application
复制代码
// 当程序从后台将要从新回到前台时候调用,此方法跟上面的那个方法相反
- (void)applicationWillEnterForeground:(UIApplication *)application
复制代码
// 当程序将要退出是被调用,一般是用来保存数据和一些退出前的清理工做
- (void)applicationWillTerminate:(UIApplication *)application
复制代码
各个操做时方法执行顺序均为从上到下。代理
分为启动程序时:code
function:-[AppDelegate application:didFinishLaunchingWithOptions:] line:25 content:-[AppDelegate application:didFinishLaunchingWithOptions:]
复制代码
function:-[AppDelegate applicationDidBecomeActive:] line:52 content:-[AppDelegate applicationDidBecomeActive:]
复制代码
点击home键时:
function:-[AppDelegate applicationWillResignActive:] line:33 content:-[AppDelegate applicationWillResignActive:]
复制代码
function:-[AppDelegate applicationDidEnterBackground:] line:40 content:-[AppDelegate applicationDidEnterBackground:]
复制代码
双击home键或点击图标再次打开程序时:
function:-[AppDelegate applicationWillEnterForeground:] line:46 content:-[AppDelegate applicationWillEnterForeground:]
复制代码
function:-[AppDelegate applicationDidBecomeActive:] line:52 content:-[AppDelegate applicationDidBecomeActive:]
复制代码
applicationWillResignActive:
方法中:应该实现:
在后台时,每一个应用程序都应该释放最大的内存。系统会尽量保证多的应用程序在后台运行。因此后台会为了减小程序占用的内存自动回收一些系统帮助你开辟的内存,如:
咱们也能够作一些努力:
把一些对象的强引用去掉,这样编译器就能够回收这些内存:
APP终止时,系统会调用applicationWillTerminate:
方法,咱们能够在其中进行一些保存数据或状态或一些清理的工做。方法中的这些工做会有最多5秒的时间限制,若是超过期间还有未完成的任务,你的程序就会被终止并且从内存中清除。
而像进入后台和程序终止状态,若是还须要长时间的运行任务,能够调用 beginBackgroundTaskWithExpirationHandler
方法去请求后台运行时间和启动线程来运行长时间运行的任务。