iOS初级开发学习笔记:APP生命周期的学习总结

咱们日常使用APP时,通常人都会知道有:简单的正在使用状态;经过home键等方式离开应用,可是不关闭应用,即后台状态;以及调出后台程序管理后向上滑动将应用“杀死”,三种状态。而咱们开发者则会了解得更深便于进行开发工做。还有更多更深的知识还须要在将来进行探索后总结。而接下来将对当前初级阶段对APP的生命周期所学知识进行总结。缓存

应用程序的五种状态

1. Not running:

应用尚未启动,或者应用正在运行可是途中被系统中止。bash

2. Inactive:

当前应用正在前台运行,可是并不接收事件(当前或许正在执行其它代码)。通常每当应用要从一个状态切换到另外一个不一样的状态时,中途过渡会短暂停留在此状态。例如用户锁屏或者接到通知去响应别的事件的时候。网络

3. Active:

当前应用正在前台运行,而且接收事件。这是应用正在前台运行时所处的正常状态。app

4. Background:

应用处在后台,而且还在执行代码。大多数将要进入Suspended状态的应用,会先短暂进入此状态。除了一些通过特殊的请求后能够长期处于此状态的应用。存在一些启动后会直接进入background状态的应用。函数

5. Suspended:

应用处在后台,而且已中止执行代码。系统会自动把程序变成这个状态并且不会发出通知。当挂起时,程序仍是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。优化

iOS程序执行过程

可由下图作一个总览: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 
复制代码

在此添加NSLog打印进行相关操做时执行的方法

各个操做时方法执行顺序均为从上到下。代理

分为启动程序时: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:]
复制代码

了解了APP运行中的几种状态和周期,咱们能够对一些情况进行响应的优化和处理。

例如当出现忽然来电话了等致使程序临时进入Inactive状态时,咱们能够在applicationWillResignActive:方法中:

  • 中止timer 和其余周期性的任务
  • 中止任何正在运行的请求
  • 暂停视频的播放
  • 若是是游戏那就暂停它
  • 减小OpenGL ES的帧率
  • 挂起任何分发的队列和不重要的操做队列(你能够继续处理网络请求或其余时间敏感的后台任务)。

当程序进入后台时:

应该实现:

  • 保存用户数据或状态信息,全部没写到磁盘的文件或信息,在进入后台时,最后都写到磁盘去,由于程序可能在后台被杀死
  • 释放尽量释放的内存

在后台时,每一个应用程序都应该释放最大的内存。系统会尽量保证多的应用程序在后台运行。因此后台会为了减小程序占用的内存自动回收一些系统帮助你开辟的内存,如:

  • 系统回收Core Animation的后备存储
  • 去掉任何系统引用的缓存图片
  • 去掉系统管理数据缓存强引用

咱们也能够作一些努力:

把一些对象的强引用去掉,这样编译器就能够回收这些内存:

  • 图片对象
  • 你能够从新加载的 大的视频或数据文件
  • 任何没用并且能够轻易建立的对象

程序终止时:

APP终止时,系统会调用applicationWillTerminate:方法,咱们能够在其中进行一些保存数据或状态或一些清理的工做。方法中的这些工做会有最多5秒的时间限制,若是超过期间还有未完成的任务,你的程序就会被终止并且从内存中清除。

而像进入后台和程序终止状态,若是还须要长时间的运行任务,能够调用 beginBackgroundTaskWithExpirationHandler方法去请求后台运行时间和启动线程来运行长时间运行的任务。

相关文章
相关标签/搜索