UIApplication物件及其代理UIApplicationDelegate

在開發過程中我們需要一些全域物件來將程式的各個部分連接起來,這些全域物件中最重要的就是UIApplication物件。但在實際程式設計中我們並不直接和UIApplication物件打交道,而是和其代理打交道。

UIApplication iPhone應用程式的開始並且負責初始化並顯示UIWindow,並負責載入應用程式的第一個UIViewUIWindow表單中。 UIApplication的另一個任務是説明管理應用程式的生命週期,而UIApplication通過一個名字為 UIApplicationDelegate的代理類來履行這個任務。儘管UIApplication會負責接收事件,而 UIApplicationDelegate則決定應用程式如何去回應這些事件,UIApplicationDelegate可以處理的事件包括應用程式的生命週期事件(比如程式啟動和關閉)、系統事件(比如來電、記事項警告),本文會介紹如何載入應用程式的UIViewUIWindow以及如何利用 UIApplicationDelegate處理系統事件。

常對於UIApplication讀者是沒必要修改它的,只需要知道UIApplication接收系統事件即可,而如何編寫代碼來處理這些系統事件則是程式師的工作。處理系統事件需要編寫一個繼承自UIApplicationDelegate介面的類,而UIApplicationDelegate介面提供生命週期函數來處理應用程式以及應用程式的系統事件。

果利用Xcode的範本創建專案,Xcode會為程式師創建繼承自UIApplicationDelegate的類,但不會自動實現繼承自 UIApplicationDelegate的可選的事件處理函數。如果讀者創建一個名為“TestUIApplication”的項目,Xcode會自動創建TestUIApplicationAppDelegate.hTestUIApplicationAppDelegate.m文件,文件的聲明如下:
@interface TestUIApplicationAppDelegate : NSObject <UIApplicationDelegate>
而應用程式的UIApplication則被定義在MainWindow.xib檔中,並且有一個作為outletUIApplicationDelegate引用。

iPhone 並不是多工的作業系統,所以應用程式很容易受到打擾,比如一個來電可能導致應用程式失去焦點,如果這個時候接聽了電話,那麼應用程式會自動終止運行。還有很多其它類似的事件會導致iPhone應用程式失去焦點,在應用程式失去焦點前會調用委託類的 applicationWillResignActive()方法,而應用程式再次獲取到焦點的時候會調用 applicationDidBecomeActive()方法。比如在運行應用程式的時候鎖屏會調用委託類的 applicationWillResignActive()方法,而當螢幕被解鎖的時候,又會調用 applicationDidBecomeActive()方法。

外一個非常重要的方法就是applicationDidReceiveMemoryWarning(),因為iPhone設備只有有限的記憶體,如果為應用程式分配了太多記憶體作業系統會終止應用程式的運行,但在終止之前作業系統會通過先調用委託類的 applicationDidReceiveMemoryWarning()方法警告應用程式,在UIApplication接收到這個事件後它會傳遞給委託類的applicationDidReceiveMemoryWarning()方法,委託類在這個方法內可以進行釋放記憶體的操作以防止作業系統強制終止應用程式的運行。

現在來看協定中定義的這些需要實現的方法分別是什麼作用:
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框變化完成後執行

狼翔月影 發表在 痞客邦 PIXNET 留言(0) 人氣()