一、程序的启动过程
1.程序一启动是先要进入main函数的,main函数是程序的默认入口。
/**
* 程序的入口函数
*/
int main(int argc, char * argv[]) {
@autoreleasepool {
/**
* 此函数会创建一个隐式的application对象
*
* @param argc 用户传入的参数个数
* @param argv 封装了用户传入的多个参数
* @param nil 应用程序类,传nil表示用系统默认的应用程序类
* @param class 应用程序类的代理类 可以自定义 比如:[MYAppDelegate class]
*/
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
PS;
在这个方法里主要完成以下事情
1.
创建UIApplication对象
创建Appdelegate对象,并且成为UIApplication对象的代理属性。
开启主运行循环:目的让程序一直跑起来,监听用户操作和相应事件的调度。主运行循环一旦进入就会创建自动释放池。
加载info.plist文件,判断下info.plist文件里面指定的内容。
假如info.plist里指定了main.storyboard加载main.storyboard。
2-1:指定了main.storyboard的情况
先初始化窗口UIWindow。
然后加载storyboard文件,创建箭头指定的控制器。
把新创建的控制器作为窗口的根控制器,让窗口实现。
类似下面的实现的代码:
UIStoryboard* story = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
[story instantiateInitialViewController];
//启动完毕之后调用下面的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullableNSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);
2-2:没有指定main.storyboard的情况
//启动完毕之后调用下面的方法
//需要在这个方法里指定窗口和窗口的根控制器。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);
启动过程如下:
二、application对象的代理对象
#import "AppDelegate.h"
#import "MYViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface AppDelegate ()
@property (nonatomic, strong) AVAudioPlayer *player;
@end
@implementation AppDelegate
/**
* 应用程序一共包括如下几种状态
1、not running 未运行
2、Inactive 未活动 不接受触碰事件
3、active 活动 这是在前台时所处的正常状态
4、Background 后台
5、Suspended 挂起
*
*/
#pragma mark - 程序启动时调用
//1、应用程序将要启动时自动调用该方法,该方法是应用程序启动时第一次执行自定义代码的机会
-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
//检测应用程序的状态
/**
*
typedef NS_ENUM(NSInteger, UIApplicationState) {
UIApplicationStateActive,//活动状态
UIApplicationStateInactive,//未活动状态
UIApplicationStateBackground//后台状态
} NS_ENUM_AVAILABLE_IOS(4_0);
*
*/
UIApplicationState state = [UIApplication sharedApplication].applicationState;
NSLog(@"1state = %ld",(long)state);
return YES;
}
//2、应用程序启动时自动调用该方法,开发者可以在该方法中执行初始化相关的代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
/**
* 检测应用程序的状态
*/
UIApplicationState state = [UIApplication sharedApplication].applicationState;
NSLog(@"2state = %ld",(long)state);
//如果不指定storyboard文件的话就没有window对象和根视图控制器 需要在这里创建
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
//创建根控制器,实际开发中还需要标签控制器绑定导航控制器,导航控制器绑定视图控制器
MYViewController * vc = [[MYViewController alloc] init];
self.window.rootViewController = vc;
//设置并显示主window
[self.window makeKeyAndVisible];
return YES;
}
#pragma mark - 程序进入前台时调用
//3、应用在转入前台并进入活动状态时调用该方法,可重写该方法执行最后的准备工作(启动--前台 后台--前台)
- (void)applicationDidBecomeActive:(UIApplication *)application {
/**
* 检测应用程序的状态
*/
UIApplicationState state = [UIApplication sharedApplication].applicationState;
NSLog(@"3state = %ld",(long)state);
}
#pragma mark - 程序将要从前台离开
//4、应用正要从前台运行状态离开时将会调用该方法
- (void)applicationWillResignActive:(UIApplication *)application {
/**
* 检测应用程序的状态
*/
UIApplicationState state = [UIApplication sharedApplication].applicationState;
NSLog(@"4state = %ld",(long)state);
NSURL *url = [[NSBundle mainBundle] URLForResource:@"后台播放.mp3" withExtension:nil];
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[player prepareToPlay];
// 无限播放
player.numberOfLoops = -1;
_player = player;
//进入后台播放
[player play];
}
//5、应用来到Background状态,且随时可进入Suspended状态时将会调用该方法
- (void)applicationDidEnterBackground:(UIApplication *)application {
/**
* 检测应用程序的状态
*/
UIApplicationState state = [UIApplication sharedApplication].applicationState;
NSLog(@"5state = %ld",(long)state);
}
#pragma mark - 程序从后台进入前台时调用
//6、程序正从后台转入前台(启动时不会调用)运行状态,但暂时还没有达到Active状态时将会调用该方法
- (void)applicationWillEnterForeground:(UIApplication *)application {
/**
* 检测应用程序的状态
*/
UIApplicationState state = [UIApplication sharedApplication].applicationState;
NSLog(@"6state = %ld",(long)state);
//进入前台停止播放
[_player stop];
}
#pragma mark - 程序停止时调用
//7、应用程序将要被终止时调用该方法,如果应用当前处在Suspended状态,此方法将不会被调用
- (void)applicationWillTerminate:(UIApplication *)application {
/**
* 检测应用程序的状态
*/
UIApplicationState state = [UIApplication sharedApplication].applicationState;
NSLog(@"7state = %ld",(long)state);
}
@end
参考文章:
1、UIApplication深入研究 - pengyingh - 博客园
2、iOS中的程序的五种状态 - [[XXXXalloc]init] - 博客园