UIApplication sharedApplication詳細解釋-IOS

來源:互聯網
上載者:User

iPhone應用程式是由主函數main啟動,它負責調用UIApplicationMain函數,該函數的形式如下所示: 
int UIApplicationMain ( 
int argc, 
char *argv[], 
NSString *principalClassName, 
NSString *delegateClassName 
); 
那麼UIApplicationMain函數到底做了哪些事情呢?這個函數主要負責三件 事情: 

1)從給定的類名初始化應用程式對象,也就是初始化UIApplication或者子類對象的一個執行個體,如果你在這裡給定的是nil,那麼
系統會預設UIApplication類,也就主要是這個類來控制以及協調應用程式的運行。在後續的工作中,你可以用靜態方法sharedApplication 來擷取應用程式的控制代碼。 

2)從給定的應用程式委託類,初始化一個應用程式委託。並把該委託設定為應用程式的委託,這裡就有如果傳入參數為nil,會調用函數訪問 Info.plist檔案來尋找主nib檔案,擷取應用程式委託。 

3)啟動主事件迴圈,並開始接收事件。 

上面是UIApplicationMain函數的工作,接下來一個問題是應用程式視圖的顯示、訊息的控制怎麼辦?下面就是UIApplication(或 者子類)對象的職責,這個對象主要做下面幾件事: 

1)負責處理到來的使用者事件,並分發事件訊息到應該處理該訊息的目標對象(sender,  action)。 
2)管理以及控制視圖,包括呈現、控制行為、當前顯示視圖等。 
3)該對象有一個應用程式委派物件,當一些生命週期內重要事件(可以包括系統事件或者生命週期控制事件)發生時,代理程式更新該對象。例如,應用程式啟 動、記憶體不夠了或者應用程式結束等,讓這些事件發生時,應用程式委託去響應。 

通 過上面的分析,可以知道UIApplication對開發人員來說,是一個黑箱,它也可以是。因為所有的操作,都可以由它的委託來幫我們完成,它只需要在 後面維護一些不可更改的東西,如事件訊息分發和傳遞、給委託發送事件處理請求等等,如,應用程式載入處理完畢,它會發送訊息給委託,然後委託可以在 applicationDidFinishLanching委託函數中去實現開發人員想要的動作。利用XCODE在建立應用程式時,會預設實現一個應用程式 委託類。而對於載入的視圖,則有視圖相關的委託類來處理視圖載入過程的生命事件。下面說明委託主要可以辦哪些事情: 
控制應用程式的行為 

- (void)applicationDidFinishLaunching:(UIApplication *)application 
          應用程式啟動完畢。 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
        當由於其它方法開啟應用程式(如URL指定或者串連),通知委託啟動完畢 
- (void)applicationWillTerminate:(UIApplication *)application 
         通知委託,應用程式將在關閉 退出,請做一些清理工作。 
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
        通知委託,應用程式收到了為來自系統的記憶體不足警告。-(void)applicationSignificantTimeChange:(UIApplication *)application 
      通知委託系統時間發生改變(主要是指時間屬性,而不是具體的時間值) 
開啟URL 
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
           開啟指定的URL 
控制狀態列方位變化 
– application:willChangeStatusBarOrientation:duration: 
        裝置方向將要發生改變 
– application:didChangeStatusBarOrientation: 
活動狀態改變 
- (void)applicationWillResignActive:(UIApplication *)application 
   通知委託應用程式將進入非使用中,在此期間,應用程式不接收訊息或事件。-(void)applicationDidBecomeActive:(UIApplication *)application 
      通知委託應用程式進入活動狀態,請恢複資料 

1.設定icon上的數字表徵圖

    //設定主介面icon上的數字表徵圖,在2.0中引進, 預設為0
    [UIApplicationsharedApplication].applicationIconBadgeNumber = 4;

2.設定搖動手勢的時候,是否支援redo,undo操作

   //搖動手勢,是否支援redo undo操作。
   //3.0以後引進,預設YES
    [UIApplicationsharedApplication].applicationSupportsShakeToEdit =YES;

3.判斷程式運行狀態

    //判斷程式運行狀態,在2.0以後引入
  
   if([UIApplicationsharedApplication].applicationState ==UIApplicationStateInactive){
        NSLog(@"程式在運行狀態");
    }

4.阻止螢幕變暗進入休眠狀態

   //阻止螢幕變暗,謹慎使用,預設為no 2.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=Hello from California!";
   NSString *body =@"&body=It is raining in sunny California!";
  
    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 fav site
    [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];

可以看到UIApplication的頭檔案實現 
@interface UIApplication :UIResponder <UIActionSheetDelegate>{ 
@package 
id<UIApplicationDelegate> _delegate ;  //這就是應用程式委託。 
NSTimer ....... 

因此,在UIApplication中處理的系統事件時,只需轉到_delegate這個類去處理, 這個類對象就是應用程式委派物件。我們可以從應用程式的單例類對象中得到應用程式委託的對象 
UIApplicationDelegate* myDelegate = [[UIApplication sharedApplication] delegate]; 

UIApplication 接收到所有的系統事件和生命週期事件時,都會把事件傳遞給UIApplicationDelegate進行處理,對於使用者輸入 事件,則傳遞給相應的目標對象去處理。比如我們在應用程式被來電等訊息後,可以調用應用程式委託類的 applicationWillResignActive()方法,這個方法在使用者鎖住螢幕時,也會調用,與之相適應的是應用程式重新被使用者開啟時的委託 方法。另外常用的就是記憶體不足的系統警告,此時會調用應用程式委託類的applicationDidReceiveMemoryWarning()方法,
然後我們就可以試著釋放一些記憶體了。 

上面就是應用程式生命週期(啟動,中止,恢複,退出等過程)的應用程式處理UIApplication sharedApplication

  本文由zhudameng213貢獻
ppt文檔可能在WAP端瀏覽體驗不佳。建議您優先選擇TXT,或下載源檔案到本機查看。
20120221
IOS應用程式生命週期
UIViewController的生命週期
程式的生命週期
程式的生命週期是指應用程式啟動到應用程式結束整個 階段的全過程 每一個IOS應用程式都包含一個UIApplication對象, IOS系統通過該UIApplication對象監控應用程式生命周 期全過程 每一個IOS應用程式都要為其UIApplication對象指定一 個代理對象,並由該代理對象處理UIApplication對象監 測到的應用程式生命週期事件。
IOS應用程式5種狀態
Not running:應用還沒有啟動,或者應用正在運行但是途中被系
統停止
Inactive:當前應用正在前台運行,但是並不接收事件(當前 或許
正在執行其它代碼)。一般每當應用要從一個狀態切換到另一個不 同的狀態時,中途過渡會短暫停留在此狀態。唯一在此狀態停留時 間比較長的情況是:當使用者 鎖屏時,或者系統提示使用者去響應某 些(諸如電話來電、有未讀簡訊等)事件的時候。
Active:當前應用正在前台運行,並且接收事件。這是應用正在前
台運行時所處的正常狀態。
Background:應用處在後台,並且還在執行代碼。大多數將 要進
入Suspended狀態的應用,會先短暫進入此狀態。然而,對於請求 需要額外的執行時間的應用,會在此狀態保持更長一段時間。另外, 如果一個應用要 求啟動時直接進入後台運行,這樣的應用會直接 從Not running狀態進入Background狀態,中途不會經過Inactive狀 態。比如沒有介面的應用。注此處並不特指沒有介面的應用,其實 也可以是 有介面的應用,只是如果要直接進入background狀態的 話,該應用介面不會被顯示。
Suspended:應用處在後台,並且已停止執行代碼。系統自動 的
將應用移入此狀態,且在此舉之前不會對應用做任何通知。當處在 此狀態時,應用依然駐留記憶體但不執行任何程式碼。當系統發生 低記憶體警示時,系統將會將處 於Suspended狀態的應用清除出內 存以為正在前台啟動並執行應用提供足夠的記憶體。
建立UIApplication對象並指定其代理
通過UIApplicationMain函數建立UIApplication對象並 指定其代理對象AppDelegate;第三個參數為指定 UIApplication的子類來產生UIApplication對象,為nil時由 UIApplication類初始化預設對象;第四個參數為指定代理 對象。
UIApplication的代理對象
作為UIApplication的代理類,必須要先實現 UIApplicationDelegate協議,協議裡明確了作為代理應 該做或可以做哪些事情。 UIApplication對象負責監聽應用程式的生命週期事件, 並將生命週期事件交由UIApplication代理對象處理。
UIApplication代理對象生命週期函數詳解
- (void)applicationWillResignActive:(UIApplication *)application
說明:當應用程式將要入非使用中執行,在此期間,應用 程

序不接收訊息或事件,比如來電話了
- (void)applicationDidBecomeActive:(UIApplication *)application
說明:當應用程式入活動狀態執行,這個剛好跟上面那個方 法相反
- (void)applicationDidEnterBackground:(UIApplication *)application
說明:當程式被推送到背景時候調用。所以要設定後台繼 續運行,則在這個函數裡面設定即可
UIApplication代理對象生命週期函數詳解
- (void)applicationWillEnterForeground:(UIApplication *)application
說明:當程式從後台將要重新回到前台時候調用,這個剛好 跟上面的那個方法相反。
- (void)applicationWillTerminate:(UIApplication *)application
說明:當程式將要退出是被調用,通常是用來儲存資料和一 些退出前的清理工作。這個需要要設定 UIApplicationExitsOnSuspend的索引值
(void)applicationDidReceiveMemoryWarning:(UIApplic ation *)application
說明:ios裝置只有有限的記憶體,如果為應用程式分配了太多 記憶體作業系統會終止應用程式的運行,在終止前會執行這個 方法,通常可以在這裡進行記憶體清理工作防止程式被終止
UIApplication代理對象生命週期函數詳解
(void)applicationDidFinishLaunching:(UIApplication*)a pplication
說明:當程式載入後執行。
- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url
說明:當開啟URL時執行。
UIViewController
UIViewController是IOS頂層視圖的載體及控制器,使用者 與程式介面的互動都是由UIViewController來控制的。 UIViewController管理UIView的生命週期及資源的載入 與釋放。
UIView UIView與UIWindow共同展示了應用使用者介面。
UIViewController生命週期事件
-(void)loadView
載入視圖資源並初始化視圖
- (void)viewDidLoad - (void)viewDidUnload
釋放視圖資源
- (void)viewWillAppear:(BOOL)animated
將要載入出視圖
- (void)viewDidAppear:(BOOL)animated
視圖出現
- (void)viewWillDisappear:(BOOL)animated
視圖即將消失
(void)viewDidDisappear:(BOOL)animated
視圖已經消失  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.