1.0 UIApplication對象,1.0uiapplication
UIApplication對象特點:特點1:
- UIApplication對象是應用程式的象徵,一個UIApplication對象就代表一個應用程式,而且是單例的。(用來封裝整個應用程式的一個對象, 比如當應用程式執行到某個時期要做什麼, 生命週期等。)
- 擷取UIApplication對象:[UIApplication sharedApplication]
- 一個iOS程式啟動後,建立的第一個對象就是UIApplication對象,且只有一個。
|
舉例:通過代碼擷取兩個UIApplication對象,列印地址可以看出地址是相同的。 1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 4 //擷取app對象 證明了一個應用程式中只有一個UIApplication對象 5 UIApplication *app1 = [UIApplication sharedApplication]; 6 7 UIApplication *app2 = [UIApplication sharedApplication]; 8 NSLog(@"app1=%p ---- app2 = %p", app1, app2); 9 10 } |
列印結果:2015-12-02 13:34:58.847 01 UIApplication[4563:852645] app1=0x7fe2b3e0eaa0 ---- app2 = 0x7fe2b3e0eaa0 |
特點2:
- 每一個應用都有自己的UIApplication對象,而且是單例的。
- 如果試圖在程式中建立一個UIApplication對象,那麼將報錯提示。
|
舉例:1 - (void)viewDidLoad {2 [super viewDidLoad];3 4 //通過alloc+ init 建立一個UIApplication對象,會報異常5 UIApplication *app = [[UIApplication alloc] init];6 7 NSLog(@"%p", app);8 } |
列印結果:2015-12-02 13:39:00.270 01 UIApplication[4675:867735] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.' |
特點3:
- 利用UIApplication對象,能進行一些應用層級的操作
|
(1)應用表徵圖顯示數字 (詳見1.1 常用屬性) |
(2)狀態列上的等待表徵圖指標 (詳見1.1 常用屬性) |
(3)利用UIApplication開啟某個資源 (openURL:方法)✓系統會自動根據協議識別使用某個app開啟 1 //開啟一個網頁 : 2 [app openURL:[NSURL URLWithString:@"http://ios.icast.cn"]]; 3 4 //打電話 5 [app openURL:[NSURL URLWithString:@"tel://10086"]]; 6 7 //發簡訊 8 [app openURL:[NSURL URLWithString:@"sms://10086"]]; 9 10 //發郵件11 [app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]];12 ✓使用openURL方法也可以開啟其他應用,在不同應用之間互相調用對方。 美圖秀秀, 點擊分享到"新浪微博", 開啟"新浪微博"選擇帳號, 跳回"美圖秀秀", 開始分享 喜馬拉雅, 使用微博、QQ 帳號 登入。都需要應用程式間跳轉。 |
(4)通過UIApplication管理狀態列 (詳見1.2 管理狀態列) |
1.1 — 常用屬性
UIApplication的常用屬性
1 //應用程式圖示右上方的紅色提醒數字(預設為0) 2 @property(nonatomic) NSInteger applicationIconBadgeNumber; 3 4 舉例: 5 6 - (void)viewDidLoad { 7 [super viewDidLoad]; 8 9 //擷取單例對象10 UIApplication *app = [UIApplication sharedApplication];11 12 // 建立使用者通知設定 (iOS8 後要求設定通知的時候必須經過使用者許可)13 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {14 UIUserNotificationSettings *settings =15 [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge16 categories:nil];17 //註冊許可權18 [app registerUserNotificationSettings:settings];19 }20 21 //設定數字22 app.applicationIconBadgeNumber = 10;23 24 }
1 //連網指標的可見度 (預設為 no) 2 @property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
3 舉例: 4 5 - (void)viewDidLoad { 6 [super viewDidLoad]; 7 8 //擷取單例對象 9 UIApplication *app = [UIApplication sharedApplication];10 11 //設定網路指標12 app.networkActivityIndicatorVisible = YES;13 14 }
1.2 — 管理狀態列系統提供了2種管理狀態列的方式1.通過UIViewController管理(iOS 7以後)(每一個UIViewController都可以擁有自己不同的狀態列)(推薦)
1 //狀態列的樣式 2 -(UIStatusBarStyle)preferredStatusBarStyle; 3 4 //狀態列的可見度 5 -(BOOL)prefersStatusBarHidden; 6 // 狀態列可見度(預設為 no) --- UIViewController管理 (推薦使用) 7 - (BOOL)prefersStatusBarHidden { 8 return NO; 9 }10 11 //狀態列的樣式 --- UIViewController管理 (推薦使用)12 - (UIStatusBarStyle)preferredStatusBarStyle {13 14 /* 狀態列樣式 statusBarStyle15 UIStatusBarStyleDefault 狀態列為黑色16 UIStatusBarStyleLightContent 狀態列為白色17 UIStatusBarStyleBlackTranslucent18 UIStatusBarStyleBlackOpaque19 */20 21 return UIStatusBarStyleDefault;22 }
2.通過UIApplication管理(iOS 6之前)
(1)在ios 7 以後如果要通過UIApplication管理,則首先要在Info.plist檔案中增加一個配置項
- key:View controller-based status bar appearance
- value:NO
|
1 //狀態列的樣式 --- UIApplication管理 2 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 3 4 //擷取單例對象 5 UIApplication *app = [UIApplication sharedApplication]; 6 7 //採用動畫的效果設定狀態列的樣式-由黑變白(到期) 8 [app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; 9 10 //隱藏狀態列11 app.statusBarHidden = YES;12 13 //採用動畫的方式隱藏狀態列 (到期 ios 3.2棄用)14 [app setStatusBarHidden:YES animated:YES];15 16 /* withAnimation:方法 (到期)17 UIStatusBarAnimationNone 無特效18 UIStatusBarAnimationFade 淡出效果19 UIStatusBarAnimationSlide 向上退出隱藏20 */21 [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];22 } |
使用場合
UIApplication:狀態列的樣式只設定一次,使用動畫效果 |
UIViewController:狀態列是否隱藏,樣式不一樣 |
1.3 — UIApplicationDelegate引入
- 所有的移動作業系統都有個致命的缺點:app很容易受到打擾。
- 比如一個來電或者鎖屏會導致app進入後台甚至被終止,還有很多其它類似的情況會導致app受到幹擾。
- 在app受到幹擾時,會產生一些系統事件,這時UIApplication會通知它的delegate對象,讓其處理這些系統事件。
|
delegate可處理的事件如:
- 應用程式的生命週期事件(如程式啟動和關閉)
- 系統事件(如來電)
- 記憶體警告
- … …
|
簡介:
- 建立完項目以後的那個AppDelegate檔案, 就是UIApplication的代理對象。
- 該代理對象main函數中已經被設定好了, 無需我們手動設定了。
|
在main函數中進行的設定:
檔案位置:Supporting Files —> main.m |
1 #import <UIKit/UIKit.h> 2 #import "AppDelegate.h" 3 4 int main(int argc, char *argv[]) { 5 @autoreleasepool { 6 7 //設定啟動UIApplication對象, 和對應的代理對象AppDelegate 8 return UIApplicationMain(argc, argv, nil,NSStringFromClass([AppDelegate class])); 9 }10 } |
注意:
AppDelegate的主要作用就是處理(監聽)應用程式本身的各種事件 |
要想成為UIApplication的代理對象, 必須遵守:UIApplicationDelegate協議 |
1.3.1 — 代理方法 AppDelegate檔案預設已經遵守了UIApplicationDelegate協議,已經是UIApplicationDelegate的代理
1 // AppDelegate.h2 3 #import <UIKit/UIKit.h>4 5 @interface AppDelegate : UIResponder <UIApplicationDelegate>6 7 @property (strong, nonatomic) UIWindow *window;8 9 @end |
處理(監聽)應用程式本身的各種事件:
1 // AppDelegate.m 2 3 #import "AppDelegate.h" 4 5 @interface AppDelegate () 6 7 @end 8 9 @implementation AppDelegate10 11 // app啟動完成 調用該方法 啟動之後,將不再調用此方法!12 // 如果因為記憶體等原因,應用程式被作業系統幹掉,再次點擊表徵圖,會調用此方法!13 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {14 NSLog(@"%s", __func__);15 return YES;16 }17 18 // app即將退出活動狀態的時候調用 (將要失去焦點:不能和使用者互動)( 此方法在來電或來簡訊的時候被調用)19 // 遊戲應該再此方法中暫停遊戲進程!此方法在遊戲開發中尤為重要!20 - (void)applicationWillResignActive:(UIApplication *)application {21 NSLog(@"%s", __func__);22 }23 24 // app已經進入後台 調用該方法 (在此方法中儲存應用程式的資料和狀態)25 // 應用程式退出到後台,釋放共用資源,儲存使用者資料,停止時鐘,儲存足夠的應用程式狀態資訊...26 - (void)applicationDidEnterBackground:(UIApplication *)application {27 NSLog(@"%s", __func__);28 }29 30 // app即將進入前台的時候 調用該方法 (在此方法中還原應用程式的資料和狀態)31 - (void)applicationWillEnterForeground:(UIApplication *)application {32 NSLog(@"%s", __func__);33 }34 35 // app已經進入活動狀態, 重新啟動原來暫停狀態 (重新擷取焦點:可以和使用者互動)36 - (void)applicationDidBecomeActive:(UIApplication *)application {37 38 NSLog(@"%s", __func__);39 }40 41 // app接收到記憶體警告 調用該方法42 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {43 NSLog(@"%s", __func__);44 }45 46 // app將要被殺死 調用該方法47 // 注意:1.使用者主動關閉 2.系統因為記憶體不夠關閉了程式48 - (void)applicationWillTerminate:(UIApplication *)application {49 50 NSLog(@"%s", __func__);51 }52 @end
如有疑問,請發送郵件至 shorfng@126.com 聯絡我。 By:藍田(Loto)