程序启动及程序的生命周期
来源:互联网 发布:三端口环行器 编辑:程序博客网 时间:2024/05/16 17:43
一、程序的启动过程
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] - 博客园
0 0
- 程序启动及程序的生命周期
- iOS程序的启动执行顺序 AppDelegate 及 UIViewController 的生命周期
- iOS程序的启动执行顺序 AppDelegate 及 UIViewController 的生命周期
- 小程序的生命周期及运行机制
- iOS-关于应用/视图的生命周期及程序启动原理小结
- iOS程序的启动过程和应用程序生命周期
- android 程序的生命周期
- iphone程序的生命周期
- iPhone程序的生命周期
- Android程序的生命周期
- Windows程序的生命周期
- iOS程序的生命周期
- iOS 程序的生命周期
- iOS程序的生命周期
- Windows程序的生命周期
- UI01程序的生命周期
- 【UI】程序的生命周期
- Java程序的生命周期
- java中的堆和栈
- 【WWDC2016 Session】iOS 10 推送Notification新特性
- USB 2.0 A型、B型、Mini和Micro接口 type-c 定义及封装
- MySQL创建Function时报错误码1418的解决方案
- count(*)和count(1)的区别
- 程序启动及程序的生命周期
- android key 事件派发
- 面向对象基础
- HDU1074-Doing Homework
- thymeleaf使用基础教程
- c#开发-计算一段程序运行的时间
- 第34课:在IDEA中开发Spark实战
- QGroundControl笔记 —— 界面启动
- OC - 网络图片压缩,获取网络图片尺寸