iOS应用生命周期 2021-01-15 前进路上 暂无评论 2014 次阅读 本文发布于2021-01-15, 文章内容或资源可能已经失效,仅供参考,谢谢。 今天学习了一下iOS应用生命周期的相关知识,这里记录一下iOS应用可能所处的5种状态以及各状态之间的切换。 # 5种状态 1. Not Running 应用没有运行 2. Inactive 非活跃状态,应用在活跃状态和后台状态之间切换时会先进入这个状态。 3. Active 活跃状态,应用可以与用户进行交互的状态。 4. Background 后台运行状态。在此状态下,应用应该尽量释放内存和占用的资源,保存一些数据。当内存资源紧张时,系统会将挂起的应用从内存中清除来释放更多内存。所以在后台运行时减少内存占用很重要。 当把后台运行状态下的可执行代码执行完后应用就会被挂起(Suspended)。系统会限制后台运行的时间,如果达到了限制时间应用还没执行完代码,则直接将应用关闭(不是挂起)。 苹果文档中说明Background的限制执行时间是5秒钟,但是可以通过调用`beginBackgroundTaskWithName: expirationHandler: `方法来延长时间。 5. Suspended 应用被挂起状态。在这个状态下,应用不会执行任何代码。如果内存不足,应用会被从内存中清除。 对于这5种状态之间的切换,这里有一张图 [![状态切换](https://assets.wuwz.net/distribute/web/zkkme/img/003a/003a-1.png "状态切换")](https://assets.wuwz.net/distribute/web/zkkme/img/003a/003a-1.png "状态切换") 应用启动后,首先会处于Inactive或者Background状态,这取决于应用是否要展示界面。如果是一个没有界面的应用则直接进入Background状态。当应用加载到前台后,状态会由Inactive切换到Active。 当在应用中双击Home键打开后台应用切换界面,应用会进入Inactive状态,如果从此界面再回到应用,则会回到Active状态;如果从后台应用切换界面离开了app,则会直接进入Background状态。 Background状态结束后,如果应用支持后台运行,则会进入Suspended被挂起状态;如果不支持则进入Not Running状态(app被关闭)。 当从应用返回到桌面,应用会先进入Inactive状态,然后再切换到Background状态。从桌面再返回应用,也会先进入Inactive状态,再进入Active状态。 # 生命周期方法 应用状态切换的时候系统会调用AppDelegate的几个方法。这里简单记录一下每个方法的调用时机,更加详细的说明可以去看苹果的官方文档。 1. **application: willFinishLaunchingWithOptions:** 应用启动后进入Inactive状态时调用。 2. **application: didFinishLaunchingWithOptions:** 在应用启动即将进入到Active状态之前调用此方法。在此方法结束运行之前app会一直处于开屏状态,所以尽快结束此方法可以给用户app启动很快的感觉。如果你开屏开了20秒还在开,系统会直接杀掉进程。 2. **applicationDidBecomeActive:** 从Inactive状态切换到Active状态时调用 3. **applicationWillResignActive:** 从Active状态进入Inactive状态时调用 4. **applicationDidEnterBackground:** 进入Background状态时调用,系统限制这个方法执行时间为5秒,苹果认为对于大多数app而言,5秒钟足以完成任何重要任务。 > When your app moves to the background, the system calls your app delegate’s applicationDidEnterBackground: method. That method has five seconds to perform any tasks and return. Shortly after that method returns, the system puts your app into the suspended state. For most apps, five seconds is enough to perform any crucial tasks, but if you need more time, you can ask UIKit to extend your app’s runtime. 但是我写了一个demo测试了一下发现这个方法可以执行到9秒。 5. **applicationWillEnterForeground:** 从Background状态切换到Inactive状态时调用(从桌面返回APP) 6. **applicationWillTerminate:** app被关闭时(进入Not Running状态)调用。 如果应用不支持后台运行,则在按下Home键返回桌面时,应用会先进入Inactive状态,然后正常进入Background状态,当Background状态结束后此方法会被调用,应用直接被关闭,不会进入Suspended状态;如果应用支持后台运行,则在应用被用户手动关闭或者被系统从内存中清除时会调用此方法。 苹果文档中说系统会限制此方法的执行时间为5秒钟,如果达到时间后此方法仍没有返回,则系统可能杀掉进程。 > Your implementation of this method has approximately five seconds to perform any tasks and return. If the method does not return before time expires, the system may kill the process altogether. 但是我写了个demo测了几次发现这个方法可以运行7~13秒,达到时间还没结束就直接被系统杀掉进程了。 如何配置应用是否支持后台运行? 在`info.plist`中配置键值对`UIApplicationExitsOnSuspend`。 `UIApplicationExitsOnSuspend`值为`YES`表示不支持后台运行(Application does not run in background ),但是这个不支持后台运行不是说不会进入Background状态,而是说应用不会在后台挂着(Suspended)。也就是说退出应用后应用就会被系统关闭。 `UIApplicationExitsOnSuspend`值为`NO`表示支持后台运行。应用可以在后台挂着(Suspended)。 ------------ 如果是支持scenes的应用,生命周期会与上面所说的有所不同,具体的可以看苹果的官方文档。 > REFERENCE - [Managing Your App's Life Cycle](https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle "Managing Your App's Life Cycle") - [Using Extended Runtime Sessions](https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background/extending_your_app_s_background_execution_time "Using Extended Runtime Sessions") 标签: iOS开发 如果您对此页面有任何问题或建议,请在本站留言,或联系邮箱me[at]zkk.me本网站部分内容转载自其他网站,如有侵权,请联系博主