UIApplication 生命周期、作用、功能

UIApplication作用
UIApplication的核心作用是提供了iOS程序运行期间的控制和协作工作。
每一个程序在运行期必须有且仅有一个UIApplication(或则其子类)的一个实例。在程序开始运行的时候,UIApplicationMain函数是程序进入点,这个函数做了很多工作,其中一个重要的工作就是创建一个UIApplication的单例实例。在你的代码中,你可以通过调用[UIApplication sharedApplication]来得到这个单例实例的指针。
UIApplication的一个主要工作是处理用户事件,它会维护一个队列,把所有用户事件都放入队列,逐个处理,在处理的时候,它会发送当前事件到一个合适的处理事件的目标控件。此外,UIApplication实例还维护一个本应用中打开的window列表(UIWindow实例),这样它就可以接触应用中的任何一个UIView对象。UIApplication实例会被赋予一个代理对象,以处理应用程序的生命周期事件(比如程序启动和关闭)、系统事件(比如来电、记事项警告)等等。


启动原理

1.在main.m的main函数中执行了UIApplicationMain这个方法,这是iOS程序的入口点
2.intUIApplicationMain(intargc,char*argv[], NSString *principalClassName, NSString *delegateClassName) 
 argc、argv:ISO C标准main函数的参数,直接传递 给UIApplicationMain进行相关处理即可 
3.principalClassName:指定应用程序类,该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值
4.delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议
5.UIApplicationMain函数会根据principalClassName创建UIApplication对象,根据delegaClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性。
6.UIApplication对象会依次给delegate对象发送不同的消息,接着会建立应用程序的main runloop(事件循环),进行事件的处理(首先会调用delegate对象的application:didFinishLaunchingWithOptions:)
7.如果设置了主xib文件(在Info.plist中指定,key是NSMainNibFile),就会在主xib文件中寻找UIApplication和连接它的delegate。因此在主xib文件中,File's Owner必须为UIApplication(或其子类),并且建立一个遵守UIApplicationDelegate的delegate对象,建立UIApplication和delegate对象的关联关系
8.UIApplication试试应用程序的核心,每一个程序在运行必须有UIApplication(或子类)的一个实例(有且仅有一个),通过[UIApplication sharedApplication]可以得到这个单例实例的指针
9.UIApplication帮助管理应用程序的生命周期,而它通过delegate来履行这个任务
10.UIApplication可以接收事件,把所有用户事件都放入队列,逐个处理,它会发送当前事件给一个合适的目标控件进行处理。它还将部分事件转给delegate对象来处理,delegate可处理的事件包括:应用程序的生命周期事件(如程序启动和关闭)、系统事件(如来电)
图1.png

应用程序的状态

iOS的应用程序一共有5种状态。

· Not running(未运行):程序未启动
· Inactive(未激活):其他两个状态切换时出现的短暂状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时或者系统提示用户去响应Alert窗口(如来电、信息)时
· Active(激活):在屏幕上显示的正常运行状态,该状态下可以接收用户输入并更新显示
· Background(后台):程序在后台且能执行代码。用户按下Home键不久后进入此状态(先进入了Inactive状态,再进入Background状态),然后会迅速进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Background状态
· Suspended(挂起):程序在后台不能执行代码。普通程序在进入Background状态不久后就会进入此状态。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存
图2.png

UIApplicationDelegate的方法

在UIApplication接收到系统事件和生命周期事件时,会把相应的事件传递给UIApplicationDelegate进行处理,下表所列的生命周期函数大都是可选的,但为了应用程序的健壮性程序员应该实现它们。

1、 - (void)applicationWillResignActive:(UIApplication*)application
说明:当应用程序将要进入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了。
2、-(void)applicationDidBecomeActive:(UIApplication *)application
说明:当应用程序进入活动状态执行,这个刚好和上面的那个方法相反
3、-(void)applicationDidEnterBackground:(UIApplication*)application
说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可。
4、 -(void)applicationWillEnterForeground:(UIAppliaction*)application
说明:当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
5、 -(void)applicationWillTerminate:(UIApplication *)application
说明:当程序将要退出时调用,通常是用来保存数据和一些推出前的清理工作。这个需要设置UIApplicationExitsOnSuspend的键值。
6、 -(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
说明:iPhone设置只有有限的内存,如果为应用程序分配了太多的内存操作系统会终止应用程序的运行,在终止前会执行这个方法,通常可以在这里进行内存清理工作防止程序被终止
7、 -(void)applicationSignificantTimeChange:(UIApplication*)application
说明:当系统时间发生改变时执行
8、 -(void)applicationDidFinishLaunching:(UIApplication*)application
说明:当程序载入后执行
9、 -(void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
说明:当StatusBar将要改变时执行
10、 -(void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration
说明:当StatusBar框方向将要变化时执行
11、 -(void)application:(UIApplication*)application handleOpenURL:(NSURL *)url
说明:当通过URL执行
12、 -(void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
说明:当StatusBar框方向变化完成后执行
13、 -(void)application:(UIApplication *)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame
说明:当StatusBar框变化完成后执行
iPhone中的应用程序很容易收到打扰,比如一个来电可能导致应用程序失去焦点,如果这个时候接
听了电话,那么应用程序会转到后台运行。还有很多其它类似的事件会导致iPhone应用程序失去焦
点,在应用程序失去焦点前会调用委托类的applicationWillResignAction()方法,而应用程
序再次获取到焦点的时候会调用applicationDidBecomeActive()方法。比如在运行应用程序的
时候锁屏会调用委托类的applicationWillResignActive()方法,而当屏幕被解锁的时候,又
会调用applicationDidBecomeActive()方法。

另外一个非常重要的方法就是applicationDidReceiveMemoryWarning(),因为iPhone设备
只有有限的内存,如果为应用程序分配了太多内存操作系统会终止应用程序的运行,但在终止之前操
作系统会通过先调用委托类的applicationDidReceiveMemoryWarning()方法警告应用程序,
在UIApplication接收到这个事件后它会传递给委托类的
applicationDidReceiveMemoryWarning()方法,委托类在这个方法内可以进行释放内存的操
作以防止操作系统强制终止应用程序的运行。

UIApplication的周期关键性步骤:

step 1:点击app icon或者从应用程序url(比如是Safari地址栏中输入应用程序url)启动应用程序
step 2:就会进入UIApplicationDelegate的
-(void)applicationDidFinishLaunching:(UIApplication*)application或
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

step 3:如果是从url启动的则进入UIApplicationDelegate的
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
然后在跳转到step 4;否则直接跳转都step 4
step 4:进入UIApplicationDelegate的-(void)applicationDidBecomeActive:(UIApplication *)application
step 5:进入应用程序主循环,这时应用程序已经是活动的了,用户可以与应用程序交互。
step 6:在step 5状态下,如果按住home键或者进行任务切换操作,然后跳转到step 8;
step 7:在step 5状态下,应用程序被中断(如来电,来短信),进入UIApplicationDelegate
的-(void)applicationWillResignActive:(UIApplication *)application
如果用户选择不处理继续留在当前应用程序,则回到step 4;如果用户选择处理,则跳转到step8。
step 8:进入UIApplicationDelegate的
-(void)applicationWillTerminate:(UIApplication *)application;
当前应用程序关闭

UIApplication类的一些功能

1.设置icon上的数字图标
// 设置主界面icon上的数字图标,在2.0中引进,缺省为0
[UIApplication sharedApplication].applicationIconBadgeNumber  = 4;
2.设置摇动手势的时候,是否支持redoundo操作。
// 3.0以后引进,缺省YES
[UIApplication sharedApplication].applicationSupportsShakeToEdit = YES;
3.判断程序运行状态
if([UIApplication sharedApplication].applicationState == UIApplicationStateInactive){
    NSLog(@"程序正在运行状态");
}
4.阻止屏幕变暗进入休眠状态
// 阻止屏幕变暗,慎重使用,缺省为NO2.0
[UIApplication sharedApplication].idleTimerDisabled  = YES;
// 慎重使用本功能,因为非常耗电
5.显示联网状态
// 显示联网标记2.0
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
6.在map上显示一个地址
NSString *addressText    = @"llllllllllllll";
// URL encode the spaces
addressText  = [addressText stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSString* urlText = [NSStringstringWithFormat:@”http://maps.google.com/maps?q=%@“,addressText];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlText]];
7.发送电子邮件
NSString *recipients  = @”mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hellofrom California!”; 
NSString *body=@”&body=It is raining in sunnyCalifornia!”;
NSString *email= [NSStringstringWithFormat:@"%@%@", recipients, body];
email  = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]];
8.打电话到一个号码
// Call Google 411
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"]];
9.发送短信
// Text to Google SMS
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://466453"]];
10.打开一个网址
// Lanuch any iPhone developers favsite
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://itunesconnect.apple.com"]];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • iPhone应用程序是由主函数main启动,它负责调用UIApplicationMain函数,该函数的形式如下所示...
    Rickie_Lambert阅读 1,912评论 0 2
  • 部分(15) 目录(?)[+] UIApplication的核心作用是提供了iOS程序运行期间的控制和协作工作。每...
    wzf_taker阅读 331评论 0 0
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • 都说孤独的人害怕伤心,也更愿意被打动。 你的一句诺言,我却傻傻的相信了! 把自己活得太卑微...
    厌人心Y阅读 185评论 0 0