UI進階之程序啓動原理及UIApplication

UIApplication對象介紹:
             1> 一個UIApplication表明是一個應用程序,並且是單例的。
                  ** 用來封裝整個應用程序的一個對象, 好比當應用程序執行到某個時期要作什麼, 生命週期等。
                           
             2> 獲取UIApplication對象: [UIApplication sharedApplication];(單例的)
                           
                 /** 驗證單例模式, 參考代碼:
                  
                  - (void)viewDidLoad {
                      [super viewDidLoad];
                      
                      UIApplication *app1 = [UIApplication sharedApplication];
                      
                      UIApplication *app2 = [UIApplication sharedApplication];
                      
                      NSLog(@"%p----%p",app1, app2);
                  }

                  
                  */
                           
             3> 當一個iOS程序啓動後,首先建立的第一個對象就是UIApplication對象。
                           
             4> 利用UIApplication能夠作一些應用級別的操做。
                 * 應用級別操做:
                     1> QQ有消息的時候右上角的消息條數。
                       
                       // 獲取UIApplication對象。
                       UIApplication *app = [UIApplication sharedApplication];
                       
                       // 設置右上角, 有10條消息
                       app.applicationIconBadgeNumber = 10;
                        
                       // 取消顯示消息
                       app.applicationIconBadgeNumber = 0;
                        /** 參考代碼:
                         // 當點擊按鈕時, 設置右上角消息
                         - (IBAction)click:(id)sender {
                         
                             // 獲取UIApplication對象
                             UIApplication *app = [UIApplication sharedApplication];
                             
                             
                             // iOS 8 系統要求設置通知的時候必須通過用戶許可。
                             UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
                             
                             [app registerUserNotificationSettings:settings];
                             
                             app.applicationIconBadgeNumber = 10; // 有10條消息
                            
                         //  app.applicationIconBadgeNumber = app.applicationIconBadgeNumber > 0 ? 0 : 10; // 有10條消息
                         }

                         
                         */
                           
                           
                     2> 聯網操做時,狀態欄上的等待圖標指示器。waiting圖標。
                        UIApplication *app = [UIApplication sharedApplication];
                        app.networkActivityIndicatorVisible = YES;
                           
                           
                     3> 利用UIApplication打開某個資源:
                         ** 系統會自動根據協議識別使用某個app打開。
                           UIApplication *app = [UIApplication sharedApplication];
                           ** 打開一個網頁:
                           [app openURL:[NSURL URLWithString:@"http://ios.icast.cn"]];
                         
                           ** 打電話
                           [app openURL:[NSURL URLWithString:@"tel://10086"]];
                           
                           ** 發短信
                           [app openURL:[NSURL URLWithString:@"sms://10086"]];
                           
                           ** 發郵件
                           [app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]];

                           
                           
                         ** 使用openURL方法也能夠打開其餘應用,在不一樣應用之間互相調用對方。
                           ** 美圖秀秀, 點擊分享到"新浪微博", 打開"新浪微博"選擇帳號, 跳轉回"美圖秀秀", 開始分享
                           
                           
                      4> 經過UIApplication管理狀態欄:
                            ** 自從iOS7開始能夠經過兩種方式來控制狀態欄
                                1> 控制器
                                    * 經過UIViewController管理(每個UIViewController均可以擁有本身不一樣的狀態欄)
                           
                                    * 須要在控制器中實現以下方法:
                                    /** 參考代碼:
                                     // 是否隱藏"狀態欄"
                                     - (BOOL)prefersStatusBarHidden
                                     {
                                        return NO;
                                     }
                                     
                                     // 狀態欄的樣式
                                     - (UIStatusBarStyle)preferredStatusBarStyle
                                     {
                                        // 白色
                                        return UIStatusBarStyleLightContent;
                                     }

                                     
                                     */

                                2> UIApplication
                                    * 經過UIApplication管理(一個應用程序的狀態欄都由它統一管理)
                           
                                    ** iOS7開始狀態欄默認交給了控制器來管理,若是但願經過UIApplication來管理,步驟以下:
                                        1> 在Info.plist文件中增長一個配置項
                                             * View controller-based status bar appearance = NO,
                                   
                                        2>而後編寫以下代碼:
                                        /** 參考代碼:
                                         - (IBAction)click:(id)sender {
                                         
                                         UIApplication *app = [UIApplication sharedApplication];
                                         
                                         // 設置狀態欄是否隱藏
                                         //app.statusBarHidden = YES;
                                         // 動畫的方式
                                         //[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
                                         
                                         // 設置狀態欄顯示爲白色
                                         // app.statusBarStyle = UIStatusBarStyleLightContent;
                                         // 動畫的方式
                                         //[app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
                                         }

                                         
                                         */
                           
                           
        5. UIApplicationDelegate介紹。
           ** 新建完項目之後的那個AppDelegate文件, 就是UIApplication的代理對象。
               * 而且該代理對象已經被設置好了, 無需咱們手動設置了。
                           
               * 在main函數中進行的設置
                 /**
                  int main(int argc, char * argv[]) {
                      @autoreleasepool {
                        
                      // 設置啓動UIApplication對象, 和對應的代理對象AppDelegate。
                      return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
                  }
                  
                  */
                        
                           
                           
           ** App容易受到干擾。正在玩遊戲,一個電話打過來了。
                * 應用程序的生命週期事件(如程序啓動和關閉)
                * 系統事件(如來電)
                * 內存警告
                * … …

                           
           ** 處理這些干擾事件,就要用到AppDelegate代理對象了。
                           
           ** 總結: AppDelegate的主要做用就是處理(監聽)應用程序自己的各類事件:
                * 應用程序啓動
                         
                * 應用程序進入後臺

                * 應用程序進入前臺
                  
                * 內存警告
                           
                * 等等, 都是應用程序自身的一些事件
                           
                ** 要想成爲UIApplication的代理對象, 必須遵照:UIApplicationDelegate協議。
                           
            ** 代理中的若干方法介紹:
               1. - (BOOL)application:  didFinishLaunchingWithOptions:
               // app第一次啓動完畢後就會調用(當程序啓動後會顯示一張啓動圖片, 當這個圖片顯示完畢, 消失後, 就開始調用這個方法)
                           
                           
               2. - (void)applicationDidEnterBackground:(UIApplication *)application
               // 當程序進入後臺時, 調用該方法。(好比:按了Home鍵, 或者一個電話打過來了, 當前程序都會進入後臺。)
               // 在這個方法中能夠作一些保存當前程序數據, 暫停程序的操做。
                           
                           
               3. - (void)applicationWillEnterForeground:(UIApplication *)application
               // 當程序再次進入前臺的時候調用。
                           
                           
               4. - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
               // 當發生內存警告時觸發該事件。
               
       
       6. UIApplicationMain函數介紹。
       /**
        方法名:
        int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
        
        參數介紹:
        argc:使用main函數的argc便可
        argv:使用main函數的argv便可
        principalClassName:指定應用程序類名(app的象徵),該類必須是UIApplication(或子類),若是爲nil,則用UIApplication類做爲默認值
        delegateClassName:指定應用程序的代理類,UIApplicationDelegate協議中定義的方法,在該類中實現
        
        
        UIApplicationMain函數會:
        1> 根據principalClassName建立UIApplication對象
        2> 根據delegateClassName建立一個delegate對象,並將該delegate對象賦值給UIApplication對象中的delegate屬性
        
        
        程序正常退出時UIApplicationMain函數才返回
        
        默認調用方式:
        UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
            等價於
        UIApplicationMain(argc, argv, @"UIApplication", @"AppDelegate");
        
        ** 代理參數必須傳遞, 若是傳nil, 則顯示"黑屏"。
        
        */
                   
                           
                                   
        7. iOS程序啓動過程。參考PPT上的圖片。
             1> 打開程序。
                           
             2> 調用main函數。
                           
             3> 在main函數中調用:  UIApplicationMain()函數。
                * 在UIApplicationMain()函數中:
                    1. 建立UIApplication對象
                           
                    2. 建立AppDelegate代理對象
                           
                    3. 將AppDelegate代理對象設置給UIApplication對象。
                           
                    4. 程序啓動完畢: 觸發application:didFinishLaunchingWithOptions事件。
                           
                    5. 在UIApplicationMain()函數開啓一個"死循環(事件循環)", 因此程序不會退出, 咱們能夠任意使用。在這個"死循環(事件循環)"中程序不斷監聽用戶的各類事件, 依次處理(依靠"事件隊列"實現)。
                           
             4> 程序退出。
相關文章
相關標籤/搜索