iOS应用的生命周期详解

iOS系统资源是有限的,合理的去配置应用程序的运行状态以及了解app的生命周期对于大多数开发者来说是很重要的一件事情!在后台进行运行时app会受到系统的很多限制,但是也可以提高电池的使用和用户的体验

应用程序的活动状态

应用程序的活动状态一次如下

1、not running 未运行状态,程序并没有进行启动时的状态

2、inactive 未激活状态,表示程序在前台进行运行,但是没有接受到任何的事件进行处理,比如一个UI界面不含有任何操作时为未激活状态

3、active 激活状态,应用程序接受到事件,并且对事件进行响应和处理,这也是前台的一个重要的状态

4、backGround 后台状态,处于运行中的应用程序切换到后台时的状态,会在此状态保留一定时间,时间超过时就会进入应用程序的挂起状态,有的应用程序也可以根据需求使其长期进入后台状态

5、Suspended 挂起状态,此状态也是一种后台状态,于backGround的不同在于挂起状态的应用程序是不可以执行代码的,其特点是程序还是停留在内存中,当出现内存警告时iOS系统会首先把挂起的程序清除出内存并为处于前台运行状态的应用程序提供内存

下面是程序运行状态的变化图

运行状态的代理回调方法

对应未启动状态,告诉代理程序已经进入启动状态但是还没有进入未激活状态和进行状态保存

1、- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

对应已经启动状态,准备进入前台开始运行状态,当没有接收到事件时则表示的是未激活状态

2、- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

对应应用程序放弃了活动状态进入未激活状态,在此状态中应用程序无法接受事件进行处理

3、- (void)applicationWillResignActive:(UIApplication *)application

应用程序进入激活状态,应用程序可以接受事件并对其进行处

4、- (void)applicationDidBecomeActive:(UIApplication *)application 

应用程序进入后台,在后台继续执行的代码在此可以进行处理即可

5、- (void)applicationDidEnterBackground:(UIApplication *)application

应用程序将要进入前台,包含两个状态未激活和激活状态

6、- (void)applicationWillEnterForeground:(UIApplication *)application

应用程序将要退出,用来保存一些数据和转状态,以及应用程序退出前的内存清理工作

7、- (void)applicationWillTerminate:(UIApplication *)application

应用程序完成载入

8、- (void)applicationDidFinishLaunching:(UIApplication*)application

应用程序的生命周期

加载进入前台的生命周期

应用程序进入前台的生命周期从图中可以看出包括启动时间,应用程序进入运行的时间,以及切换不同app时的时间

应用程序的启动时间:从图中可以看出,应用程序的启动时间从我们触发app开始,然后到main函数执行,到加载mainUI文件,到第一次加载完成以及加载其他UI完成的时间并进入未激活状态所用的时间就是启动app时的启动时间

其代理方法的调用时间;

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions在第一次完成加载mainUI时进行加载

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 在完全加载成功UI时进入此方法通知app完成启动进入未激活状态

- (void)applicationDidBecomeActive:(UIApplication *)application  在应用程序处于运行状态时接受到事件时通知app进入激活状态

加载进入后台的生命周期

从上图可以看出,当应用程序启动后,进入后台时会有一个判断是否可以在后台运行,允许后台运行时会一直处于后台运行状态并执行某些代码操作,当不允许运行时会进入到挂起状态不可执行任何代码操作。当我们在返回前台运行时会通过代理方法通知app程序的运行状态从后台变为前台的未激活状态和激活状态

main函数的分析

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

main函数具有两个参数,argc于argv参数,这两个参数代表中启动时间。这两个参数作为UIApplicationMain函数的参数去启动app并对UI文件进行初始化,第三个参数为应用程序的名称,常用nil表示为默认的程序UIApplication类,最后一个参数时我们自定义的代理名称,这个类用于应用程序的代理类以及代码之间的交互操作

基于响应中断的操作

当一个基于警告式的中断发生时就要有中断响应的操作,例如在播放音乐时突然接到电话的中断操作

其流程图如下

进入前台的应用程序通过事件监听循环对各种事件进行监听,当监听到打电话操作时首先会把当前程序列入未激活状态,接着询问是否对当前事件响应以及放弃,如果放弃则变为激活状态继续执行当前操作。如果响应则进入其他app,并对当前事件进行状态保存。例如播放音乐的暂停操作

锁屏键中断

锁屏键也是一种程序中断方式,当我们按锁屏键时,系统屏蔽了所有的交互事件并通知app进入未激活状态和放入后台进行待续操作!

当应用程序进入未激活和后台时我们需要在进入未激活状态的代理方法中去保存程序的运行进度状态,例如暂停播放音乐和视频,停止动画播放和周期性任务,并挂起不必要的网络请求操作等

后台运行操作

返回前台的运行操作

猜你喜欢

转载自blog.csdn.net/die_word/article/details/81178025