要知道APP的生命周期,首先要了解一下生命周期的5种状态,结合状态理解生命周期的使用。

一、应用的状态

应用的状态包括:

1.1 未运行(Not running)

程序没启动

1.2 未激活(Inactive)

程序在前台运行,不过没有接收到事件。 一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。

1.3 激活(Active)

程序在前台运行而且接收到了事件。这也是前台的一个正常的模式

1.4 后台(Backgroud)

程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态

1.5 挂起(Suspended)

程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

二、常用的生命周期方法

APP的生命周期就是UIApplicationDelegate中的回调方法,这些方法是根据状态变化进行响应的地方,其中最常用的就是以下7个方法:

2.1 生命周期API

application:willFinishLaunchingWithOptions:

在App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复

application:didFinishLaunchingWithOptions:

表示App将从未运行状态进入运行状态,用于对App的初始化操作

applicationDidBecomeActive:

当应用即将进入前台运行时调用

applicationWillResignActive:

当应用即将进从前台退出时调用

applicationDidEnterBackground:

当应用开始在后台运行的时候调用

applicationWillEnterForeground:

当程序从后台将要重新回到前台(但是还没变成Active状态)时候调用

applicationWillTerminate:

当前应用即将被终止,在终止前调用的函数。通常是用来保存数据和一些退出前的清理工作。如果应用当前处在suspended,此方法不会被调用。 该方法最长运行时限为5秒,过期应用即被kill掉并且移除内存。

状态之间的关系图:

2.2 相关方法

#pragma mark - APP 生命周期

//在App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions

{

NSLog(@"app status : willFinishLaunchingWithOptions");

return YES;

}

//表示App将从未运行状态进入运行状态,用于对App的初始化操作

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

NSLog(@"app status : didFinishLaunchingWithOptions");

return YES;

}

//当应用即将进入前台运行时调用

- (void)applicationDidBecomeActive:(UIApplication *)application

{

NSLog(@"app status : applicationDidBecomeActive");

}

//当应用即将进从前台退出时调用

- (void)applicationWillResignActive:(UIApplication *)application

{

NSLog(@"app status : applicationWillResignActive");

}

//当程序从后台将要重新回到前台(但是还没变成Active状态)时候调用

- (void)applicationWillEnterForeground:(UIApplication *)application

{

NSLog(@"app status : applicationWillEnterForeground");

}

//当应用开始在后台运行的时候调用

- (void)applicationDidEnterBackground:(UIApplication *)application

{

//NSLog(@"程序进入后台");

NSLog(@"app status : applicationDidEnterBackground");

}

//当前应用即将被终止,在终止前调用的函数。通常是用来保存数据和一些退出前的清理工作。如果应用当前处在suspended,此方法不会被调用。 该方法最长运行时限为5秒,过期应用即被kill掉并且移除内存

- (void)applicationWillTerminate:(UIApplication *)application

{

NSLog(@"app status : applicationWillTerminate");

}

2.3 监听APP生命周期通知

- (void)applicationNotification

{

//应用开始在后台运行的时候通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];

//当程序从后台将要重新回到前台(但是还没变成Active状态)时候通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground) name:UIApplicationWillEnterForegroundNotification object:nil];

//应用进入运行状态通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidFinishLaunching) name:UIApplicationDidFinishLaunchingNotification object:nil];

//应用即将进入前台运行时通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];

//应用即将进从前台退出时通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive) name:UIApplicationWillResignActiveNotification object:nil];

//应用因内存警告退出通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidReceiveMemoryWarning) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];

//双击Home键杀掉应用通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate) name:UIApplicationWillTerminateNotification object:nil];

}

- (void)applicationDidEnterBackground

{

NSLog(@"app status : applicationDidEnterBackground");

}

- (void)applicationWillEnterForeground

{

NSLog(@"app status : applicationWillEnterForeground");

}

- (void)applicationDidFinishLaunching

{

NSLog(@"app status : applicationDidFinishLaunching");

}

- (void)applicationDidBecomeActive

{

NSLog(@"app status : applicationDidBecomeActive");

}

- (void)applicationWillResignActive

{

NSLog(@"app status : applicationWillResignActive");

}

- (void)applicationDidReceiveMemoryWarning

{

NSLog(@"app status : applicationDidReceiveMemoryWarning");

}

- (void)applicationWillTerminate

{

NSLog(@"app status : applicationWillTerminate");

}

三、常用的场景分析

3.1 程序启动

状态由 Not running -> Inactive -> Active

//依次调用的方法如下:

willFinishLaunchingWithOptions

didFinishLaunchingWithOptions

applicationDidBecomeActive

3.2 点击home键或者锁屏

状态由 Active -> Inactive -> Backgroud

//依次调用的方法如下:

applicationWillResignActive

applicationDidEnterBackground

3.3 重新进入前台

状态由 Backgroud -> Inactive -> Active

//依次调用的方法如下:

applicationWillEnterForeground

applicationDidBecomeActive

3.4 在前台,双击home键,手动杀掉APP

状态由 Active -> Inactive -> Backgroud -> end

//依次调用的方法如下:

applicationWillResignActive

applicationDidEnterBackground

applicationWillTerminate

3.5 当URL到达时,如果你的应用没在正在运行,则会被启动并且移到前台运行以打开URL

//依次调用的方法如下:

application:didFinishLaunchingWithOptions:

application:openURL:sourceApplication:

applicationDidBecomeActive

3.6 当URL到达时,如果你的应用正在background运行或被suspended,它将会被移到前台以打开URL

//依次调用的方法如下:

applicationWillEnterForeground

application:openURL:sourceApplication:

applicationDidBecomeActive

生命周期执行流程:

四、UIViewController的生命周期

当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序:

1、 alloc

创建对象,分配空间

2、init (initWithNibName|initWithCoder)

初始化对象,初始化数据

3、awakeFromNib

所有视图的outlet和action已经连接,但还没有被确定。

4、loadView

完成一些关键view的初始化工作,加载view。

5、viewDidLoad

载入完成,可以进行自定义数据以及动态创建其他控件

6、viewWillAppear

视图将出现在屏幕之前

7、viewWillLayoutSubviews

将要对子视图进行调整

8、viewDidLayoutSubviews

对子视图进行调整完毕

9、viewDidAppear

视图已在屏幕上渲染完成

10、viewWillDisappear

视图将被从屏幕上移除

11、viewDidDisappear

视图已经被从屏幕上移除

12、dealloc

视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放

13、didReceiveMemoryWarning

内存警告

五、UIView的生命周期

(纯代码)UIView创建为:[[UIView alloc] init];

1.initWithFrame:

2.init

3.layoutSubviews

(纯代码)UIView创建为:[[UiView alloc] initWithFrame:[UIScreen mainScreen].bounds];

1.initWithFrame:

2.layoutSubviews

(XIB)UIView创建为:NSArray *arr = [[NSBundle mainBundle] loadNibNamed:(@"XHView") owner:nil option:nil]; [arr lastObject];

1.initWithCoder:

2.awakeFromNib

3.layoutSubviews

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: