谈谈AppDelegate
前言
每个iOS程序都会有一个AppDelegate的类,这个类就是一个代理类,我们新建一个Project的时候,里面都会带有这个类。现在就让我们看看这个类。
开始介绍
对于AppDelegate,它的父类是UIResponder,然后实现了UIApplicationDelegate协议,这里的方法多是协议里面的方法,先看看默认的都有哪些方法。
1 application:didFinishLaunchingWithOptions:
它带参是这样的:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
return YES;
}
-
先看一下它的注释:在应用程序启动后,重写自定义点。这个是最直接的解释,一般在这里面,我做的操作如下:
- 不用故事板,自定义rootview
- 使用其他三方类库的时候在里面做一些初始化操作什么的。
-
参数
| 参数| 描述|
|-------------|----------------------------------------|
|application|你的app对象|
|launchOptions|一个指示app启动原因的字典(如果有)。这个字典也可能是空的在用户直接点击图标启动的情况下。例如当程序关闭,并且有推送消息过来的时候,通过点击推送打开app这个字典就包含推送过来的消息内容| -
返回值
如果app不能处理URL资源或者继续用户活动,就会返回NO,否则返回YES。如果app是通过远程推送启动的,那么这个返回值会被忽略。 -
讨论
使用这个方法(包括与其相关的application: willFinishLaunchingWithOptions:
)用于完成app的初始化和一些微调。这个方法在状态复位的时候调用,但是发生在app的window和其他UI展现之前。在某些情况下,当这个方法返回值之后,系统会调用其他的代理方法。(当用户进入前台状态或者后台状态的情况)。
如果你没有在application: willFinishLaunchingWithOptions:
中处理launchOptions里面的key值,那么这个方法是你最后能够处理的地方。也就是说,你应该在这里对launchOptions里面的值提供合适的响应。 -
注意
在UIApplicationDelegate中还有一个方法叫做:
-(void)applicationDidFinishLaunching:(UIApplication *)application;
当程序初始化的时候,强烈建议去使用:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
or
-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
那个applicationDidFinishLaunching:
方法是个老版本iOS上使用的。
2 applicationWillResignActive:
它带参是这样的:
-(void)applicationWillResignActive:(UIApplication *)application {
}
告诉代理,app将要成为不活跃状态。
-
先看看它的自带的注释:当在程序将要从active状态到inactive状态的时候,会发(diao)送(yong)这个消(fang)息(fa)。这个发生的场景是程序被临时的打扰,例如打过来的电话或者是SMS信息。比如现在有电话进来,将会调用这个方法,还有就是有短信过来,然后你点击短信(3D touch)但是不进入程序的时候,也会去调用。或者是当用户退出程序,它开始转换到background state的时候。当app处于inactive状态的时候,它是继续运行的,但是不处理任何进来的事件响应。
-
讨论
你应该使用这个方法去暂停正在进行的任务、禁用timers、减小OpenGLES 帧速率。游戏的话需要使用这个方法来暂停游戏。在将要到active状态或者background状态的时候,inactive状态的app应该做最少的工作。
如果app使用了没有保存的用户数据,你应该在这个方法里面保存它确保它不丢失。然而,苹果还是强烈建议在合适的时间去保存你的数据。千万不要依赖特定的app状态来保存用户的data。
3 applicationDidEnterBackground:
它带参数是这样:
-(void)applicationDidEnterBackground:(UIApplication *)application {
}
告诉代理,app当前已经处于background(后台)。
-
先看看它自带的注释:使用这个方法释放公共资源、保存用户数据、取消定时器。并尽量存储应用程序状态信息,这样万一应用程序被终止了,将来可以恢复到当前状态。如果app支持在后台运行,那么用户退出时会调用这个方法而不是applicationWillTerminate方法。
-
讨论
除了这里面可以执行已经进入后台的操作,app还发出了一个UIApplicationDidEnterBackgroundNotification通知,因此如果有的类或者对象需要关注这个状态改变,可以去接收这个通知处理。
4 applicationWillEnterForeground:
它带参数是这样的:
-(void)applicationWillEnterForeground:(UIApplication *)application {
}
告诉代理,app将要进入前台。
-
先看看自带注释:这个方法会在应用程序从后台运行状态转换到活动状态的过程中被调用,可以在这里恢复应用程序正常运行所需信息。
-
讨论
这里也有一个UIApplicationWillEnterForegrounNotification的通知。
5 applicationDidBecomeActive:
它带参数是这样的:
-(void)applicationDidBecomeActive:(UIApplication *)application {
}
告诉代理,app已经成为active状态。
-
先看看自带注释:重启应用程序在非活动状态时被暂停(或尚未启动)的任务。如果程序之前在后台运行,那么可以选择是否刷新用户界面。
-
讨论
当打电话的时候,程序会调用applicationWillResignAction:
方法,当挂断电话之后,程序会调用此方法。
同样也有一个UIAppicationDidBecomeActiveNotification通知。
6 applicationWillTerminate:
它带参数是这样的:
-(void)applicationWillTerminate:(UIApplication *)application {
}
告诉代理方法,app将要终止。
-
先看看自带注释:程序将要终止时会调用该方法。尽可能保存需要的数据。
-
讨论
这里面也有一个通知:UIApplicationWillTerminateNotification。
方法执行顺序
这里没有列出所有的方法,只是最常用的几个方法。
1 当我们第一次打开程序的时候,执行结果如下:
2016-11-08 17:56:57.670768 CategoriesDemo[3722:737434] application:didFinishLaunchingWithOptions:
2016-11-08 17:56:57.675868 CategoriesDemo[3722:737434] applicationDidBecomeActive:
2 当程序进入后台的时候,执行结果如下:
2016-11-08 17:59:46.082466 CategoriesDemo[3722:737434] applicationWillResignActive:
2016-11-08 17:59:46.607901 CategoriesDemo[3722:737434] applicationDidEnterBackground:
3 当程序进入前台的时候,执行结果如下:
2016-11-08 18:00:27.726073 CategoriesDemo[3722:737434] applicationWillEnterForeground:
2016-11-08 18:00:28.143117 CategoriesDemo[3722:737434] applicationDidBecomeActive:
4 当有电话进来的时候(程序在前台的时候),执行结果如下:
2016-11-08 18:03:29.891976 CategoriesDemo[658:224868] applicationWillResignActive:
5 当挂掉电话的时候,执行结果如下:
2016-11-08 18:03:35.344466 CategoriesDemo[658:224868] applicationDidBecomeActive:
这里插一句:也就是当程序在前台的时候,来电话,会执行applicationWillResignActive:
方法。当电话挂掉时候,就会执行applicationDidBecomeActive:
方法。
总结
1 应用程序运行状态有以下几种:
- Not running (app没有启动或者已经启动但是被系统终结)
- Inactive(app在前台,但是当前没有接收事件)
- Active (app正在前台运行并且接收事件)
- Background (app在后台,执行代码)
- Suspended (app在后台,但是没有执行的代码)