應用可以在該方法中完成轉入後台前需要做的準備工作,所有的應用需要做以下事情。
釋放所有可以釋放的記憶體。
儲存使用者資料或狀態資訊,所有沒寫入磁碟的檔案或資訊,在進入後台之前,都應該寫入磁碟,因為程式可能在後台被殺死。
當程式進入後台之後,為了確保獲得最佳的使用者體驗,建議釋放那些占用記憶體較大且可以重新獲取的資源----
這是因為當應用處於後台時,ios系統會優先終止那些占用記憶體大的應用。如果應用盡可能釋放其所占用的記憶體,
那麼應用就可以在後台存或更久。從這個角度來看,可以得到乙個結論:應用暫停時所占用的記憶體減少,ios徹底終止該應用的風險就越低。
如果應用沒有啟用arc機制,程式需要在應用進入後台時,將那些需要釋放的資源的引用計數變為0,從而讓系統**這些資源。
當應用轉入前台時,系統需要重新恢復這些資源。
如果應用啟用了arc機制,程式只要在應用進入後台時,將應用那些需要釋放的資源的變數賦為nil即可。當應用轉入前台時,
系統需要重新恢復這些資源。**
片段// 使用預設的通知中心監聽應用轉入前台的過程
// 從而激發enterfore:方法
// 使用預設的通知中心監聽應用轉入前台的過程
// 從而激發enterfore:方法
說明上面程式控制當應用轉入前台時,該檢視控制器的enterfore:方法被呼叫;當應用轉入後台時,該控制器的enterback:方法被呼叫,下面是enterback:方法的**
- (void) enterback:(nsnotification *)notification
nslog(@」—enterback---」);
// 轉入後台時將可以迅速重建,而且占用記憶體較大的物件設為nil,以便系統釋放記憶體
bglayer1.contents = nil;
bglayer2.contents = nil;
eplaneimage1 = nil;
說明由於該應用已經啟用了arc機制,因此上面方法只要將這些、**資源的變數設為nil,系統就可以**這些、**資源所占用的記憶體。
**片段
- (void) enterfore:(nsnotification *)notification
nslog(@」===enterfore===」);
bglayer1.contents = (id)[bgimage cgimage];
bglayer2.contents = (id)[bgimage cgimage];
eplaneimage1 = [uiimage imagenamed:@」e1」];
說明通過上面的處理方法,程式可以在應用轉入後台時釋放大部分記憶體,使得該應用在後台以少量記憶體執行,從而降低該應用被ios系統終止的風險。當該應用轉入前台時,系統將會再次初始化 這些資源,從而保證ios應用可以迅速恢復。
當應用進入後台時,如果程式有一些狀態資料沒有儲存,而ios系統可能在記憶體緊張時終止該應用,那麼就可能導致該應用丟失這些狀態資料。
為了讓應用不會丟失狀態資料,程式可以在應用轉入後台時記錄應用狀態,應用轉入後台時將會呼叫檢視控制器的enterback:方法,因此在該方法後面增加如下**:
// 使用nsuserdefaults儲存系統積分
[[nsuserdefaults standarduserdefaults] setinteger:score forkey:@」score」];
上面的**只是簡單地使用了nsuserdefault來儲存程式狀態。如果程式需要儲存的狀態資料較多,也可採用plist屬性檔案或者其他形式來儲存程式狀態。
接下來同樣可以在應用轉入前台時恢復程式狀態,應用轉入前台時將會呼叫檢視控制器的enterfore:方法,因此在該方法後面增加如下**:
// 使用nsuserdefaults讀取系統已經儲存的積分
nsnumber* scorenumber;
if((scorenumber = [[nsuserdefault standarduserdefaults]
objectforkey:@」score」]))
score = scorenumber.integervalue;
為了請求更多的後台時間,按如下步驟執行:
2.呼叫dispatch_async()方法將指定**塊提交給後台執行.
下面是該應用的檢視控制器類的實現部分**
viewcontroller.m
@implementation viewcontroller
- (void)viewdidload
[super viewdidload];
// 使用預設的通知中心監聽應用轉入後台的過程
// 從而激發enterback:方法
[[nsnotificationcenter defaultcenter] addobserve:self
selector:@selector(enterback:)
- (void)enterback:(nsnotification *)notification
// 定義乙個uibackgroundtaskidentifier型別(本質就是nsuinteger)的變數
// 該變數將作為後台任務的識別符號
__block uibackgroundtaskidentifier backtaskid;
nslog(@」===在額外申請的10分鐘內依然沒有完成任務===」);
// 結束後台任務
if(backtaskid == uibackgroundtaskinvalid)
nslog(@」===ios版本不支援後台執行,後台任務啟動失敗===」);
return;
// 將**塊以非同步方式提交給系統的全域性併發佇列
dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0)
nslog(@」===額外申請的後台任務時間為: %f===」
// 其他記憶體清理的**也可以在此處完成
for(int i = 0 ; i < 100 ; i++)
[nsthread sleepfortimeinterval:10];
nslog(@」===剩餘的後台任務時間為: %f===」
// 結束後台任務
@end
IOS 無限後台執行
1.audio。2.location gps。3.voip。4.newsstand。5.exernal accessory uibackgroundmodes voip 我測試了以下 定義乙個 void backgroundhandler start the long running task di...
IOS 無限後台執行
1.audio。2.location gps。3.voip。4.newsstand。5.exernal accessory uibackgroundmodes voip 我測試了以下 定義乙個 void backgroundhandler start the long running task di...
iOS 後台執行 型別
ios後台執行,需要有特定的型別才可以進行。這些內容並不是一直不變的,蘋果也在逐步的更新這些內容。本文內容是2015年11月03日時蘋果支援的後台執行型別。其中較為重要的是下面這張表,我已截圖出來。解釋一下 2.位置更新 3.voip 5.使用external accessory framework...