2019-09-09
Android應用程序的生(shēng)命周期;
在大(dà)部份情況下(xià),每個Android應用都将運行在自己的Linux進程當中(zhōng)。當這個應用的某些代碼需要執行時,進程就會被創建,并且将保持運行,直到該進程不再需要,而系統需要釋放(fàng)它所占用的内存,爲其他應用所用時,才停止。
Android一(yī)個重要并且特殊的特性就是,一(yī)個應用的進程的生(shēng)命周期不是由應用自身直接控制的,而是由系統,根據運行中(zhōng)的應用的一(yī)些特征來決定的,包括:這些應用對用戶的重要性、系統的全部可用内存。
對于應用開(kāi)發者來說,理解不同的應用組件(特别是Activity、Service、Intent Receiver)對應用進程的生(shēng)命周期的影響,這是非常重要的。如果沒有正确地使用這些組件,将會導緻當應用正在處理重要的工(gōng)作時,進程卻被系統消毀的後果。
對于進程生(shēng)命周期,一(yī)個普遍的錯誤就是:當一(yī)個Intent Receiver在它的onReceiveIntent()方法中(zhōng),接收到一(yī)個intent後,就會從這個方法中(zhōng)返回。而一(yī)旦從這個方法返回後,系統将會認爲這個Intent Receiver不再處于活動狀态了,也就會認爲它的宿主進程不需要了(除非宿主進程中(zhōng)還存在其它的應用組件)。從而,系統随時都會消毀這個進程,收回内存,并中(zhōng)止其中(zhōng)還在運行的子線程。問題的解決辦法就是,在IntentReceiver中(zhōng),啓動一(yī)個Service,這樣系統就會知(zhī)道在這個進程中(zhōng),還有活動的工(gōng)作正在執行。
爲了決定在内存不足情況下(xià)消毀哪個進程,Android會根據這些進程内運行的組件及這些組件的狀态,把這些進程劃分(fēn)出一(yī)個“重要性層次”。這個層次按順序如下(xià):
1、前端進程是擁有一(yī)個顯示在屏幕最前端并與使用者做交互的Activity(它的onResume已被調用)的進程,也可能是一(yī)個擁有正在運行的IntentReceiver(它的onReceiveIntent()方法正在運行)的進程。在系統中(zhōng),這種進程是很少的,隻有當内存低到不足于支持這些進程的繼續運行,才會将這些進程消毀。通常這時候,設備已經達到了需要進行内存整理的狀态,爲了保障用戶界面不停止響應,隻能消毀這些進程;
2、可視進程是擁有一(yī)個用戶在屏幕上可見的,但并沒有在前端顯示的Activity(它的onPause已被調用)的進程。例如:一(yī)個以對話(huà)框顯示的前端activity在屏幕上顯示,而它後面的上一(yī)級activity仍然是可見的。這樣的進程是非常重要的,一(yī)般不會被消毀,除非爲了保障所有的前端進程正常運行,才會被消毀。
3、服務進程是擁有一(yī)個由startService()方法啓動的Service的進程。盡管這些進程對于使用者是不可見的,但他們做的通常是使用者所關注的事情(如後台MP3播放(fàng)器或後台上傳下(xià)載數據的網絡服務)。因此,除非爲了保障前端進程和可視進程的正常運行,系統才會消毀這種進程。
4、後台進程是擁有一(yī)個用戶不可見的Activity(onStop()方法已經被調用)的進程。這些進程不直接影響用戶的體(tǐ)驗。如果這些進程正确地完成了自己的生(shēng)命周期(詳細參考Activity類),系統會爲了以上三種類型進程,而随時消毀這種進程以釋放(fàng)内存。通常會有很多這樣的進程在運行着,因些這些進程會被保存在一(yī)個LRU列表中(zhōng),以保證在内存不足時,用戶最後看到的進程将在最後才被消毀。
5、空進程是那些不擁有任何活動的應用組件的進程。保留這些進程的唯一(yī)理由是,做爲一(yī)個緩存,在它所屬的應用的組件下(xià)一(yī)次需要時,縮短啓動的時間。同樣的,爲了在這些緩存的空進程和底層的核心緩存之間平衡系統資(zī)源,系統會經常消毀這些空進程。
當要對一(yī)個進程進行分(fēn)類時,系統會選擇在這個進程中(zhōng)所有活動的組件中(zhōng)重要等級最高的那個做爲依據。可以參考Activity、Service、IntentReceiver文檔,了解這些組件如何影響進程整個生(shēng)命周期的更多細節。這些類的文檔都對他們如何影響他們所屬的應用的整個生(shēng)命周期,做了詳細的描述。
針對移動端的網絡優化,适用 Android,同樣适用于 iOS 和 H5
一(yī)個網絡請求可以簡單分(fēn)爲連接服務器 -> 獲取數據兩個部分(fēn)。
其中(zhōng)連接服務器前還包括 DNS 解析的過程;獲取數據後可能會對數據進行緩存。
一(yī)、連接服務器優化策略
1. 不用域名,用 IP 直連
省去(qù) DNS 解析過程,DNS 全名 Domain Name System,解析意指根據域名得到其對應的 IP 地址。 如 http://www.codekk.com 的域名解析結果就是 104.236.147.76。
首次域名解析一(yī)般需要幾百毫秒,可通過直接向 IP 而非域名請求,節省掉這部分(fēn)時間,同時可以預防域名劫持等帶來的風險。
當然爲了安全和擴展考慮,這個 IP 可能是一(yī)個動态更新的 IP 列表,并在 IP 不可用情況下(xià)通過域名訪問。
2. 服務器合理部署
服務器多運營商(shāng)多地部署,一(yī)般至少含三大(dà)運營商(shāng)、南(nán)中(zhōng)北(běi)三地部署。
配合上面說到的動态 IP 列表,支持優先級,每次根據地域、網絡類型等選擇最優的服務器 IP 進行連接。
對于服務器端還可以調優服務器的 TCP 擁塞窗口大(dà)小(xiǎo)、重傳超時時間(RTO)、最大(dà)傳輸單元(MTU)等。
二、獲取數據優化策略
1. 連接複用
節省連接建立時間,如開(kāi)啓 keep-alive。
Http 1.1 默認啓動了 keep-alive。對于 Android 來說默認情況下(xià) HttpURLConnection 和 HttpClient 都開(kāi)啓了 keep-alive。隻是 2.2 之前 HttpURLConnection 存在影響連接池的 Bug,具體(tǐ)可見:Android HttpURLConnection 及 HttpClient 選擇
2. 請求合并
即将多個請求合并爲一(yī)個進行請求,比較常見的就是網頁中(zhōng)的 CSS Image Sprites。 如果某個頁面内請求過多,也可以考慮做一(yī)定的請求合并。
3. 減小(xiǎo)請求數據大(dà)小(xiǎo)
(1) 對于 POST 請求,Body 可以做 Gzip 壓縮,如日志(zhì)。
(2) 對請求頭進行壓縮
這個 Http 1.1 不支持,SPDY 及 Http 2.0 支持。 Http 1.1 可以通過服務端對前一(yī)個請求的請求頭進行緩存,後面相同請求頭用 md5 之類的 id 來表示即可。
4. CDN 緩存靜态資(zī)源
緩存常見的圖片、JS、CSS 等靜态資(zī)源。
5. 減小(xiǎo)返回數據大(dà)小(xiǎo)
(1) 壓縮
一(yī)般 API 數據使用 Gzip 壓縮,下(xià)圖是之前測試的 Gzip 壓縮前後對比圖。 android-http-compare
(2) 精簡數據格式
如 JSON 代替 XML,WebP 代替其他圖片格式。關注公衆号 codekk,回複 20 查看關于 WebP 的介紹。
(3) 對于不同的設備不同網絡返回不同的内容 如不同分(fēn)辨率圖片大(dà)小(xiǎo)。
(4) 增量更新
需要數據更新時,可考慮增量更新。如常見的服務端進行 bsdiff,客戶端進行 bspatch。
(5) 大(dà)文件下(xià)載
支持斷點續傳,并緩存 Http Resonse 的 ETag 标識,下(xià)次請求時帶上,從而确定是否數據改變過,未改變則直接返回 304。
6. 數據緩存
緩存獲取到的數據,在一(yī)定的有效時間内再次請求可以直接從緩存讀取數據。
關于 Http 緩存規則 Grumoon 在 Volley 源碼解析最後雜(zá)談中(zhōng)有詳細介紹。
三、其他優化手段
這類優化方式在性能優化系列總篇中(zhōng)已經有過完整介紹
1. 預取
包括預連接、預取數據。
2. 分(fēn)優先級、延遲部分(fēn)請求
将不重要的請求延遲,這樣既可以削峰減少并發、又(yòu)可以和後面類似的請求做合并。
3. 多連接
對于較大(dà)文件,如大(dà)圖片、文件下(xià)載可考慮多連接。 需要控制請求的最大(dà)并發量,畢竟移動端網絡受限。
四、監控
優化需要通過數據對比才能看出效果,所以監控系統必不可少,通過前後端的數據監控确定調優效果。
責任編輯:中(zhōng)山網站建設
【網訊網絡】國家高新技術企業》十年專注軟件開(kāi)發,網站建設,網頁設計,APP開(kāi)發,小(xiǎo)程序,微信公衆号開(kāi)發,定制各類企業管理軟件(OA、CRM、ERP、訂單管理系統、進銷存管理軟件等)!服務熱線:0760-88610046、13924923903,http://www.wansion.net
上一(yī)篇:javascript強制刷新頁面的實現代碼
下(xià)一(yī)篇:java實現多級菜單的方法
*請認真填寫需求,我(wǒ)們會在24小(xiǎo)時内與您取得聯系。