亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

【iOS】app的生命周期

2019-11-14 20:21:17
字體:
來源:轉載
供稿:網友

    對于iOS應用程序,關鍵的是要知道你的應用程序是否正在前臺或后臺運行。由于系統資源在iOS設備上較為有限,一個應用程序必須在后臺與前臺有不同的行為。操作系統也會限制你的應用程序在后臺的運行,以提高電池壽命,并提高用戶與前臺應用程序的體驗。當應用程序在前臺和后臺之間切換時,操作系統將會通知您的應用程序。你可以通過這些通知來修改你的應用程序的行為。

    當你的應用程序在前臺活動時,系統會發送觸摸事件給它進行處理。在UIKit的基礎設施做了大部分的事件傳遞給你的自定義對象工作。所有您需要做的是覆蓋在相應的對象的方法來處理這??些事件。對于控件,UIKit會通過處理你的觸摸事件,或者其他一些有趣的事情發生時調用您的自定義代碼,比如當文本字段中的值更改。

1:應用程序的狀態

Not running未運行:程序沒啟動。

Inactive未激活:程序在前臺運行,不過沒有接收到事件。在沒有事件處理情況下程序通常停留在這個狀態。

Active激活:程序在前臺運行而且接收到了事件。這也是前臺的一個正常的模式。

Backgroud后臺:程序在后臺而且能執行代碼,大多數程序進入這個狀態后會在在這個狀態上停留一會。時間到之后會進入掛起狀態(Suspended)。有的程序經過特殊的請求后可以長期處于Backgroud狀態。

Suspended掛起:程序在后臺不能執行代碼。系統會自動把程序變成這個狀態而且不會發出通知。當掛起時,程序還是停留在內存中的,當系統內存低時,系統就把掛起的程序清除掉,為前臺程序提供更多的內存。

 

2:各個程序運行狀態時代理的回調

①告訴代理進程啟動但還沒進入狀態保存

1 - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions2 {3     NSLog(@"①告訴代理進程啟動但還沒進入狀態保存");4     return YES;5 }

②告訴代理啟動基本完成程序準備開始運行

 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 2 { 3     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 4      5     NSLog(@"②告訴代理啟動基本完成程序準備開始運行"); 6      7     // Override point for customization after application launch. 8      9     self.window.backgroundColor = [UIColor whiteColor];10     [self.window makeKeyAndVisible];11     return YES;12 }

③當應用程序將要入非活動狀態執行,在此期間,應用程序不接收消息或事件,比如來電話

1 - (void)applicationWillResignActive:(UIApplication *)application2 {3     // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.4     // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.5     NSLog(@"③當應用程序將要入非活動狀態執行,在此期間,應用程序不接收消息或事件,比如來電話");6 }

④當應用程序進入活動狀態執行

1 - (void)applicationDidBecomeActive:(UIApplication *)application2 {3     // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was PReviously in the background, optionally refresh the user interface.4     NSLog(@"④當應用程序進入活動狀態執行");5 }

⑤當程序被推送到后臺的時候調用。所以要設置后臺繼續運行,則在這個函數里面設置即可

 1 - (void)applicationDidEnterBackground:(UIApplication *)application 2 { 3     // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 4     // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 5     NSLog(@"⑤當程序被推送到后臺的時候調用"); 6      7     [application beginBackgroundTaskWithExpirationHandler:^{ 8          9         NSLog(@"begin Background Task With Expiration Handler");10         11     }];12 }

⑥當程序從后臺將要重新回到前臺時候調用

1 - (void)applicationWillEnterForeground:(UIApplication *)application2 {3     // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.4     NSLog(@"⑥當程序從后臺將要重新回到前臺時候調用");5 }

⑦當程序將要退出是被調用,通常是用來保存數據和一些退出前的清理工作。這個需要要設置UIApplicationExitsOnSuspend的鍵值

1 - (void)applicationWillTerminate:(UIApplication *)application2 {3     // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.4     NSLog(@"⑦當程序將要退出是被調用");5 }

⑧當程序載入后執行

1 - (void)applicationDidFinishLaunching:(UIApplication *)application2 {3     NSLog(@"⑧當程序載入后執行");4 }

程序啟動時:

2014-07-01 15:55:14.706 LifeCycle[5845:60b] ①告訴代理進程啟動但還沒進入狀態保存

2014-07-01 15:55:14.708 LifeCycle[5845:60b] ②告訴代理啟動基本完成程序準備開始運行

2014-07-01 15:55:14.709 LifeCycle[5845:60b] ④當應用程序進入活動狀態執行

按下Home鍵返回主界面:

2014-07-01 15:56:11.756 LifeCycle[5845:60b] ③當應用程序將要入非活動狀態執行

2014-07-01 15:56:11.814 LifeCycle[5845:60b] ⑤當程序被推送到后臺的時候調用

再次打開程序:

2014-07-01 15:57:19.200 LifeCycle[5845:60b] ⑥當程序從后臺將要重新回到前臺時候調用

2014-07-01 15:57:19.201 LifeCycle[5845:60b] ④當應用程序進入活動狀態執行

3:加載應用程序進入前臺

 

4:加載應用程序進入后臺

5:基于警告式響應中斷

當出現這種中斷時,我們需要在- (void)applicationWillResignActive:(UIApplication *)application方法中進行如下操作:

①停止timer 和其他周期性的任務

②停止任何正在運行的請求

③暫停視頻的播放

④如果是游戲那就暫停它

⑤減少OpenGL ES的幀率

⑥掛起任何分發的隊列和不重要的操作隊列(你可以繼續處理網絡請求或其他時間敏感的后臺任務)

當程序回到active狀態,我們需要在- (void)applicationDidBecomeActive:(UIApplication *)application方法中重新開始上述任務。不過游戲要回到暫停狀態,不能自動開始。

6:進入后臺運行

 

當應用程序進入后臺時,我們應該做些什么?

保存用戶數據或狀態信息,所有沒寫到磁盤的文件或信息,在進入后臺時,最后都寫到磁盤去,因為程序可能在后臺被殺死。

釋放盡可能釋放的內存。

- (void)applicationDidEnterBackground:(UIApplication *)application方法有大概5秒的時間讓你完成這些任務。如果超過時間還有未完成的任務,你的程序就會被終止而且從內存中清除。

如果還需要長時間的運行任務,可以在該方法中調用 

1 [application beginBackgroundTaskWithExpirationHandler:^{2         3         NSLog(@"begin Background Task With Expiration Handler");4         5     }];

應用程序在后臺時的內存使用:請求后臺運行時間和啟動線程來運行長時間運行的任務。

在后臺時,每個應用程序都應該釋放最大的內存。系統努力的保持更多的應用程序在后臺同時 運行。不過當內存不足時,會終止一些掛起的程序來回收內存,那些內存最大的程序首先被終止。

事實上,應用程序應該的對象如果不再使用了,那就應該盡快的去掉強引用,這樣編譯器可以回收這些內存。如果你想緩存一些對象提升程序的性能,你可以在進入后臺時,把這些對象去掉強引用。

下面這樣的對象應該盡快的去掉強引用:

①圖片對象

②你可以重新加載的 大的視頻或數據文件

③任何沒用而且可以輕易創建的對象

在后臺時,為了減少程序占用的內存,系統會自動在回收一些系統幫助你開辟的內存。比如:

①系統回收Core Animation的后備存儲。

②去掉任何系統引用的緩存圖片

③去掉系統管理數據緩存強引用

7:返回前臺運行

 

在暫停狀態的應用程序必須準備處理任何排隊的通知時,它返回到前臺或后臺執行狀態。暫停的應用程序不執行任何代碼,因此不能處理與方向的變化,時間的變化,偏好的變化,以及許多其他會影響應用程序的外觀或狀態的通知。為了確保這些更改不會丟失,系統排隊許多相關的通知,并把它們傳遞給應用程序,只要它開始再次執行代碼(無論是在前景或背景)。為了防止由偏快轉為超載與它恢復時通知您的應用程序,該系統凝聚事件,并提供一個單一的通知(每個相關類型),反映了凈變化,因為你的應用程序被暫停。

8:程序終止

程序只要符合以下情況之一,只要進入后臺或掛起狀態就會終止:

①iOS4.0以前的系統

②app是基于iOS4.0之前系統開發的。

③設備不支持多任務

④在Info.plist文件中,程序包含了 UIApplicationExitsOnSuspend  鍵。

app如果終止了,系統會調用app的代理的方法 - (void)applicationWillTerminate:(UIApplication *)application,這樣可以讓你可以做一些清理工作。你可以保存一些數據或app的狀態。這個方法也有5秒鐘的限制。超時后方法會返回程序從內存中清除。

注意:用戶可以手工關閉應用程序。

9:The Main Run Loop  主運行循環

Main Run Loop負責處理用戶相關的事件。UIApplication對象在程序啟動時啟動main run Loop,它處理事件和更新視圖的界面。看Main Run Loop就知道,它是運行在程序的主線程上的。這樣保證了接收到用戶相關操作的事件是按順序處理的。 

用戶操作設備,相關的操作事件被系統生成并通過UIKit的指定端口分發。事件在內部排成隊列,一個個的分發到Main run loop 去做處理。UIApplication對象是第一個接收到時間的對象,它決定事件如何被處理。觸摸事件分發到主窗口,窗口再分發到對應出發觸摸事件的View。其他的事件通過其他途徑分發給其他對象變量做處理。 

大部分的事件可以在你的應用里分發,類似于觸摸事件,遠程操控事件(線控耳機等)都是由app的 responder objects 對象處理的。Responder objects 在你的app里到處都是,比如:UIApplication 對象,view對象,view controller 對象,都是resopnder objects。大部分事件的目標都指定了resopnder object,不過事件也可以傳遞給其他對象。比如,如果view對象不處理事件,可以傳給父類view或者view controller。

-------------------------------------

本文根據官方文檔整理,翻譯基本靠谷歌。

點擊查看英文版原文

-------------------------------------


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品福利一区二区| 亚洲精品美女在线观看| 精品动漫一区二区| 色777狠狠综合秋免鲁丝| 亚洲精品久久久久久久久久久久| 久久国产精品久久久久久| 亚州精品天堂中文字幕| 成人黄色在线免费| 国产日韩在线亚洲字幕中文| 午夜精品免费视频| 久久免费精品日本久久中文字幕| 久久久最新网址| 亚洲三级免费看| 亚洲视屏在线播放| 亚洲午夜久久久久久久| 国产丝袜精品第一页| 日本精品在线视频| 日韩在线中文视频| 日韩国产在线看| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美性xxxxhd| 亚洲人在线视频| 97精品欧美一区二区三区| 91国产视频在线播放| 91在线国产电影| 亚洲爱爱爱爱爱| 亚洲老头老太hd| 亚洲精品天天看| 欧美xxxx做受欧美.88| 国产精品精品视频一区二区三区| 国产精品久久久久aaaa九色| 一夜七次郎国产精品亚洲| 日韩av在线高清| www.99久久热国产日韩欧美.com| 91牛牛免费视频| 日韩国产欧美区| 国产精品久久国产精品99gif| 欧美专区第一页| 久久精品亚洲精品| 日韩在线视频播放| 精品亚洲一区二区三区四区五区| 亚洲精品综合精品自拍| 97国产在线观看| 91网站在线免费观看| 亚洲欧美在线播放| 亚洲人成网站777色婷婷| 亚洲欧美日韩一区二区在线| 国产精品久久久久久久电影| 欧美另类老肥妇| 久久久久久午夜| 国产欧美一区二区白浆黑人| 黄色成人av在线| 色综合伊人色综合网站| 久久久欧美精品| 成人免费看片视频| 成人免费黄色网| 国产一区二区日韩精品欧美精品| 欧美日韩国产中文精品字幕自在自线| 秋霞av国产精品一区| 日韩一区二区欧美| 久久久精品免费| 日韩在线观看免费| 俺去亚洲欧洲欧美日韩| 久久精品国产96久久久香蕉| 97香蕉超级碰碰久久免费的优势| 亚洲欧洲日本专区| 欧美电影第一页| 国产精品久久久久久av下载红粉| 最近中文字幕mv在线一区二区三区四区| 国产一区玩具在线观看| 日韩男女性生活视频| 国产成+人+综合+亚洲欧美丁香花| 国产精品xxx视频| 日韩av电影院| 久久久久女教师免费一区| 91免费的视频在线播放| 国产精品三级美女白浆呻吟| 久久久久久com| 久久国产精品久久精品| 精品性高朝久久久久久久| 国产成人精品视频在线| 亚洲美女中文字幕| 久久久久久久久久久91| 日韩国产精品亚洲а∨天堂免| 亚洲天堂开心观看| 欧美亚洲另类视频| 亚洲精品影视在线观看| 7777精品视频| 成人写真视频福利网| 国产日韩换脸av一区在线观看| 精品色蜜蜜精品视频在线观看| 亚洲美女av电影| 欧美性猛交xxxx乱大交极品| 色综合老司机第九色激情| 亚洲国产精品电影| 亚洲福利精品在线| 久久久久久久久亚洲| 亚洲国产成人一区| 国产一区二区三区在线观看视频| 日韩在线视频网站| 久久夜色精品国产亚洲aⅴ| 日韩禁在线播放| 久久不射热爱视频精品| 国产精品爽爽爽爽爽爽在线观看| 色偷偷av一区二区三区乱| 亚洲欧美综合区自拍另类| 亚洲欧美国产另类| 久久成人在线视频| 国产美女直播视频一区| 久久国产加勒比精品无码| 亚洲精品ady| 成人夜晚看av| 欧洲亚洲免费在线| 日本精品va在线观看| 国产精品久久久久久久久免费看| 亚洲性69xxxbbb| 日韩免费视频在线观看| 国产精品高清在线| 国产精品久久久久久久久粉嫩av| 欧美黑人极品猛少妇色xxxxx| 欧美日韩激情小视频| 亚洲精品国产精品国产自| 国产综合久久久久| 欧美人成在线视频| www.久久草.com| 欧美一区二区三区免费视| 少妇高潮 亚洲精品| 亚洲欧美制服综合另类| 91欧美精品成人综合在线观看| 国产视频精品一区二区三区| 日本老师69xxx| 久久久国产精品亚洲一区| 热99在线视频| 亚洲欧美国产精品久久久久久久| 国产精品啪视频| 欧美大片免费观看在线观看网站推荐| 一区二区三区无码高清视频| 亚洲一级片在线看| 久久精品国产一区二区电影| 2021久久精品国产99国产精品| 性欧美亚洲xxxx乳在线观看| 日韩欧亚中文在线| 精品久久久一区| 亚洲欧美日韩第一区| 日韩av手机在线看| 久久久噜噜噜久噜久久| 日韩av123| 国产激情综合五月久久| 高跟丝袜一区二区三区| 96精品久久久久中文字幕| 疯狂蹂躏欧美一区二区精品| 深夜福利一区二区| 精品一区电影国产| 日韩h在线观看| 欧美精品生活片| 国产精品高清免费在线观看| 亚洲欧美资源在线| 亚洲视频在线观看视频| 欧美极品美女视频网站在线观看免费| 久热精品视频在线观看| 最新国产精品亚洲| 欧美另类99xxxxx| 91高清视频免费观看| 日韩在线视频免费观看|