iOS程序启动顺序
1 程序入口
进入main函数 设置AppDelegate成为函数的代理
2 程序完成加载
[AppDelegate application:didFinishLaunchingWithOptions:]
3 创建Window窗口
4 程序被激活
[AppDelegate applicationDidBecomeActive:]
5 进入后台
5-1 程序取消激活状态
[AppDelegate applicationWillResignActive:]
5-2 程序进入后台
[AppDelegate applicationDidEnterBackground:]
6 点击进入工程
6-1 程序进入前台
[AppDelegate applicationWillEnterForeground:]
6-2 程序被激活
[AppDelegate applicationDidBecomeActive:]
对于applicationWillResignActive(非活动的)和applicationDidEnterBackground(后台的)区别
applicationWillResignActive(非活动的)
比如有短信或者电话或者锁屏的时候 这时候程序进入非活动状态 也就是手机界面还是你当前应用程序的窗口 只不过被别的应用占用了 也可能是即将进入后台的状态(因为要先进入非活动状态 再进入后台)
applicationDidEnterBackground(后台的)
是指当前的窗口不是你的App 大多数程序进入后台在这个状态需要停留一会 到挂起状态(suspended) 如果程序处理 可以长期进入后台状态 比如后台定位 网络电话等
suspended(挂起)
程序进入后台不能执行代码 系统自动会执行这个状态 而且不会发通知 当挂起时 程序还在内存中 当系统内存低的时候 系统就会把挂起的程序清除掉 为前台提供更多的内存
UIApplicationMain函数解释
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
argc和argv是为了和C语言保持一致
principalClassName 主要类名 delegateClassName 代理类名
如果principalClassName设置为nil 它就会从info.plist文件里面取 如果info.plist文件没有 默认就是UIApplication 只负责监听程序的生命周期 他只负责监听 剩下的交给delegateClass
delegateClass将在工程新建时 实例化对象
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"--- %s ---",__func__);//__func__打印方法名
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"--- %s ---",__func__);
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"--- %s ---",__func__);
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"--- %s ---",__func__);
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"--- %s ---",__func__);
}
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
NSLog(@"--- %s ---",__func__);
}
- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"--- %s ---",__func__);
}
打印调用顺序
启动程序
--- -[AppDelegate application:didFinishLaunchingWithOptions:] ---
--- -[AppDelegate applicationDidBecomeActive:] ---
进入后台
--- -[AppDelegate applicationWillResignActive:] ---
--- -[AppDelegate applicationDidEnterBackground:] ---
进入程序
--- -[AppDelegate applicationWillEnterForeground:] ---
--- -[AppDelegate applicationDidBecomeActive:] ---
内存警告
--- -[AppDelegate applicationDidReceiveMemoryWarning:] ---
分析
1 [AppDelegate application:didFinishLaunchingWithOptions:]
程序完成启动的时候执行 一般会在这个函数创建window 呈现给客户
2 [AppDelegate applicationWillResignActive:](非活动的)
程序将要失去active调用 比如有电话进来等
该函数执行
暂时正在执行的任务
禁止计时器
游戏暂停
3 [AppDelegate applicationDidEnterBackground:] (已经进入后台)对应的是 [AppDelegate applicationDidBecomeActive:](已经进入前台)
1 释放共享资源
2 保存用户数据
3 作废定时器
4 [AppDelegate applicationWillEnterForeground:]即将进入前台 对应的是 [AppDelegate applicationWillResignActive:] 即将进入后台
5 [AppDelegate applicationDidBecomeActive:]已经进入前台 对应的是 [AppDelegate applicationDidEnterBackground:]已经进入后台
6 [AppDelegate applicationDidReceiveMemoryWarning:]
程序即将退出时调用 需要保存数据