1.0 UIApplication對象,1.0uiapplication

來源:互聯網
上載者:User

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)  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.