UIApplication
什麼是UIApplication?
UIApplication對象是應用程序的象征.每一個應用都有自己的UIApplication對象,這個對象是系統自動幫我們創建的, 它是一個單例對象.一個iOS程序啟動後創建的第一個對象就是UIApplication對象我們只能通過[UIApplication sharedApplication]獲得這個單例對象,不能夠手動去創建它.
UIApplication作用?
利用UIApplication對象,能進行一些應用級別的操作.可以設置應用程序圖標右上角的紅色提醒數字設置聯網指示器的可見性可以設置應用程序的狀態欄,進行應用之間的跳轉.
模仿UIApplication單例.
要求:程序一啟動就創建創建對象.創建的對象只能通過share的方式獲取對象.不能夠進行alloc 操作,當執行alloc時, 程序發生崩潰
1.程序一啟動的時候就創建對象.
當類被加載到內存的時候就會調用load的方法,它會比main方法優先調用
static Persion *_instance; + (void)load{ 想要保存創建的對象, 要用成員屬性,但是現在是類方法, 沒有辦法訪問成員屬性. 所以搞了一個static的靜態變量進行保存 創建對象 _instance = [[self alloc] init]; }
2.保證調用alloc時會產生異常, 重寫系統的是alloc方法
+(instancetype)alloc { 當調用alloc方法時,先查看一下_instance有沒有值,如果已經有值的話,直接拋出異常. if(_instance) { NSException *exception = [NSException exceptionWithName: @"NSInternalInconsistencyException" reason: @"There can only be one Persion instance." userInfo:nil]; 拋出異常 [exception raise]; } 保持系統的做法. return [super alloc]; }
3.通過share方式獲取對象
+ (instancetype)sharePersion { return _instance }
UIApplication功能
1.設置應用提醒數字
獲取UIApplication對象 UIApplication *ap = [UIApplication sharedApplication]; 在設置之前, 要注冊一個通知,從ios8之後,都要先注冊一個通知對象.才能夠接收到提醒. UIUserNotificationSettings *notice = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil]; 注冊通知對象 [ap registerUserNotificationSettings:notice]; 設置提醒數字 ap.applicationIconBadgeNumber = 20;
設置提醒數字為20效果圖
2.設置連網狀態
ap.networkActivityIndicatorVisible = YES;
設置用戶友好查看聯網狀態
3.設置狀態欄
默認
默認情況
應用程序的狀態欄,默認是交給控制器來管理的.
控制器提供的方法,可以直接重寫這個方法在控制器當中設置狀態欄樣式
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
設置完成後
隱藏狀態欄,通過控制器的方式.同樣實現方法:返回NO時為不隱藏返回YES時為隱藏
- (BOOL)prefersStatusBarHidden { return NO; }
通常在開發當中都是應用程序來管理狀態欄的.來做統一管理,不然的話, 會有很多個控制器. 會非常的麻煩.
想要讓應用程序管理狀態欄,要在info.plist當中進行配置,在最後一個添加一個key值:View controller-based status bar appearance設置為NO.就是應用程序來管理了. 並且控制器管理會無效
通過UIApplication來管理狀態.
1.獲取UIApplication
UIApplication *ap = [UIApplication sharedApplication];
2.設置狀態欄樣式.
ap.statusBarStyle = UIStatusBarStyleLightContent;
3.設置狀態的隱藏
ap.statusBarHidden = YES;
4.跳轉網頁
UIApplication *ap = [UIApplication sharedApplication]; URL:協議頭://域名 應用程序通過協議頭的類型,去打開相應的軟件. NSURL *url =[NSURL URLWithString:@"http://www.baidu.com"]; [ap openURL:url]; 打電話 [application openURL:[NSURL URLWithString:@"tel://10086"]]; 發短信 [app openURL:[NSURL URLWithString:@"sms://10086"]];
UIApplication代理
所有的移動操作系統都有個致命的缺點:app很容易受到打擾。比如一個來電或者鎖屏會導致app進入後台甚至被終止,還有很多其它類似的情況會導致app受到干擾,在app受到干擾時,會產生一些系統事件, 這時UIApplication會通知它的delegate對象,讓delegate代理來處理這些系統事件
delegate可處理的事件包括:
應用程序的生命周期事件(如程序啟動和關閉)
系統事件(如來電)
內存警告
...
UIApplication會在程序一啟動時候創建一個遵守UIApplicationDelegate的代理.這個就是我們程序一創建時的AppDelegate類。AppDelegate就是遵守了UIApplicationDelegate協議。 在這個類中定義很多監聽系統事件的方法.同時也定義了一些應用程序的生命周期方法.
主要方法有:
應用程序的生命周期
應用程序啟動完成的時候調用 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { return YES; } 當我們應用程序即將失去焦點的時候調用 - (void)applicationWillResignActive:(UIApplication *)application { NSLog(@"%s",__func__); } 當我們應用程序完全進?後台的時候調用 - (void)applicationDidEnterBackground:(UIApplication *)application{ NSLog(@"%s",__func__); } 當我們應用程序即將進?前台的時候調用 - (void)applicationWillEnterForeground:(UIApplication *)application { NSLog(@"%s",__func__);} 當我們應用程序完全獲取焦點的時候調用 只有當一個應用程序完全獲取到焦點,才能與用戶交互. - (void)applicationDidBecomeActive:(UIApplication *)application { - NSLog(@"%s",__func__); } 當我們應用程序即將關閉的時候調用 - (void)applicationWillTerminate:(UIApplication *)application { NSLog(@"%s",__func__); }
應用程序的啟動原理(重要)
程序啟動時執行main函數,在main函數當中有以下操作.
int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 第三個參數:UIApplication類名或者子類的名稱 nil == @"UIApplication" NSStringFromClass好處:1.有提示功能 2.避免輸入錯誤 } }
程序完整啟動流程
1.執行Main
2.執行UIApplicationMain函數.
3.創建UIApplication對象,並設置UIApplicationMain對象的代理.UIApplication的第三個參數就是UIApplication的名稱,如果指定為nil,它會默認 為UIApplication.UIApplication的第四個參數為UIApplication的代理.
4.開啟一個主運行循環.保證應用程序不退出.
5.加載info.plist.加載配置文文件.判斷一下info.plist文件當中有沒有Main storyboard file base name裡面有沒有指定storyboard文件,如果有就去加載info.plist文件,如果沒有,那麼應用程序加載完畢.
6.通知應用程序,調用代理方法
文/hosea_zhou(簡書作者)
原文鏈接:http://www.jianshu.com/p/a72bcb948371