三、APP的生命周期

Reference:
app的生命周期
ios background modes

在知道APP是如何在内存中保持一直运行后之后,接下来需要知道的是APP运行时有哪些主要的状态,以及这些状态是如何切换的。

简述

应用程序有 Not Running(未运行),Inactive(未激活),Active(激活), Background(后台),Suspended(挂起)五个状态,当状态即将改变或已经改变时,会发送相应通知并在AppDelegate中会执行相应的回调,开发中需要视需求,在状态变换的回调方法中,添加相应的处理。

概览

概览

要点

  • Not Running和Suspended是APP未运行时的两种状态,在APP的抽象对象UIApplication的的applicationState中没有这两种状态,也没有相应的通知和AppDelegate回调;
  • 需要注意区分APP在刚启动和返回前台时分别触发的applicationDidBecomeActive:
  • APP进入后台前会先进入未激活状态applicationWillResignActive:
  • 一般的APP(没有特殊Background Modes的APP)进入后台有5s时间执行代码,之后会被挂起;
  • 进入后台后通过beginBackgroundTaskWithExpirationHandler:可申请180s的时间
    • 申请后台任务需和结束后台任务endBackgroundTask:需成对出现;
  • 挂起的APP依然在内存中,但可能被系统终止,内存不足时系统优先清理内存大的挂起APP;
  • APP将要被终止(非崩溃)时会调用applicationWillTerminate:,有5s的任务执行时间。

详细

APP开始运行之后会根据配置文件info.plist创建APP的抽象对象–UIApplication,这是一个完全单例,在运行期间有且只会有一个,Not Running和Suspended是APP运行期之外的状态,UIApplication对象的applicationState属性中运行时的三种状态:active、inactive和background,当APP运行时的状态将要或已经发生变化时,会发送通知并通过代理模式回调AppDelegate中的方法,由通知接受者或AppDelegate做相应的处理。

ApplicationState

APP未运行时的两种状态Not Running和Suspended对于编程没多少意义,需要关心的正是UIApplication对象中applicationState的状态切换,需要清楚的有以下几点:

  1. APP完成加载前是inactive,完成加载后即进入active状态
    • 回调1:application:willFinishLaunchingWithOptions:
    • 回调2:application:didFinishLaunchingWithOptions:
    • 回调3:applicationDidBecomeActive:
  2. APP被中断时会进入inactive状态,结束中断时返回active状态
    • 回调1:applicationWillResignActive:
    • 回调2:applicationDidBecomeActive:
  3. 锁屏和home按键也都是中断,所以APP在进入后台前会先进入inactive
    • 回调1:applicationWillResignActive:
    • 回调2:applicationDidEnterBackground:
  4. 从后台返回前台,APP会重新进入active状态
    • 回调1:applicationWillEnterForeground:
    • 回调2:applicationDidBecomeActive:
  5. 普通APP进入后台一段时间后会被挂起,被挂起的APP可能会被系统终止
    • 回调:applicationWillTerminate:

上述回调方法对应的的APP通知有:

  • UIApplicationDidFinishLaunchingNotification;
  • UIApplicationDidEnterBackgroundNotification
  • UIApplicationWillEnterForegroundNotification
  • UIApplicationDidBecomeActiveNotification;
  • UIApplicationWillResignActiveNotification;
  • UIApplicationWillTerminateNotification;

Background Modes

APP进入后台后可以按创建时指定的特殊后台运行模式运行,APP可以拥有多种后台运行模式,但审核时如果被认为APP无需所声明的后台运行模式,则审核会被拒。后台模式可以通过info.plist中的Required background modes进行配置,也可以通过Capabilities->Background Modes进行配置(推荐方式),APP的后台模式如下:

  1. Audio, AirPlay and Picture in Picture
  2. Location updates
  3. Voice over IP
    • info.plist key: App provides Voice over IP services
    • IP电话,此类APP同样会被挂起,但系统会接管其通信socket,当socket中有数据传来时,会唤醒APP并交回socket
  4. Newsstand downloads
    • info.plist key: App processes Newsstand Kit downloads
    • 杂志类应用,此类APP会被挂起和终止,但可使用NKAssetDownload后台下载杂志,并在下载成功后重新唤醒或启动APP
  5. External Accessory communication
    • info.plist key: App communicates with an accessory
    • 与MFi外设通信类APP,在外设消息到达时APP会被唤醒,有10s的执行时间
  6. Uses Bluetooth LE accessories
    • info.plist key: App communicates using CoreBluetooth
    • 与Bluetooth LE设备通信类APP,在设备的消息到达时会被唤醒,有10s的执行时间
  7. Acts as a Bluetooth LE accessory
    • info.plist key: App shares data using CoreBluetooth
    • 自身作为蓝牙外设的应用,此类APP可以后台常驻,但需要用户授权
  8. Background fetch
    • info.plist key: App downloads content from the network
    • 后台定时更新,设置时间间隔,在间隔时间内启动应用更新数据,有30s执行时间
  9. Remote notifications
    • info.plist key: App downloads content in response to push notifications
    • 静默推送,在静默推送到底时,回调对应方法下载内容,有30s执行时间
  10. Background processing
    • info.plist key: App processes data in the background
    • 基于NSURLSession的后台传输,任务成功或失败时,APP会被唤醒并执行application:handleEventsForBackgroundURLSession:completionHandler:回调
-------------This article is over, thank you for reading -------------