iOS应用程序生命周期

avbsavbs 7年前
   <p>iOS应用的生命周期,程序是在前台还是后台运行,是活跃还是挂起状态,对于开发者来说是很重要的,因为开发者需要针对各种状态执行相应代码,遵循apple的一些原则。</p>    <h2>一个应用程序有五种状态</h2>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/c638db0c4c5e31eae388d6d33e5c6d47.png"></p>    <p>应用程序状态.jpg</p>    <ul>     <li>Not running 未运行 ,程序没启动。</li>     <li>Inactive 未激活 ,程序在前台运行,没有接收到事件。在程序没有事件需要处理时停留在这个状态。</li>     <li>Active 激活,程序在前台运行而且接收到了事件。这也是前台的一个正常的模式</li>     <li>Backgroud 后台,程序在后台而且能执行代码,大多数程序只能短暂停留这个状态,马上进入Suspended状态。</li>     <li>Suspended 挂起,程序在后台不能执行代码。但程序不会被马上杀死,当系统内存不足时,在这个状态的程序占用的内存优先被回收。</li>    </ul>    <h2>切换状态时的回调</h2>    <p>在发生状态切换时,都会调用delegate对象对应的方法来响应App状态的改变。</p>    <ul>     <li>application:willFinishLaunchingWithOptions: 这个方法是你在启动时的第一次机会来执行代码</li>     <li>application:didFinishLaunchingWithOptions: 这个方法允许你在显示app给用户之前执行最后的初始化操作</li>     <li>applicationDidBecomeActive: app已经切换到active状态后需要执行的操作</li>     <li>applicationWillResignActive: app将要从前台切换到后台时需要执行的操作</li>     <li>applicationDidEnterBackground: app已经进入后台后需要执行的操作</li>     <li>applicationWillEnterForeground: app将要从后台切换到前台需要执行的操作,但app还不是active状态</li>     <li>applicationWillTerminate: app将要结束时需要执行的操作</li>    </ul>    <h2>接下来是App启动、切换和锁屏状态时调用delegate对象的方法</h2>    <ul>     <li>App启动</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/8537964b55242524e6bf2ab93f43fe5b.gif"></p>    <p>App启动.gif</p>    <p>App启动时,首先由not running状态切换到inactive状态,此时调用application:didFinishLaunchingWithOptions:方法;然后调用application:didFinishLaunchingWithOptions:方法,最后由inactive状态切换到active状态,此时调用applicationDidBecomeActive:方法。</p>    <ul>     <li>App无事件响应</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/9b94d03bcce4e68affee5b4ebf3766a7.gif"></p>    <p>App无事件响应.gif</p>    <p>由active状态切换到inactive状态,此时调用applicationWillResignActive:方法。</p>    <ul>     <li>切换App</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/92218eed8bf273372c4377967ef4468d.gif"></p>    <p>切换App.gif</p>    <p>当切换到另一个App时,由状态active切换到inactive,此时调用applicationWillResignActive:方法;然后从inactive状态切换到running(background)状态,此时调用applicationDidEnterBackground:方法。</p>    <ul>     <li>锁屏</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/607acd179b0fe29d7d8dbd2b5c43f2bd.gif"></p>    <p>锁屏.gif</p>    <p>当手机锁屏时,由状态active切换到inactive,此时调用applicationWillResignActive:;然后再由inactive状态切换到running(background)状态,此时调用applicationDidEnterBackground:方法。</p>    <ul>     <li>App响应中断</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/c6d73381f52b687ef5ce50a2383a6d6e.png"></p>    <p>App响应中断.png</p>    <p>当一个基于警告式的中断发生时,比如有电话打进来了,这是程序会临时进入inactive状态,这用户可以选择如何处理这个中断。接着会调用applicationWillResignActive:方法,当中断来临时,你需要在这个方法中,停止timer或者周期性任务、停止视频,音乐播放、停止游戏运行。当程序回到active状态 , applicationDidBecomeActive: 会调用方法,恢复停止的操作。</p>    <ul>     <li>App转到后台运行</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/488878543fcad386f359be96a6053eb2.png"></p>    <p>App转到后台运行.png</p>    <p>首先调用applicationWillResignActive:方法,程序即将进入后台运行,接着调用applicationDidEnterBackground: 方法,此时程序为background状态,系统允许程序继续运行一段时间,然后程序进入Suspended状态。</p>    <ul>     <li>App转到前台运行</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/99a154ffe42f287109727340ad86619d.png"></p>    <p>App转到前台运行.png</p>    <p>系统唤醒程序,调用applicationWillEnterForeground: 方法,程序从background状态改为active状态,接着调用applicationDidBecomeActive:方法。当app处于挂起状态时,它是不能执行任何代码的。因此它不能处理在挂起期间发过来的通知,比如方向改变,时间改变,设置的改变还有其他影响程序展现的或状态的通知。在程序返回后台或前台时,程序要正确的处理这些通知。</p>    <ul>     <li>App终止</li>    </ul>    <p>当App被系统终止(如内存不足、Crash)或者用户自行终止。系统会在应用程序终止之前调用applicationWillTerminate: 方法,来保存用户的一些重要数据以便下次启动时恢复到app原来的状态。</p>    <p>参考文章:</p>    <ul>     <li> <p><a href="/misc/goto?guid=4959738400237346960" rel="nofollow,noindex">iOS应用程序生命周期(前后台切换,应用的各种状态)详解</a></p> </li>     <li> <p><a href="/misc/goto?guid=4959738400333311964" rel="nofollow,noindex">深度解析iOS应用程序的生命周期</a></p> </li>    </ul>    <p> </p>    <p> </p>    <p>来自:http://www.jianshu.com/p/afaf8a32ae9f</p>    <p> </p>