APP 的生命周期

jrpk5846 8年前
   <p>先上一张图, 让大家有一个直观的印象, 这图是我用 keynote 画的, 第一次使用, 大家多多包涵</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/6463300c94f928a7fa7a59569c6a0fa4.png"></p>    <p> </p>    <p>下面我就来一一解释下 APP 的生命周期</p>    <ul>     <li> <p>当我们打开 APP 时, 首先会执行 main函数, 但是与 OC 不同的是, swift 并不能找到 main.swift 这个文件, 这是为什么呢?</p> </li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/c749789e6ca6c30a324516ca37e6fceb.png"></p>    <p>当我们在19行打上一个断点时, 可以发现, swift 当然也执行了 main 函数,只不过,苹果没有给我们提供 main 函数的接口, 大概苹果认为这个反正不常用, 就干脆不单独设置了吧, 于是就用了@ UIApplicationMain 这么一个关键字合并了 APP 入口.</p>    <p>苹果给出的官方解释如下:</p>    <p>For iOS apps the default for new iOS project templates is to add @UIApplicationMain to a regular Swift file. This causes the compiler to synthesize a mainentry point for your iOS app, and eliminates the need for a “main.swift” file.</p>    <p>就是说, iOS APP 的默认的项目模板中添加了@UIApplicationMain关键字, 这使得编译器合成了 iOS APP 的 main 入口, 所有就不需要有 main.swift 的存在.</p>    <p><strong>那么在 main函数中, 系统帮我们做了什么事情呢?</strong></p>    <p>系统主要帮我们</p>    <p>1.初始化 UIApplication 对象;</p>    <p>2.设置 applicationDelegate;</p>    <p>3.开启运行循环,监听系统事件.</p>    <p>这个运行循环有什么特点呢? 它遵循 FIFO 的原则, <strong>即 First In First Out(先进先出)的原则</strong> , 先监测到的事件先处理, 当没有监测到事件的时候处于 <strong>休眠状态</strong></p>    <p>当 APP 对象监测到系统事件的时候, 无法处理事件, 这个时候就要用到代理, AppDelegate 这个类遵守了 UIApplicationDelegate 这个代理协议, 并实现了处理 APP 生命周期事件的方法, 这些方法就是第一幅图中提到的那些方法:</p>    <ul>     <li> <p><strong>程序加载完毕</strong></p> </li>    </ul>    <pre>  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {          // Override point for customization after application launch.          print("applicationDidFinishLaunchingWithOptions")          return true      }</pre>    <p>应用启动并进行初始化时会调用该方法并发出通知: UIApplicationDidFinishLaunchingNotification.这个阶段会实例化根视图控制器. 也可以写一些希望在程序加载完毕之后进行的操作.</p>    <ul>     <li> <p><strong>程序获取焦点</strong></p> </li>    </ul>    <pre>  func applicationDidBecomeActive(_ application: UIApplication) {          // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.          print("applicationDidBecomeActive")      }</pre>    <p>应用已经进入前台, 并处于活动状态时调用该方法并发出通知 UIApplicationDidBecomeActiveNotification. 这个阶段可以重启任意在程序处于非激活状态下的暂停的任务(或者是尚未开始的任务), 如果应用程序之前处于后台, 可以进行刷新 UI 的操作(非必须)</p>    <ul>     <li> <p><strong>程序将要失去焦点(即将被挂起)</strong></p> </li>    </ul>    <pre>  func applicationWillResignActive(_ application: UIApplication) {          // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.          // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.          print("applicationWillResignActive")      }</pre>    <p>应用即将失去焦点(即将被挂起), 并发出 UIApplicationWillResignActiveNotification 通知, 这个方法是在激活到失活状态时调用, 比如收到短信或者有电话呼入, 或者当用户退出运用程序到后台的转场时调用. 在这个方法里, 我们需要写一些暂停当前任务, 暂停计时器, 干掉图形渲染回调, 终止游戏等代码</p>    <ul>     <li> <p><strong>程序已经进入后台</strong></p> </li>    </ul>    <pre>  func applicationDidEnterBackground(_ application: UIApplication) {          // 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, this method is called instead of applicationWillTerminate: when the user quits.          print("applicationDidEnterBackground")      }</pre>    <p>应用程序已经进入后台, 并发出 UIApplicationDidEnterBackgroundNotification 通知, 使用这个方法释放共享资源, 保存用户数据, 干掉计时器, 尽可能地储存当前的应用状态信息.</p>    <ul>     <li> <p><strong>程序即将进入前台</strong></p> </li>    </ul>    <pre>  func applicationWillEnterForeground(_ application: UIApplication) {          // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.          print("applicationWillEnterForeground")      }</pre>    <p>应用即将进入前台, 但是还没有处于活动状态时调用该方法,并发出 UIApplicationWillEnterForeground通知, 就是这个时候应用还无法响应用户的点击的交互事件, 这个阶段可以恢复用户的数据.</p>    <ul>     <li> <p><strong>程序即将终止</strong></p> </li>    </ul>    <pre>  func applicationWillTerminate(_ application: UIApplication) {          // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.          print("applicationWillTerminate")      }</pre>    <p>应用即将被终止时调用, 并发出通知UIApplicationWillTerminate, 这个阶段可以保存用户数据</p>    <ul>     <li> <p><strong>应用程序接收到内存警告</strong></p> </li>    </ul>    <p>严格说来, 这并不是 APP 生命周期的一部分</p>    <p>当应用程序收到系统发出的内存警告时调用, 主要在这里写一些清除缓存的代码.</p>    <p> </p>    <p> </p>    <p> </p>    <p>来自:http://www.jianshu.com/p/7f96dc4f4b4f</p>    <p> </p>