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可处理的事件包括:应用程序的生命周期事件(如程序启动和关闭)、系统事件(如来电)
应用程序的状态
iOS的应用程序一共有5种状态。
· Not running(未运行):程序未启动
· Inactive(未激活):其他两个状态切换时出现的短暂状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时或者系统提示用户去响应Alert窗口(如来电、信息)时
· Active(激活):在屏幕上显示的正常运行状态,该状态下可以接收用户输入并更新显示
· Background(后台):程序在后台且能执行代码。用户按下Home键不久后进入此状态(先进入了Inactive状态,再进入Background状态),然后会迅速进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Background状态
· Suspended(挂起):程序在后台不能执行代码。普通程序在进入Background状态不久后就会进入此状态。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存
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:[email protected][email protected],[email protected]&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"]];