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:方法。

目录
相关文章
|
2月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
155 3
|
2月前
|
Android开发 iOS开发 开发者
App备案-iOS云管理式证书 Distribution Managed 公钥及证书SHA-1指纹的获取方法
App备案-iOS云管理式证书 Distribution Managed 公钥及证书SHA-1指纹的获取方法
232 0
|
2月前
如何解决iOS16系统app首次启动总是弹出允许粘贴提示框问题
如何解决iOS16系统app首次启动总是弹出允许粘贴提示框问题
36 0
如何解决iOS16系统app首次启动总是弹出允许粘贴提示框问题
|
2月前
|
大数据 测试技术 数据库
ios app性能分析
ios app性能分析
20 2
|
2月前
|
移动开发 网络协议 Linux
We discovered one or more bugs in your app when reviewed on iPhone and iPad running iOS 14.1
We discovered one or more bugs in your app when reviewed on iPhone and iPad running iOS 14.1
33 0
|
2月前
|
定位技术 开发工具 iOS开发
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
25 0
|
2月前
|
iOS开发 网络架构 UED
ios app的分类与本质,感想
ios app的分类与本质,感想
25 0
|
2月前
|
小程序
深入理解 uni-app 页面生命周期(四)onShareAppMessage
深入理解 uni-app 页面生命周期(四)onShareAppMessage
|
2月前
|
C++
深入理解 uni-app 页面生命周期(三):onHide vs onUnload
深入理解 uni-app 页面生命周期(三):onHide vs onUnload
104 0
|
2月前
|
JavaScript
深入理解 uni-app 页面生命周期(二):onReady()
深入理解 uni-app 页面生命周期(二):onReady()