AppDelegate 的詳解
iOS 中的
AppDelegate.m/h文件是很重要的,因為它是對 Application 的整個生命周期進行管理的。
先明白,每個 iPhone 應用程序都有一個 UIApplication,UIApplication 是 iPhone 應用程序的開始并且負責初始化并顯示 UIWindow,并負責加載應用程序的第一個 UIView 到 UIWindow 窗體中。UIApplication 的另一個任務是幫助管理應用程序的生命周期,而 UIApplication 通過一個名字為 UIApplicationDelegate 的代理類來履行這個任務。盡管 UIApplication 會負責接收事件,而 UIApplicationDelegate 則決定應用程序如何去響應這些事件,UIApplicationDelegate 可以處理的事件包括應用程序的生命周期事件(比如程序啟動和關閉)、系統(tǒng)事件(比如來電、記事項警 告),本文會介紹如何加載應用程序的 UIView 到 UIWindow 以及如何利用 UIApplicationDelegate 處理系統(tǒng)事件。 通常對于 UIApplication 讀者是沒必要修改它的,只需要知道 UIApplication 接收系統(tǒng)事件即可,而如何編寫代碼來處理這些系統(tǒng)事件則是程序員的工作。處理系統(tǒng)事件需要編寫一個繼承自 UIApplicationDelegate 接口的類,而 UIApplicationDelegate 接口提供生命周期函數來處理應用程序以及應用程序的系統(tǒng)事件,這些生命周期函數如下表所示:
1、當程序載入后執(zhí)行
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"當程序載入后執(zhí)行");
}
說明:當程序載入后執(zhí)行,應用程序啟動入口。只在應用程序啟動時執(zhí)行一次。也就是說在應用程序啟動后,要執(zhí)行的委托調用。application 參數用來獲取應用程序的狀態(tài)、變量等,值得注意的是字典參數:(NSDictionary *)launchOptions,該參數存儲程序啟動的原因。 若用戶直接啟動,lauchOptions 內無數據;
若由其他應用程序通過 openURL: 啟動,則UIApplicationLaunchOptionsURLKey 對應的對象為啟動 URL(NSURL),UIApplicationLaunchOptionsSourceApplicationKey 對應啟動的源應用程序的 bundle ID (NSString);
若由本地通知啟動,則 UIApplicationLaunchOptionsLocalNotificationKey 對應的是為啟動應用程序的的本地通知對象 (UILocalNotification);
若由遠程通知啟動,則 UIApplicationLaunchOptionsRemoteNotificationKey 對應的是啟動應用程序的的遠程通知信息 userInfo(NSDictionary); 其他 key 還有 UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey, UIApplicationLaunchOptionsNewsstandDownloadsKey。
如果要在啟動時,做出一些區(qū)分,那就需要在下面的代碼做處理。比如:應用可以被某個其它應用調起(作為該應用的子應用),要實現單點登錄,那就需要在啟動代碼的地方做出合理的驗證,并跳過登錄。 例子:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
if(url)
{
}
NSString *bundleId = [launchOptions objectForKey:UIApplicationLaunchOptionsSourceApplicationKey];
if(bundleId)
{
}
UILocalNotification * localNotify = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if(localNotify)
{
}
NSDictionary * userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(userInfo)
{
}
}
2、應用程序將要進入非活動狀態(tài),即將進入后臺
- (void)applicationWillResignActive:(UIApplication *)application
{
NSLog(@"應用程序將要進入非活動狀態(tài),即將進入后臺");
}
在應用程序將要由活動狀態(tài)切換到非活動狀態(tài)時候,要執(zhí)行的委托調用,如按下 home 按鈕,返回主屏幕,或全屏之間切換應用程序等。 說明:當應用程序將要進入非活動狀態(tài)時執(zhí)行,在此期間,應用程序不接收消息或事件,比如來電話了。
3、應用程序已經進入后臺運行
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"如果應用程序支持后臺運行,則應用程序已經進入后臺運行");
}
說明:當程序被推送到后臺的時候調用。所以要設置后臺繼續(xù)運行,則在這個函數里面設置即可
4、應用程序將要進入活動狀態(tài),即將進入前臺運行
- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog(@"應用程序將要進入活動狀態(tài),即將進入前臺運行");
}
說明:當程序從后臺將要重新回到前臺時候調用,這個剛好跟2的那個方法相反。
5、應用程序已進入前臺,處于活動狀態(tài)
- (void)applicationDidBecomeActive:(UIApplication *)application
{
NSLog(@"應用程序已進入前臺,處于活動狀態(tài)");
}
說明:當應用程序進入活動狀態(tài)時執(zhí)行.
6、應用程序將要退出,通常用于保存數據和一些退出前的清理工作
- (void)applicationWillTerminate:(UIApplication *)application
{
NSLog(@"應用程序將要退出,通常用于保存數據和一些退出前的清理工作");
}
說明:當程序將要退出是被調用,通常是用來保存數據和一些退出前的清理工作。這個需要要設置 UIApplicationExitsOnSuspend 的鍵值。
7、系統(tǒng)內存不足,需要進行清理工作
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
NSLog(@"系統(tǒng)內存不足,需要進行清理工作");
}
說明:iPhone 設備只有有限的內存,如果為應用程序分配了太多內存操作系統(tǒng)會終止應用程序的運行,在終止前會執(zhí)行這個方法,通??梢栽谶@里進行內存清理工作防止程序被終止。
8、當系統(tǒng)時間發(fā)生改變時執(zhí)行
- (void)applicationSignificantTimeChange:(UIApplication *)application
{
NSLog(@"當系統(tǒng)時間發(fā)生改變時執(zhí)行");
}
說明:當系統(tǒng)時間發(fā)生改變時執(zhí)行