IOS後台執行機制 與 動作

2021-06-22 18:40:53 字數 3625 閱讀 8023

注:應用從froeground切換到background只有在支援多工並且執行ios4.0或更新版本系統的裝置上才會發生。所有其它的情況,應用不是切向後台,而是直接終止,並且從記憶體中清除。

應用切向後台background時應該做什麼:

(2)儲存使用者資料和應用狀態資訊。所有沒有儲存的改變都應該在切向background狀態前寫入磁碟以儲存。這一步是必須的,因為你的應用在後台時很有可能因為多種其它原因而被很快kill掉。根據需要你可以在background thread後台執行緒中執行這些操作。

(3)釋放盡可能多的記憶體資源。

依據不同的應用場合,應用切向後台時還有很多其它的事情需要做,比如active狀態的bonjour服務應該暫停,應用應該停止呼叫opengl es函式。

因為前台應用在使用系統資源和硬體時一直比後台應用具有更高的優先權。執行在後台的應用應該對此差異有心理準備,並且在後台執行時要調整它們的訪問資源行為。特別的,當應用切向background時尤其要遵循以下幾點:

(2)在應用掛起suspended之前取消所有bonjour相關的服務。當應用轉向後台,並且在被掛起前,應用應該unregister bonjour服務並且關掉任何和網路服務相關的sockets監聽。掛起的應用是沒法響應這些服務請求的。如果你的應用不關掉這些和bonjour相關的服務,當應用被掛起的時候,系統會自動幫你關掉這些服務。

(3)在基於網路sockets的應用中,需要處理連線失敗的情況。當你的應用因為某些原因而被掛起時,系統可能會拆除socket連線。只要你的應用對盡可能多的網路錯誤情況都有很好的處理,像丟掉訊號等,此類問題不會導致你的應用出現不正常。當應用從後台退出恢復執行時,如果遇到sockets使用錯誤,簡單的重建socket連線即可。

(4)在切向background狀態前儲存應用狀態。在低記憶體告警時,後台應用可能會被清除出記憶體以釋放空間。處於suspended狀態的應用被優先清除記憶體,並且在被清除前不會給出任何通知。因此,當應用切入background狀態前一定要儲存足夠多的應用狀態資訊以便後面恢復時使用。

(5)當切向後台時,釋放所有不再需要的記憶體。如果你的應用保持著乙個很大的記憶體快取物件(比如影象),則切入後台前,釋放所有的對這些快取物件的引用。

(6)在被掛起前停止使用系統共享資源。使用系統共享資源(比如address book或calendar data)的應用,在被掛起前必須停止對這些共享資源的使用。對這些資源的使用,前台應用具有更高的優先使用權,如果發現你的應用在被掛起後還沒有停止對這些共享資源的使用,則應該將被kill掉。

(7)避免更新應用視窗和檢視。當應用處在後台時,應用視窗和檢視是不可見的,所以不需要更新它他。儘管在後台建立和操縱視窗和檢視物件並不會導致應用被kill掉,但是可以考慮將這些工作推遲到應用返回前台時執行。

(8)響應外部附件連線和失去連線通知。針對和外部附件有通訊的應用,當應用切向background狀態時,系統會傳送乙個disconnection通知。應用必須註冊此通知並且使用它去關掉當前的附件訪問session。當應用返回foreground時,會有乙個與之匹配的通知被傳送,給應用提供重新建立session的機會。

(9)切向後台時,清除行為警告相關的資源。為了在應用相互切換之間儲存應用上下文,當應用切向後台時,系統並不自動dismiss action sheets(uiactionsheet)和alert views(uialertview)。由應用設計者去提供具本的清除方案。對於執行在ios4.0版本之前的應用,在退出時action sheets和alerts仍然被dismiss掉,以讓應用的取消處理函式有機會去執行。

(10)切向後台時,移除所有敏感檢視資訊。因為系統會快照應用介面並且生成應用切換動畫,所以帶有敏感資訊的檢視或視窗必須隱藏或移除,具體原因前面已介紹。

///

uibackgroundtaskidentifier

bgtask;

nsuinteger

counter;

- (void

)backgroundhandler ];

// start the long-running task

dispatch_async

(dispatch_get_global_queue

(dispatch_queue_priority_default,0

), ^

}); }

- (void /*

*/printf();

//bool

backgroundaccepted = [[

]setkeepalivetimeout

:600

handler

:^];

if(backgroundaccepted)

[self

backgroundhandler];

} info.plist:

required background modes欄位:

ok就可以看到後台程式在執行了!

步驟:1.在info.plist裡加入uibackgroundmodes鍵,其值為陣列,陣列之一為voip字串:

uibackgroundmodes

voip

2.在程式啟動的時候呼叫- (void)setupbackgroundhandler函式,函式體如下:

#pragma mark - voip

- (void)setupbackgroundhandler

]

)

else

}

else

}

- (void)requestserverhowmanyunreadmessages

}

elseif

}

解說:- (bool)setkeepalivetimeout:(nstimeinterval)timeout handler:(void (^)(void))keepalivehandler

0.要成功呼叫該函式,就必須在info.plist里設uibackgroundmodes鍵的array值之一voip字串.

1.timeout必須》=600

(可以用-backgroundtimeremaining屬性來返回剩餘時間)

4.該函式成功呼叫後,在程式生命週期內有效。

該函式的效果在回到前台的狀況下,依然有效。(因此可以把它當timer使.) 

5.clearkeepalivetimeout函式用來清除handler。

IOS後台執行機制 與 動作

注 應用從froeground切換到background只有在支援多工並且執行ios4.0或更新版本系統的裝置上才會發生。所有其它的情況,應用不是切向後台,而是直接終止,並且從記憶體中清除。應用切向後台background時應該做什麼 2 儲存使用者資料和應用狀態資訊。所有沒有儲存的改變都應該在切向...

iOS後台執行機制

除了上述四項後台功能,系統還提供乙個程式快速切換的功能,這個功能也算是ios多工的一部分。個人觀點,這個功能是ios多工中最先進最有用的功能。它讓程式在最小化的時候僅僅是暫停執行,但並不釋放記憶體,保持程式當前的狀態,這樣當你再次開啟這個程式的時候,程式不需要重新從硬碟 快閃儲存器 中讀出,不需要重...

iOS之runtime執行機制初探

近有個新入職的同事問我關於 runtime機制 的問題,我想可能很多人對這個都不是太清楚,在這裡,和大家分享一下我對於runtime機制的理解。要深入理解runtime,首先要從最基本的類與物件開始,本文將詳細講解oc中類與物件的結構層次,後續將逐漸更新如何利用runtime操作類。所謂runtim...