App启动逻辑
应用启动时,会先进入main函数,main函数是整个应用的入口。内部会调用UIApplicationmain函数,该函数会创建UIApplication对象以及UIApplication的代理APPDelegate,并且会开启消息循环(程序不死的原因),当监听到有系统事件时,就会通知Appdelegate做处理。每个应用都有自己的UIApplication,他是一个单例,可以通过【UIApplication shareapplication】获取到他,利用该对象可以进行一些系统级别的操作。启动完毕会用didFinishlaunch方法,在这个方法中,创建UIWindow,给window赋值属性,以及设置根视图。如果是storyboard,会根据info.plist中找对应的程序入口storyboard指向的vc,显示窗口。(storyboard 和xib最大的区别在于,stroyboard是基于控制器的,而非视图或窗口)
具体执行流程
-
程序入口
进入main函数,设置AppDelegate称为函数的代理 -
程序完成加载
[AppDelegate application:didFinishLaunchingWithOptions:] -
创建window窗口
-
程序被激活
[AppDelegate applicationDidBecomeActive:] -
当点击command+H时(针对模拟器,手机是当点击home键)
程序取消激活状态
[AppDelegate applicationWillResignActive:];
程序进入后台
[AppDelegate applicationDidEnterBackground:]; -
点击进入工程
程序进入前台
[AppDelegate applicationWillEnterForeground:]
程序被激活
[AppDelegate applicationDidBecomeActive:];
分析
对于applicationWillResignActive(非活动)与applicationDidEnterBackground(后台)这两个的区别
-
applicationWillResignActive(非活动):
比如当有电话进来或短信进来或锁屏等情况下,这时应用程序挂起进入非活动状态,也就是手机界面还是显示着你当前的应用程序的窗口,只不过被别的任务强制占用了,也可能是即将进入后台状态(因为要先进入非活动状态然后进入后台状态) -
applicationDidEnterBackground(后台):
指当前窗口不是你的App,大多数程序进入这个后台会在这个状态上停留一会,时间到之后会进入挂起状态(Suspended)。如果你程序特殊处理后可以长期处于后台状态也可以运行。
Suspended (挂起): 程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。
applicationWillResignActive(非活动)
该函数里面主要执行操作:
a . 暂停正在执行的任务
b. 禁止计时器
c. 减少OpenGL ES帧率
d. 若为游戏应暂停游戏
applicationDidEnterBackground(已经进入后台)
该方法用来:
a. 释放共享资源
b. 保存用户数据(写到硬盘)
c. 作废计时器
d. 保存足够的程序状态以便下次修复;
applicationWillTerminate
程序即将退出时调用。记得保存数据