AppDelegate 的詳解

AppDelegate 的詳解

iOS 中的 AppDelegate.m/h 文件是很重要的,因為它是對 Application 的整個生命周期進行管理的。

先明白,每個 iPhone 應用程序都有一個 UIApplication,UIApplication 是 iPhone 應用程序的開始并且負責初始化并顯示 UIWindow,并負責加載應用程序的第一個 UIViewUIWindow 窗體中。UIApplication 的另一個任務是幫助管理應用程序的生命周期,而 UIApplication 通過一個名字為 UIApplicationDelegate 的代理類來履行這個任務。盡管 UIApplication 會負責接收事件,而 UIApplicationDelegate 則決定應用程序如何去響應這些事件,UIApplicationDelegate 可以處理的事件包括應用程序的生命周期事件(比如程序啟動和關閉)、系統(tǒng)事件(比如來電、記事項警 告),本文會介紹如何加載應用程序的 UIViewUIWindow 以及如何利用 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í)行

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容