• [转] UIApplication、AppDelegate、委托


    转自http://blog.csdn.net/xingxing513234072/article/details/16342889

    UIApplication、AppDelegate、委托等的关系?  
    什么是委托?为什么要有委托?委托在Iphone中的实现机制是怎样的?  

    一般来说,我们创建了一个Iphone项目,默认会有这个main.m类,我们都晓得,一个main()方法代表着一个应用程序的入口,  
    以下是对应的main.m的方法体:

    [objc] view plaincopy
     
    1. int main(int argc, charchar *argv[])   
    2.  {   
    3.      @autoreleasepool {   
    4.          return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));   
    5.      }   
    6.  }   


    在上述的这个方法体中,UIApplicationMain()方法根据我们提供的AppDelegate类名称来创建UIApplication的一个实例,且将这个  
    AppDelegate作为UIApplication的委托,一般我们可以通过类方法[UIApplication shareApplication]来获取对UIApplication 
    的一个引用;  


    在UIApplication接收到系统事件和生命周期事件时,会把相应的事件传递给UIApplicationDelegate进行处理,下表所列的生命周期函数大都是可选的,  
    但为了应用程序的健壮性程序员应该实现它们。  
    1、- (void)applicationWillResignActive:(UIApplication *)application  
    说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了  


    2、- (void)applicationDidBecomeActive:(UIApplication *)application  
    说明:当应用程序入活动状态执行,这个刚好跟上面那个方法相反  


    3、- (void)applicationDidEnterBackground:(UIApplication *)application  
    说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可  


    4、- (void)applicationWillEnterForeground:(UIApplication *)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、- (BOOL)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应用程序失去焦点,在应用程序失去焦点前会调用委托类的applicationWillResignActive()方法,  
    而应用程序再次获取到焦点的时候会调用applicationDidBecomeActive()方法。  
    比如在运行应用程序的时候锁屏会调用委托类的applicationWillResignActive()方法,而当屏幕被解锁的时候,又会调用applicationDidBecomeActive()方法。  
       
    另外一个非常重要的方法就是applicationDidReceiveMemoryWarning(),因为iPhone设备只有有限的内存,如果为应用程序分配了太多内存操作系统会终止应用程序的运行,但在终止之前操作系统会通过先调用委托类的applicationDidReceiveMemoryWarning()方法警告应用程序,在UIApplication接收到这个事件后它会传递给委托类的applicationDidReceiveMemoryWarning()方法,委托类在这个方法内可以进行释放内存的操作以防止操作系统强制终止应用程序的运行。  
    下面是这个类的一些功能:  
    1.设置icon上的数字图标  
        //设置主界面icon上的数字图标,在2.0中引进, 缺省为0  
        [UIApplication sharedApplication].applicationIconBadgeNumber = 4;  
    2.设置摇动手势的时候,是否支持redo,undo操作  
        //摇动手势,是否支持redo undo操作。  
       //3.0以后引进,缺省YES  
        [UIApplication sharedApplication].applicationSupportsShakeToEdit =YES;  


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

    [objc] view plaincopy
     
    1. /*  
    2.     UIApplicationStateActive,  
    3.     UIApplicationStateInactive,  
    4.     UIApplicationStateBackground  
    5.     */   
    6.   if([UIApplication sharedApplication].applicationState ==UIApplicationStateInactive){   
    7.        NSLog(@"程序在运行状态");   
    8.    }   

    4.阻止屏幕变暗进入休眠状态  
        //阻止屏幕变暗,慎重使用,缺省为no 2.0  
        [UIApplicationsharedApplication].idleTimerDisabled =YES;  
    慎重使用本功能,因为非常耗电。  
    5.显示联网状态  
        //显示联网标记 2.0  
        [UIApplication sharedApplication].networkActivityIndicatorVisible =YES;  


    6.在map上显示一个地址

    [objc] view plaincopy
     
    1. NSString* addressText =@"1 Infinite Loop, Cupertino, CA 95014";   
    2.    // URL encode the spaces   
    3.     addressText =  [addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];   
    4.    NSString* urlText = [NSStringstringWithFormat:@"http://maps.google.com/maps?q=%@", addressText];   
    5.        
    6.     [[UIApplication sharedApplication]openURL:[NSURLURLWithString:urlText]];   

    7.发送电子邮件

    [objc] view plaincopy
     
    1. NSString *recipients =@"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello from California!";   
    2.    NSString *body =@"&body=It is raining in sunny California!";   
    3.        
    4.     NSString *email = [NSStringstringWithFormat:@"%@%@", recipients, body];   
    5.     email = [emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];   
    6.        
    7.     [[UIApplication sharedApplication]openURL:[NSURLURLWithString:email]];   

    8.打电话到一个号码  


       // Call Google 411  
        [[UIApplication sharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];  
    9.发送短信  
        // Text to Google SMS  
        [[UIApplication sharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];  
    10.打开一个网址  


       // Lanuch any iPhone developers fav site  
        [[UIApplication sharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];  




    UIApplication:一般是指运行中的应用程序,它的一个主要工作是处理用户事件,它会引起一个队列,所有的用户事件都放入到队列中,  
    逐个被处理掉,在处理的时候,它会发送事件到一个合适的处理事件的目标控件,此外,UIApplication还维护在本应用程序中打开的  
    Window列表(UIWindow实例),这样子它就可以接触应用程序中的任何一个UIView对象;  
    AppDelegate:负责为另外一个对象处理特定事件的类,比如我们load完一个页面的时候,委托就帮助UIApplication完成  
    didFinishLaunchingWithOptions动作,相应地在这个方法里面执行对应地action;  
    委托是给一个对象提供机会对另一个对象中的变化作出反映或者影响另一个对象的行为,通常包括3种动词:should、will、did  

    UIApplication委托AppDelegate,则AppDelegate必须得实现UIApplicationDelegate协议,这个协议我们可以当成是java中的一个接口,  
    协议中定义了一系列方法,我们必须在子类中将其实现,然后底层UIApplication会自动去调用我们已经定义好的方法,这有点类似java中Ioc方向控制机制  
    当然,iphone中运用委托设计模式的地方很多,比如这个UIActionSheetDelegate、UIAlertViewDelegate协议,比如我们要在自己的某个界面中展示  
    这个操作表(UIActionSheet),则我们的视图控制器必须要实现这个UIActionSheetDelegate协议,重写其中的某些方法,也就是说,谁被委托了,  
    谁就要实现协议中定义的方法,确保正常的调用

    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;
    当前应用程序关闭。

  • 相关阅读:
    转载---JVM四种引用--用于记录知识
    Ionic的安装、创建、及一些记录
    Angular响应式表单--附上完整代码演示
    Angular自定义模块—使用路由实现懒加载--及错误解决
    Angular自定义模块(普通)
    Angula获取服务器数据
    Angular同步与异步获取服务数据(附完整代码)
    Angular父子组件的方法传递以及数据传递
    logrotate
    Capistrano 3
  • 原文地址:https://www.cnblogs.com/lvchenhao/p/4238424.html
Copyright © 2020-2023  润新知