溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

學(xué)習(xí) About iOS App Programming 第二天

發(fā)布時(shí)間:2020-07-31 20:27:19 來(lái)源:網(wǎng)絡(luò) 閱讀:486 作者:hard_ac 欄目:移動(dòng)開(kāi)發(fā)

學(xué)習(xí) About iOS App Programming 第二天

------App States and Multitasking

    對(duì)于app開(kāi)發(fā)者,一定要很明確的知道app是運(yùn)行狀態(tài),如在前臺(tái)還是在后臺(tái)。因?yàn)樘O果系統(tǒng)不想安卓系統(tǒng)那用大方,蘋果系統(tǒng)的系統(tǒng)資源是有很多約束的,app在前臺(tái)和在后臺(tái)享受的待遇是很大不同。當(dāng)app在后臺(tái)時(shí),app會(huì)遭到系統(tǒng)一些限制,這樣為了改善電池的壽命和提高其他在前臺(tái)app的用戶體驗(yàn)。同時(shí)蘋果會(huì)及時(shí)進(jìn)行通知當(dāng)在進(jìn)行前后臺(tái)的轉(zhuǎn)化時(shí)。

當(dāng)我們的app在前臺(tái)運(yùn)行時(shí),系統(tǒng)會(huì)實(shí)時(shí)的為app捕抓觸碰事件。UIKit的基礎(chǔ)框架作了很多工作為傳遞事件。同時(shí)可以定制自己想要的響應(yīng)事件方法。如文本框輸入文字的捕抓。

為了開(kāi)發(fā)一個(gè)比較優(yōu)秀的app,在技術(shù)上要對(duì)下面進(jìn)行一定的了解

    
    Managing App State Changes ------ 根據(jù)app的狀態(tài)做出準(zhǔn)確的響應(yīng),這樣有利提高用戶體驗(yàn)和防止數(shù)據(jù)丟失。

    Being a Responsible Background App ------ 當(dāng)app退到后臺(tái)以后,一定了解app能干神馬和將會(huì)發(fā)生啥。

    Processing Queued Notifications at Wakeup Time 

    Background Execution and Multitasking ------- 了解怎樣在后臺(tái)很能工作。


Managing App State Changes


開(kāi)發(fā)出來(lái)的app,無(wú)論在神馬時(shí)候,肯定是3-1表中的一種。app從一種到另一種狀態(tài)一定有相應(yīng)的事件對(duì)應(yīng)。


Table 3-1  App states

State

Description

Not running

app 還沒(méi)有運(yùn)行或者起來(lái),處于結(jié)束狀態(tài)。

Inactive

app處于前臺(tái)但是當(dāng)時(shí)不能接受事件,這個(gè)狀態(tài)一般發(fā)生在狀態(tài)之間的轉(zhuǎn)換。

Active

app處于前臺(tái)同時(shí)能接受事件

Background

app在后臺(tái)和執(zhí)行代碼,大部分的app在這中狀態(tài)就是簡(jiǎn)單暫停,但是還是有一些app在這個(gè)狀態(tài)還是能執(zhí)行一些任務(wù)的。

Suspended

app退到后臺(tái)同時(shí)不能執(zhí)行任務(wù)了。當(dāng)app轉(zhuǎn)到這種狀態(tài)是app就是自動(dòng)和不能前臺(tái)了。大部分時(shí)候是保存在內(nèi)存中。但是當(dāng)內(nèi)存吃緊時(shí),app也時(shí)候后不猶豫的被槍斃。


溫馨提示:在早期的ios版本是不能進(jìn)入后臺(tái)和暫停狀態(tài)的。同時(shí)一些設(shè)備不支持多任務(wù)和后臺(tái)執(zhí)行任務(wù)。這些是從ios4開(kāi)始的。


The App Launch Cycle


當(dāng)app起來(lái)的時(shí)候,app從沒(méi)有運(yùn)行的狀態(tài)變化到激化狀態(tài)和后臺(tái)狀態(tài),之間都用短暫通過(guò)inactive state。作為啟動(dòng)周期的一部分,系統(tǒng)創(chuàng)建了一個(gè)流程和主線程對(duì)于app調(diào)用app的主要方法。這些主要方法都來(lái)至于xcode項(xiàng)目的control。如app基本配置。

Responding to Interruptions


1 當(dāng)一個(gè)報(bào)警級(jí)別的中斷發(fā)生了,比如一個(gè)電話打進(jìn)來(lái)了。app臨時(shí)轉(zhuǎn)變成inactive state,這樣促使用去去選擇接下來(lái)這樣處理進(jìn)程。這個(gè)app一直停留在未激活的狀態(tài),直到放棄這個(gè)報(bào)警級(jí)別的事情。在這個(gè)時(shí)候既可以轉(zhuǎn)到激活狀態(tài)或者后臺(tái)。

2 在ios5中,通知是展示一個(gè)"條幅",同時(shí)app不會(huì)進(jìn)入到未激活狀態(tài),這樣只是提醒用戶來(lái)了新的信息。同時(shí)用戶可以通過(guò)這個(gè)消息進(jìn)入其他app,讓當(dāng)前的app處于后臺(tái)或者未激活狀態(tài)。


3 當(dāng)按了Sleep/Wake button,app將退到非激活狀態(tài),當(dāng)用戶按了這個(gè)按鈕以后,系統(tǒng)將不能接受觸摸事件了,同時(shí)app會(huì)進(jìn)入后臺(tái)。

Moving to the Background


當(dāng)用戶觸發(fā)了進(jìn)入后臺(tái)的事件,如啟動(dòng)其他app,home按鈕等等,app將會(huì)先調(diào)applicationWillResignActive:這個(gè)代理方法,然后調(diào)用applicationDidEnterBackground:代理方法。所以當(dāng)app在進(jìn)入后臺(tái)之前需要做一些事情的時(shí)候,在這個(gè)兩個(gè)代理方法實(shí)現(xiàn)就行了。


What to Do When Moving to the Background


app用applicationDidEnterBackground:這個(gè)代理方法能實(shí)現(xiàn)做進(jìn)入后臺(tái)的準(zhǔn)備工作。如

  • 保存用戶數(shù)據(jù)和app狀態(tài)信息

  • 釋放內(nèi)存

Memory Usage for Background Apps

開(kāi)發(fā)者在設(shè)計(jì)app時(shí)一定要知道當(dāng)app進(jìn)入后臺(tái)以后釋放內(nèi)存。雖然系統(tǒng)會(huì)盡量會(huì)保存一些app在內(nèi)存中。但是當(dāng)內(nèi)存警告的時(shí)候還是會(huì)強(qiáng)行要app釋放。

在開(kāi)發(fā)的過(guò)程中,我們一定要記住之時(shí)的移除強(qiáng)引用對(duì)象,這樣方便內(nèi)存空間的再次利用。同時(shí)當(dāng)我們?yōu)榱颂岣哂脩趔w驗(yàn),把一些對(duì)象放到內(nèi)存中去執(zhí)行,當(dāng)我們的app進(jìn)入后臺(tái)時(shí)一定要記得把這樣的對(duì)象從內(nèi)存中移除。

比如:照片,語(yǔ)音數(shù)據(jù)。

系統(tǒng)為了幫助app減少app所用內(nèi)存,系統(tǒng)會(huì)自動(dòng)的清理一些數(shù)據(jù),在進(jìn)入后臺(tái)前。

Returning to the Foreground


當(dāng)app重返前臺(tái)時(shí),會(huì)重啟因?yàn)榈胶笈_(tái)而停止的任務(wù)。回到前臺(tái)的流程是先會(huì)調(diào)用applicationWillEnterForeground,然后在調(diào)用applicationDidBecomeActive,這個(gè)兩個(gè)代理方法結(jié)束以后,app就是到前臺(tái)了


Processing Queued Notifications at Wakeup Time


app進(jìn)入暫停的狀態(tài)是必須去準(zhǔn)備一個(gè)操作任何消息的隊(duì)列當(dāng)它重返前臺(tái)或者后臺(tái)執(zhí)行狀態(tài)。雖然app在暫停狀態(tài)不能執(zhí)行任何代碼,但是為了確保不丟失方向的改變信息。系統(tǒng)的隊(duì)列把這些改變信息進(jìn)行記錄。當(dāng)app再次可以執(zhí)行代碼時(shí),把這些信息傳給app。


消息隊(duì)列將用主線程給app發(fā)送消息,同時(shí)它將在任何觸摸事件和用戶輸入之前。大多數(shù)app應(yīng)該能響應(yīng)這些事件。


The Main Run Loop

app主run loop是用來(lái)連續(xù)響應(yīng)所有用戶相關(guān)的事件,UIApplication對(duì)象在起來(lái)的時(shí)間就是生成了一個(gè)run loop,它在app的主線程中。這樣保證了的用戶相關(guān)的事件能得到連續(xù)的響應(yīng)。


Background Execution and Multitasking

ios4以后,多任務(wù)可以在后臺(tái)運(yùn)行app,但是為了保護(hù)電池,很多app在進(jìn)入后臺(tái)以后就會(huì)暫停服務(wù)。

盡可能不要讓app在后臺(tái)運(yùn)行,如果app必須要在后臺(tái)運(yùn)行時(shí)。如:

    需要完成至少一個(gè)認(rèn)為對(duì)特定的用戶。

    需要執(zhí)行一個(gè)簡(jiǎn)單定長(zhǎng)的任務(wù)。

    需要通知用戶一些警告級(jí)別的信息。


系統(tǒng)會(huì)盡可能的多保留app在內(nèi)存中,但是內(nèi)存吃緊的時(shí)候,系統(tǒng)會(huì)殺掉他們。留出足夠的內(nèi)存給前臺(tái)的app,這樣必須前臺(tái)app能得到較好的用戶體驗(yàn)。


Implementing Long-Running Background Tasks


對(duì)一些特殊的app需要很長(zhǎng)的時(shí)間在后臺(tái)執(zhí)行,因?yàn)殚_(kāi)發(fā)者需要獲得一些特定的權(quán)限,讓app可以在后臺(tái)長(zhǎng)時(shí)間,一下一些情況可以申請(qǐng):


播放音頻內(nèi)容的app,想音樂(lè)播放器。

語(yǔ)音記錄app。

VoIP app

需要后臺(tái)下載的任務(wù)


Concurrency and Secondary Threads

系統(tǒng)一個(gè)app主線程,同時(shí)app自己可以創(chuàng)立其他線程去做其他任務(wù)。蘋果比較推薦用gcd和operation queue,創(chuàng)立自己的線程的好處是讓主線程去處理事件相應(yīng)。

開(kāi)發(fā)者應(yīng)該使用隊(duì)列無(wú)論什么時(shí)候需要從主線程中脫離出來(lái)執(zhí)行任務(wù)。讓主線程處理事件和畫(huà)圖事件。開(kāi)發(fā)者不必一定執(zhí)行在主線程上。比如app在等待網(wǎng)絡(luò)回調(diào)時(shí),這樣就可以放在queue執(zhí)行。

多線程的另一個(gè)好處是可以將任務(wù)移植到非主線程中,這樣app在起來(lái)的時(shí)候,主線程去進(jìn)行初始化和開(kāi)始相應(yīng)事件,不會(huì)影響用戶體驗(yàn)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI