1.什么是UIApplication?
UIApplication對象是應用程序的象征
每一個應用都有自己的UIApplication對象,而且是單例的
通過[UIApplication sharedApplication]可以獲得這個單例對象
一個iOS程序啟動后創建的第一個對象就是UIApplication對象
利用UIApplication對象,能進行一些應用級別的操作
注意:UIApplication不能手動創建,不能alloc init,一個應用程序只允許 一個。 為什么要弄成單例,UIApplication對象是用來設置應用全局信息的,一個 應用程序如果有很多UIApplication對象,都不知道聽誰的。 驗證:單例和不能alloc,init
2.UIApplication的作用:做應用級別的操作
2.1> 設置應用圖標右上角的數字,圖標需要手動清除,應用程序關閉,不 會自動清除.
applicationIconBadgeNumber:
@property(nonatomic) NSInteger applicationIconBadgeNumber;
設置聯網指示器的可見性
@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
2.2>顯示聯網狀態,告訴用戶此應用正在聯網 networkActivityIndicatorVisible
2.3>打開一個資源
UIApplication有個功能十分強大的openURL:方法
– (BOOL)openURL:(NSURL*)url;
openURL:方法的部分功能有
打電話
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@”tel://10086″]];
發短信
[app openURL:[NSURL URLWithString:@”sms://10086″]];
發郵件
[app openURL:[NSURL URLWithString:@”mailto://12345@qq.com”]];
打開一個網頁資源
[app openURL:[NSURL URLWithString:@”http://ios.itcast.cn”]];
打開其他app程序
3.URL:一個資源的唯一路徑
3.1>網絡資源URL的組成==協議頭://主機域名/路徑 http://www.baidu.com/abc/1.png
3.2>本地資源URL的組成==協議頭:///路徑 本機域名可以不寫 file:///User/apple/Desktop/1.png
4.UIApplication打開資源的好處:不用判斷用什么軟件打開,系統會自動根據 協議頭判斷。
5.UIApplication管理狀態欄.
從iOS7開始,系統提供了2種管理狀態欄的方式
通過UIViewController管理(每一個UIViewController都可以擁有自己不同的狀態欄)
通過UIApplication管理(一個應用程序的狀態欄都由它統一管理)
在iOS7中,默認情況下,狀態欄都是由UIViewController管理的,UIViewController實現下列方法就可以輕松管理狀態欄的可見性和樣式
狀態欄的樣式
– (UIStatusBarStyle)preferredStatusBarStyle;
狀態欄的可見性
(BOOL)prefersStatusBarHidden;
如果想利用UIApplication來管理狀態欄,首先得修改Info.plist的設置
View controller-based status bar appearance 設置
5.1> ios7默認交給控制器,需要配置下,不交給控制器管理,就會交個 UIApplication管理。
5.2>動畫隱藏狀態欄
5.3>動畫設置狀態欄樣式
Delegate
1.AppDelegate的作用:
? 為什么要搞個AppDelegate,代理設計模式,有些事情自己不想處理,交給別人處理
所有的移動操作系統都有個致命的缺點:app很容易受到打擾。比如一個來電或者鎖屏會導致app進入后臺甚至被終止
還有很多其它類似的情況會導致app受到干擾,在app受到干擾時,會產生一些系統事件,這時UIApplication會通知它的delegate對象,讓delegate代理來處理這些系統事件
delegate可處理的事件包括:
應用程序的生命周期事件(如程序啟動和關閉)
系統事件(如來電)
內存警告
? 怎么成為UIApplication的代理,遵守協議。
// app接收到內存警告時調用
– (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;
// app進入后臺時調用(比如按了home鍵)
– (void)applicationDidEnterBackground:(UIApplication *)application;
// app啟動完畢時調用
– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
2.在哪設置UIApplication的代理,需要了解ios程序的啟動過程.
2.1> 創建application,創建并且設置application的代理
2.2> 開啟事件循環,不斷監聽事件。如果產生系統事件,就會通知代 理,其他事件,會找到一個最合適的視圖處理事件。 2.3>只有應用程序關閉,才會結束程序
3.UIApplicationMain函數:
main函數中執行了一個UIApplicationMain這個函數
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
argc、argv:直接傳遞給UIApplicationMain進行相關處理即可
principalClassName:指定應用程序類名(app的象征),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認值
delegateClassName:指定應用程序的代理類,該類必須遵守UIApplicationDelegate協議
? 注意UIApplicationMain函數會開啟一個事件循環,并不會馬上就執行完畢。
? 底層做的事情,創建UIApplication對象和UIApplicationDelegate對象,設置UIApplication的代理,開啟事件循環,監聽系統事件。
UIApplicationMain函數會根據principalClassName創建UIApplication對象,根據delegateClassName創建一個delegate對象,并將該delegate對象賦值給UIApplication對象中的delegate屬性
接著會建立應用程序的Main Runloop(事件循環),進行事件的處理(首先會在程序完畢后調用delegate對象的application:didFinishLaunchingWithOptions:方法)
程序正常退出時UIApplicationMain函數才返回
3.1> delegateClassName不能傳nil,這里傳nil,意味著application沒有 代理,就無法監聽系統的事件,系統的事件都沒法監聽,窗口都不知道 什么時候去加載,因為視圖都是懶加載的,因此就不會創建窗口,什么 東西都沒有。
3.2> principalClassName傳nil,默認是UIApplication,創建一個 UIApplication對象。
4.UIApplication代理的作用:處理系統事件,不是任何事件都交給他處理,按 鈕點擊,屏幕點擊都不是他處理,是由UIApplication處理。
2.1>加載完成,初始化的操作
2.2> 進入后臺:一般在這里保存應用的數據(游戲數據,比如暫停游戲) 2.3>內存警告:清空不必要的內容