UIApplication代理方法

来源:互联网 发布:mac应用程序不能打开 编辑:程序博客网 时间:2024/06/03 20:23

UIApplication的核心作用是提供了iOS程序运行期间的控制和协作工作。

每一个程序在运行期必须有且仅有一个UIApplication(或则其子类)的一个实例。回想一下我在前面的文章“main函数研究”的文章中提到的main函数的代码,可以看出,在程序开始运行的时候,UIApplicationMain函数是程序进入点,这个函数做了很多工作,其中一个重要的工作就是创建一个UIApplication的单例实例。在你的代码中你,你可以通过调用[UIApplication sharedApplication]来得到这个单例实例的指针。

UIApplication的一个主要工作是处理用户事件,它会维护一个队列,把所有用户事件都放入队列,逐个处理,在处理的时候,它会发送当前事件到一个合适的处理事件的目标控件。此外,UIApplication实例还维护一个在本应用中打开的window列表(UIWindow实例),这样它就可以接触应用中的任何一个UIView对象。UIApplication实例会被赋予一个代理对象,以处理应用程序的生命周期事件(比如程序启动和关闭)、系统事件(比如来电、记事项警告)等等。

新建一个任意类型的iOS应用工程,在ClassPrefix输入是TC,我们可以看到工程中生成一个类:

TCAppDelegate:UIResponder <UIApplicationDelegate>

这里这个类的基类是UIResponder,和4.2以前生成的工程是不同的,以前是继承自NSObject。不论如何,本类实现了一个名叫UIApplicationDelegate的接口,这个表明这个类就是这个工程中UIApplication实例的代理类。

在main函数中,

 

@autoreleasepool {

     return UIApplicationMain(argc,argv, nil,NSStringFromClass([TCAppDelegateclass]));

    }

这里传入了代理类到UIApplicationMain函数中,UIApplicationMain函数在生成唯一个UIApplication的时候就可以把代理类的实例指针告诉这个单例对象了。

 

可以通过如下代码获UIApplication代理对象:

TCAppDelegate *myDelegate =(TCAppDelegate *)[UIApplication sharedApplication].delegate;

 

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

 

UIApplicationDelegate Event-Handling Methods

Method Signature

1:application:didChangeStatusBarFrame:

- (void)application:(UIApplication*)applicationdidChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame

2:application:didChangeStatusBarOrientation:

- (void)application:(UIApplication*)applicationdidChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation

3:application:handleOpenURL:

- (BOOL)application:(UIApplication*)applicationhandleOpenURL:(NSURL*)url

4:application:willChangeStatusBarOrientation:duration:

- (void)application:(UIApplication*)applicationwillChangeStatusBarOrientation:

(UIInterfaceOrientation)newStatusBarOrientation
duration:(NSTimeInterval)duration

5:application:willChangeStatusBarFrame

- (void)application:(UIApplication)applicationwillChangeStatusBarFrame:(CGRect)newStatusBarFrame

6:applicationDidBecomeActive:

- (void)applicationDidBecomeActive:(UIApplication*)application

7:applicationDidFinishLaunching:

-(void)applicationDidFinishLaunching:(UIApplication*)application

8:applicationDidReceiveMemoryWarning:

-(void)applicationDidReceiveMemoryWarning:(UIApplication*)application

9:applicationSignificantTimeChange:

-(void)applicationSignificantTimeChange:(UIApplication*)application

10:applicationWillResignActive:

- (void)applicationWillResignActive:(UIApplication*)application

11:applicationWillTerminate:

- (void)applicationWillTerminate:(UIApplication*)application

 

1. – (void)applicationDidFinishLaunching:(UIApplication *)application;
此方法基本已经弃用,改用第2个方法代替。
2. – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);
当应用程序启动时(不包括已在后台的情况下转到前台),调用此回调。launchOptions是启动参数,假如用户通过点击push通知启动的应用,这个参数里会存储一些push通知的信息。

3. – (void)applicationDidBecomeActive:(UIApplication *)application;
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
当应用程序全新启动,或者在后台转到前台,完全激活时,都会调用这个方法。如果应用程序是以前运行在后台,这时可以选择刷新用户界面。

4. – (void)applicationWillResignActive:(UIApplication *)application;
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
当应用从活动状态主动到非活动状态的应用程序时会调用这个方法。这可导致产生某些类型的临时中断(如传入电话呼叫或SMS消息)。或者当用户退出应用程 序,它开始过渡到的背景状态。使用此方法可以暂停正在进行的任务,禁用定时器,降低OpenGL ES的帧速率。游戏应该使用这种方法来暂停游戏。
调用时机可能有以下几种:锁屏,按HOME键,下接状态栏,双击HOME键弹出低栏,等情况。

5. – (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;
// Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:
这个方法已不再支持,可能会在以后某个版本中去掉。建议用下面第6个方法代替

6. – (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation NS_AVAILABLE_IOS(4_2);
// no equiv. notification. return NO if the application can’t open for some reason
当用户通过其它应用启动本应用时,会回调这个方法,url参数是其它应用调用openURL:方法时传过来的。

7. – (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;
// try to clean up as much memory as possible. next step is to terminate app
当应用可用内存不足时,会调用此方法,在这个方法中,应该尽量去清理可能释放的内存。如果实在不行,可能会被强行退出应用。

8. – (void)applicationWillTerminate:(UIApplication *)application;
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
当应用退出,并且进程即将结束时会调到这个方法,一般很少主动调到,更多是内存不足时是被迫调到的,我们应该在这个方法里做一些数据存储操作。

9. // one of these will be called after calling -registerForRemoteNotifications
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0);
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0);
当客户端注册远程通知时,会回调上面两个方法。
如果成功,则回调第一个,客户端把deviceToken取出来发给服务端,push消息的时候要用。
如果失败了,则回调第二个,可以从error参数中看一下失败原因。
注:注册远程通知使用如下方法:

UIRemoteNotificationType t=UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound;[[UIApplication sharedApplication] registerForRemoteNotificationTypes:t];

10. – (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo NS_AVAILABLE_IOS(3_0);
当应用在前台运行中,收到远程通知时,会回调这个方法。
当应用在后台状态时,点击push消息启动应用,也会回调这个方法。
11. – (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification NS_AVAILABLE_IOS(4_0);
当应用收到本地通知时会调这个方法,同上面一个方法类似。
如果在前台运行状态直接调用,如果在后台状态,点击通知启动时,也会回调这个方法
本地通知可见另一篇文章:http://bluevt.org/?p=70

12. – (void)applicationDidEnterBackground:(UIApplication *)application NS_AVAILABLE_IOS(4_0);
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
当用户从台前状态转入后台时,调用此方法。使用此方法来释放资源共享,保存用户数据,无效计时器,并储存足够的应用程序状态信息的情况下被终止后,将应用 程序恢复到目前的状态。如果您的应用程序支持后台运行,这种方法被调用,否则调用applicationWillTerminate:用户退出。

13. – (void)applicationWillEnterForeground:(UIApplication *)application NS_AVAILABLE_IOS(4_0);
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
当应用在后台状态,将要进行动前台运行状态时,会调用此方法。
如果应用不在后台状态,而是直接启动,则不会回调此方法

 

iPhone中的应用程序很容易受到打扰,比如一个来电可能导致应用程序失去焦点,如果这个时候接听了电话,那么应用程序会转到后台运行。还有很多其它类似的事件会导致iPhone应用程序失去焦点,在应用程序失去焦点前会调用委托类的applicationWillResignActive()方法,而应用程序再次获取到焦点的时候会调用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;如果用户选择处理,则跳转到 step 8;

step 8,进入 UIApplicationDelegate 的
- (void)applicationWillTerminate:(UIApplication *)application;
当前应用程序关闭。



下面是这个类的一些功能:

 

1.设置icon上的数字图标

 

   //设置主界面icon上的数字图标,在2.0中引进, 缺省为0

  [UIApplicationsharedApplication].applicationIconBadgeNumber =4;

2.设置摇动手势的时候,是否支持redo,undo操作

 

    //摇动手势,是否支持redoundo操作。

  //3.0以后引进,缺省YES

  [UIApplicationsharedApplication].applicationSupportsShakeToEdit =YES;


3.判断程序运行状态

 

   //判断程序运行状态,在2.0以后引入

    

  if([UIApplicationsharedApplication].applicationState ==UIApplicationStateInactive){

       NSLog(@"程序在运行状态");

    }


4.阻止屏幕变暗进入休眠状态

 

   //阻止屏幕变暗,慎重使用,缺省为no2.0

  [UIApplicationsharedApplication].idleTimerDisabled =YES;

慎重使用本功能,因为非常耗电。

5.显示联网状态

 

   //显示联网标记 2.0

  [UIApplicationsharedApplication].networkActivityIndicatorVisible =YES;


6.在map上显示一个地址

  NSString* addressText =@"1 Infinite Loop,Cupertino, CA 95014";

  // URL encode the spaces

   addressText = [addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

  NSString* urlText = [NSStringstringWithFormat:@"http://maps.google.com/maps?q=%@",addressText];

    

  [[UIApplicationsharedApplication]openURL:[NSURLURLWithString: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 =[emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    

  [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:email]];


8.打电话到一个号码


  // Call Google 411

  [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];


9.发送短信

  // Text to Google SMS

[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];


10.打开一个网址


  // Lanuch any iPhone developers favsite

  [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];


参考 http://yanwt.iteye.com/blog/1933932

参考 http://blog.csdn.net/likendsl/article/details/7352935


0 0
原创粉丝点击