每一个程序在运行期必须有且仅有一个 UIApplication(或则其子类)的一个实例。在程序开始运行的时候,UIApplicationMain 函数是程序进入点,这个函数做了很多工作,其中一个重要的工作就是创建一个 UIApplication 的单例实例。在你的代码中你,你可以通过调用 [UIApplication sharedApplication] 来得到这个单例实例的指针。

    UIApplication 的一个主要工作是处理用户事件,它会起一个队列,把所有用户事件都放入队列,逐个处理,在处理的时候,它会发送当前事件 到一个合适的处理事件的目标控件。此外,UIApplication 实例还维护一个在本应用中打开的 window 列表(UIWindow 实例),这样它就 可以接触应用中的任何一个 UIView 对象。UIApplication 实例会被赋予一个代理对象,以处理应用程序的生命周期事件(比如程序启动和关闭)、系统事件(比如来电、记事项警告)等等。

    一个 UIApplication 可以有如下几种状态:

    • 程序没启动
    • Inactive(未激活)程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态
    • Active(激活)程序在前台运行而且接收到了事件。这也是前台的一个正常的模式
    • 程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

    常见的代理方法有

    1. (void)applicationWillResignActive:(UIApplication *)application

      说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了

    2. (void)applicationDidBecomeActive:(UIApplication *)application

    3. (void)applicationDidEnterBackground:(UIApplication *)application

      说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可

    4. (void)applicationWillTerminate:(UIApplication *)application

      说明:当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要设置 UIApplicationExitsOnSuspend 的键值。

    5. (void)applicationDidReceiveMemoryWarning:(UIApplication *)application

    6. (void)applicationSignificantTimeChange:(UIApplication*)application

      说明:当系统时间发生改变时执行

    7. 说明:当程序载入后执行

    下面是一个用于展示整个 App 生命周期的示意图:

    参考资料: