iOS App的生命周期

简介: iOS App的生命周期

App从启动到退出的过程中,iOS应用程序不断从系统接收各种事件,如:用户点击了屏幕、用户点击了Home键,并对这些事件进行响应。接收事件是UIApplication对象的工作,但是,响应事件需要由程序员编写的代码来处理。为了理解事件响应需要在哪里处理,就必须对iOS应用程序的整个生命周期和事件周期有所了解。


App从启动到退出的过程中,iOS应用程序不断从系统接收各种事件,如:用户点击了屏幕、用户点击了Home键,并对这些事件进行响应。接收事件是UIApplication对象的工作,但是,响应事件需要由程序员编写的代码来处理。为了理解事件响应需要在哪里处理,就必须对iOS应用程序的整个生命周期和事件周期有所了解。


1.主函数main()


main()函数是每个iOS应用程序的入口,但在实际开发中,基本不需要在main()中进行额外的处理。在main中,最核心的功能就是把应用程序的控制权移交给UIKit框架,其中UIApplicationMain函数主要完成以下3个工作:创建应用程序所需的核心对象。读取storyboard文件,来加载用户界面。调用自定义的代码,用来定制应用程序的启动过程。

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}


2.应用程序的状态


在iOS 4之后,苹果引入了多任务功能,因此,对于应用程序来说,运行过程中就存在多种状态以及在不同状态之间的相互切换。应用程序一共存在下列5种状态,如图所示。


1684484138744.png


应用程序的状态切换

Not Running(未运行):应用程序未启动或者被终止。

Inactive(待激活):应用程序在前台运行,但是不能接收事件(UIEvent)。应用程序在不同状态之间切换时,经常会存在该状态。例如:在App显示启动页时,是从Not Running到Active的过程,中间会存在Inactive状态。

Active(激活,前台运行):应用程序在前台运行,可以接收事件(UIEvent)。

Background(后台运行):应用程序处于后台并且正在执行代码。绝大多数应用程序在进入挂起状态时,会短暂经历这个状态。

Suspended(挂起):应用程序处于后台,并且不能执行代码。此时,当内存不足时,操作系统有可能会自动把挂起状态的应用程序移除,以便给处于Active状态的应用程序提供更多的内存空间。


3.应用程序的启动过程


当用户点击icon的时候,应用程序会经历:NotRunning→Inactive→Active的过程,如图所示。


1684484149431.png


应用程序启动过程

在这个过程中,AppDelegete对象的如下方法会被调用。

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    return YES;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    return YES;
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
}


在实际开发过程中,假如不需要通过Storyboard加载界面,那么就需要在didFinishLaunchingWithOptions:方法中,设置window的根控制器。


4.应用程序从前台切换到后台


当用户点击Home键的时候,应用程序会经历从Active → Background → Suspended过程。在这个过程中,会调用AppDelegate对象中的applicationWillResignActive:以及applicationDidEnterBackground:方法。在实际的开发过程中,当用户点击Home键使应用程序切换到后台时,需要在这些方法中对数据或者状态进行保存,如图所示。


1684484159731.png


程序启动过程及对应方法

在默认情况下,applicationDidEnterBackground:方法有大概5秒的时间来完成一些任务。假如说5秒的时间不够,则需要调用beginBackgroundTaskWithExpirationHandler:方法来申请更多的后台运行时间,后台运行的时间由backgroundTimeRemaining属性来确定。

-(void)applicationDidEnterBackground: (UIApplication *)application {
    NSLog(@"%s",__func__);
    __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
        //Clean up any unfinished task business by marking where you
        //stopped or ending the task outright.
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
    //立即开始执行的任务
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) ,^{
        NSLog(@"________");
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}


5.应用程序从后台切换到前台


当应用程序从后台切换到前台时,会调用applicationWillEnterForeground:以及applicationDidBecomeActive:方法,如图所示。


1684484169394.png


应用从后台切换到前台


6.响应中断


当来电或者闹钟触发的时候,应用程序会触发中断,这时AppDelegate对象会首先调用application-WillResignActive:方法,当用户接听电话时,会直接跳转到电话程序;假如用户选择不接听电话,这时会返回应用程序,并调用applicationDidBecomeActive:方法,如图所示。


1684484179411.png


响应中断


7.锁屏/解锁


当用户锁屏的时候,应用程序会调用AppDelegate对象的applicationWillResignActive:方法以及applicationDidEnterBackground:方法。当用户解锁后,应用程序会调用applicationWillEnterForeground:方法以及applicationDidBecomeActive:方法。

目录
相关文章
|
4天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
2月前
|
传感器 iOS开发 UED
探索iOS生态系统:从App Store优化到用户体验提升
本文旨在深入探讨iOS生态系统的多个方面,特别是如何通过App Store优化(ASO)和改进用户体验来提升应用的市场表现。不同于常规摘要仅概述文章内容的方式,我们将直接进入主题,首先介绍ASO的重要性及其对开发者的意义;接着分析当前iOS平台上用户行为的变化趋势以及这些变化如何影响应用程序的设计思路;最后提出几点实用建议帮助开发者更好地适应市场环境,增强自身竞争力。
|
2月前
|
设计模式 Swift iOS开发
探索iOS开发:从基础到高级,打造你的第一款App
【10月更文挑战第40天】在这个数字时代,掌握移动应用开发已成为许多技术爱好者的梦想。本文将带你走进iOS开发的世界,从最基础的概念出发,逐步深入到高级功能实现,最终指导你完成自己的第一款App。无论你是编程新手还是有志于扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。让我们一起开始这段旅程吧!
|
5月前
|
编解码 iOS开发
IOS上架APP Store时预览图尺寸
IOS上架APP Store时预览图尺寸
786 3
|
5月前
|
开发工具 iOS开发
解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app
解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app
199 2
|
5月前
|
iOS开发
App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
251 0
App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
|
5月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
195 0
|
5月前
|
iOS开发
解决IOS上架App Store后显示语言为英文的问题
解决IOS上架App Store后显示语言为英文的问题
107 0
|
8月前
如何解决iOS16系统app首次启动总是弹出允许粘贴提示框问题
如何解决iOS16系统app首次启动总是弹出允许粘贴提示框问题
87 0
如何解决iOS16系统app首次启动总是弹出允许粘贴提示框问题
|
8月前
|
移动开发 开发工具 数据安全/隐私保护
iOS APP 版本更新升级教程:如何打包上架新的 APP 版本?
iOS APP 版本更新升级教程:如何打包上架新的 APP 版本?
iOS APP 版本更新升级教程:如何打包上架新的 APP 版本?