您好,登錄后才能下訂單哦!
學習 About iOS App Programming 第二天
------App States and Multitasking
對于app開發者,一定要很明確的知道app是運行狀態,如在前臺還是在后臺。因為蘋果系統不想安卓系統那用大方,蘋果系統的系統資源是有很多約束的,app在前臺和在后臺享受的待遇是很大不同。當app在后臺時,app會遭到系統一些限制,這樣為了改善電池的壽命和提高其他在前臺app的用戶體驗。同時蘋果會及時進行通知當在進行前后臺的轉化時。
當我們的app在前臺運行時,系統會實時的為app捕抓觸碰事件。UIKit的基礎框架作了很多工作為傳遞事件。同時可以定制自己想要的響應事件方法。如文本框輸入文字的捕抓。
為了開發一個比較優秀的app,在技術上要對下面進行一定的了解
Managing App State Changes ------ 根據app的狀態做出準確的響應,這樣有利提高用戶體驗和防止數據丟失。
Being a Responsible Background App ------ 當app退到后臺以后,一定了解app能干神馬和將會發生啥。
Processing Queued Notifications at Wakeup Time
Background Execution and Multitasking ------- 了解怎樣在后臺很能工作。
Managing App State Changes
開發出來的app,無論在神馬時候,肯定是3-1表中的一種。app從一種到另一種狀態一定有相應的事件對應。
State | Description |
---|---|
Not running | app 還沒有運行或者起來,處于結束狀態。 |
Inactive | app處于前臺但是當時不能接受事件,這個狀態一般發生在狀態之間的轉換。 |
Active | app處于前臺同時能接受事件 |
Background | app在后臺和執行代碼,大部分的app在這中狀態就是簡單暫停,但是還是有一些app在這個狀態還是能執行一些任務的。 |
Suspended | app退到后臺同時不能執行任務了。當app轉到這種狀態是app就是自動和不能前臺了。大部分時候是保存在內存中。但是當內存吃緊時,app也時候后不猶豫的被槍斃。 |
溫馨提示:在早期的ios版本是不能進入后臺和暫停狀態的。同時一些設備不支持多任務和后臺執行任務。這些是從ios4開始的。
The App Launch Cycle
當app起來的時候,app從沒有運行的狀態變化到激化狀態和后臺狀態,之間都用短暫通過inactive state。作為啟動周期的一部分,系統創建了一個流程和主線程對于app調用app的主要方法。這些主要方法都來至于xcode項目的control。如app基本配置。
Responding to Interruptions
1 當一個報警級別的中斷發生了,比如一個電話打進來了。app臨時轉變成inactive state,這樣促使用去去選擇接下來這樣處理進程。這個app一直停留在未激活的狀態,直到放棄這個報警級別的事情。在這個時候既可以轉到激活狀態或者后臺。
2 在ios5中,通知是展示一個"條幅",同時app不會進入到未激活狀態,這樣只是提醒用戶來了新的信息。同時用戶可以通過這個消息進入其他app,讓當前的app處于后臺或者未激活狀態。
3 當按了Sleep/Wake button,app將退到非激活狀態,當用戶按了這個按鈕以后,系統將不能接受觸摸事件了,同時app會進入后臺。
Moving to the Background
當用戶觸發了進入后臺的事件,如啟動其他app,home按鈕等等,app將會先調applicationWillResignActive:這個代理方法,然后調用applicationDidEnterBackground:代理方法。所以當app在進入后臺之前需要做一些事情的時候,在這個兩個代理方法實現就行了。
app用applicationDidEnterBackground:這個代理方法能實現做進入后臺的準備工作。如
保存用戶數據和app狀態信息
釋放內存
Memory Usage for Background Apps
開發者在設計app時一定要知道當app進入后臺以后釋放內存。雖然系統會盡量會保存一些app在內存中。但是當內存警告的時候還是會強行要app釋放。
在開發的過程中,我們一定要記住之時的移除強引用對象,這樣方便內存空間的再次利用。同時當我們為了提高用戶體驗,把一些對象放到內存中去執行,當我們的app進入后臺時一定要記得把這樣的對象從內存中移除。
比如:照片,語音數據。
系統為了幫助app減少app所用內存,系統會自動的清理一些數據,在進入后臺前。
Returning to the Foreground
pplicationDidBecomeActive,這個兩個代理方法結束以后,app就是到前臺了
Processing Queued Notifications at Wakeup Time
app進入暫停的狀態是必須去準備一個操作任何消息的隊列當它重返前臺或者后臺執行狀態。雖然app在暫停狀態不能執行任何代碼,但是為了確保不丟失方向的改變信息。系統的隊列把這些改變信息進行記錄。當app再次可以執行代碼時,把這些信息傳給app。
消息隊列將用主線程給app發送消息,同時它將在任何觸摸事件和用戶輸入之前。大多數app應該能響應這些事件。
app主run loop是用來連續響應所有用戶相關的事件,UIApplication對象在起來的時間就是生成了一個run loop,它在app的主線程中。這樣保證了的用戶相關的事件能得到連續的響應。
ios4以后,多任務可以在后臺運行app,但是為了保護電池,很多app在進入后臺以后就會暫停服務。
盡可能不要讓app在后臺運行,如果app必須要在后臺運行時。如:
需要完成至少一個認為對特定的用戶。
需要執行一個簡單定長的任務。
需要通知用戶一些警告級別的信息。
系統會盡可能的多保留app在內存中,但是內存吃緊的時候,系統會殺掉他們。留出足夠的內存給前臺的app,這樣必須前臺app能得到較好的用戶體驗。
對一些特殊的app需要很長的時間在后臺執行,因為開發者需要獲得一些特定的權限,讓app可以在后臺長時間,一下一些情況可以申請:
播放音頻內容的app,想音樂播放器。
語音記錄app。
VoIP app
需要后臺下載的任務
系統一個app主線程,同時app自己可以創立其他線程去做其他任務。蘋果比較推薦用gcd和operation queue,創立自己的線程的好處是讓主線程去處理事件相應。
開發者應該使用隊列無論什么時候需要從主線程中脫離出來執行任務。讓主線程處理事件和畫圖事件。開發者不必一定執行在主線程上。比如app在等待網絡回調時,這樣就可以放在queue執行。
多線程的另一個好處是可以將任務移植到非主線程中,這樣app在起來的時候,主線程去進行初始化和開始相應事件,不會影響用戶體驗。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。