9.1.3 UIApplicationDelegate
UIApplicationDelegate是一个协议,iOS工程中创建的AppDelegate是一个满足UIApplicationDelegate协议的类。在上一节中,UIApplicationMain这个函数的最后一个传入参数是AppDelegate这个类的名称,UIKit通过这个类名创建了一个AppDelegate的实例,并用这个实例来处理应用生命周期的一些回调方法。委托模式是一种避免对复杂的UIKit类(如UIApplication)进行子类化的机制。委托模式下,开发者不必生成新的子类以及在子类中重载方法,取而代之的是将自己的定制代码放到委托的类中,通过实现协议的方式处理一些额外的事件,避免使用继承这种繁重的代码组织方式。当应用生命周期的事件发生时,AppDelegate的实例方法将会被调用,通过这种回调方式来执行一些定制代码,完成与应用生命周期相关的处理。
委托模式的目的是创建的应用程序能够快速地初始化,并且将一些回调事件传递给外部实例来执行,这是一种非常重要的设计模式。应用程序的委托对象负责处理几个关键的方法调用。现在我们可以通过源码来看UIApplicationDelegate协议中定义了些什么方法,源码声明如下:
这里列出了iOS工程中AppDelegate默认创建的六个函数,也是开发中需要使用的最为常见的回调函数。
◇ applicationDidFinishLaunching():这个方法会在iOS应用启动之后被调用,其中launchOptions是一个可空的字典。如果用户是直接点击图标启动,那么launchOptions字典内没有额外的数据。如果用户是通过外部链接打开应用(比如被其他应用唤起,或者通过消息推送打开),则launchOptions字典中键为UIApplicationLaunchOptionsURLKey的值是一个URL的实例,实例中存储外部打开应用的链接。如果是被其他应用所唤起,那么launchOptions字典中键为UIApplicationLaunchO ptionsSourceApplicationKey的值是一个String的实例,里面存放着源应用的Bundle ID。如果通过远端通知点开APP,那么字典中键为UIApplicationLaunchOptionsRemoteNotificationKey的值是一个字典,userInfo里存放着通知的信息。如果是通过本地通知点开APP,那么字典中键为UIApplicationLaunch OptionsLocalNotificationKey的值是一个UILocalNotification的实例,存放着本地通知的信息。如果启动时需要做定制化的处理,需要在这个回调函数中实现。
◇ applicationDidBecomeActive():当应用程序已经处于活跃状态时,这个方法会被调用,application是本次启动的应用实例。在这个回调中,我们可以继续之前因为退到后台而被暂停的任务。如果是从后台状态切换回来的,我们也可以进行页面刷新。
◇ applicationWillResignActive():当应用程序即将进入非活跃状态时,这个方法会被调用。一般是在用户接到电话或者收到短信,或者是用户切换到设备主页或其他应用时,会进入这个状态。在这个方法中,开发者应该将一些任务暂停。
◇ applicationDidEnterBackground():当应用程序已经退到后台时,这个方法会被调用。如果应用已经进入后台,这时应该释放应用中的资源,并且保存用户的数据以及应用的状态以备下次恢复使用。
◇ applicationWillEnterForeground():当应用程序即将从后台进入前台时,这个方法将会被调用。如果之前有些状态是在进入后台时被改变的,那么在这个方法中,可以将一些状态切换到前台状态。
◇ applicationWillTerminate():当应用即将被退出时,这个方法会被调用。一般在这个函数中进行数据保存和一些退出前的清理工作。