Android服務開發經驗——優雅地活着 by個推推送

具體來講,就是要作到兩點:
1. 儘量運行
2. 儘量省電
segmentfault

看似尋常的道理,實現起來還真不容易,下面一個個來看:網絡

儘量運行
Android系統會根據當前資源情況(主要是內存空閒的狀況)對後臺服務進行不按期的清理,尤爲是當內存高度緊張時,會出現大堆服務交替處於「正在重啓服務」的狀態。前臺服務能夠避免這個問題的發生,可是前提條件是你須要在通知欄顯示一個置頂的沒法清除的碩大的通知欄。若是你的應用恰巧是相似墨跡天氣或者360這樣正好須要一直給用戶展現這樣的一個通知欄,那麼恭喜你,你能夠忽略這個頭痛的進程回收問題;可是對大多數後臺服務來講,顯示這樣的通知並不合適。你能夠嘗試修改服務優先級,可是在大多數手機上並不會有什麼本質上的變化。
另一個須要考慮的問題是用戶愈來愈頻繁的「一鍵清理」操做,不管是系統內置的一鍵清理功能,仍是經過360、獵豹等提供的一鍵清理,都會增長服務殺死或重啓的概率。固然,若是你的應用有正當理由請求用戶授予root權限,那麼太好了,一樣也能夠經過各類你懂的方式確保你的Service正常運行。
圖片描述優化


儘量省電
上面說到經過AlarmManager和Wakelock來確保Service的正常運行,然而頻繁地喚醒系統以及用Wakelock鎖定CPU就像是喝酒,適時適量有益身心健康,過分沉迷就會危及生命。一旦管理出問題,手機耗電量就會直線上升。目前多數手機廠商都是使用平均電流來評估應用的耗電量,即計算必定時間內未安裝應用和安裝應用狀況下整機平均電流,兩值相減即爲應用的平均電流。一般Android手機待機狀態下平均電流在8mA左右,若是你但願你的應用內置到某款手機上,對不起,手機廠商對於耗電問題毫不手軟,高於5mA平均電流消耗的應用一般是沒法被接受的。以下圖那樣若是長時間工做致使持續高電流,會成倍增長應用的平均電流值。spa

爲了更好地在耗電方面進行優化,首先須要瞭解到每喚醒一次AP核,都會帶來一段時間的固定開銷(多是幾百ms),而後再從新休眠,即便你什麼也不作。其次,喚醒後的耗電,通常只與工做時長有關,與工做強度關係不大,就我目前所知大多數ARM芯片尚未相似Intel芯片那種調頻功能。
此外,負責網絡處理的CP核的開啓須要很是當心,由於CP核是耗電大戶,並且爲了提升網絡通信效率,CP核開啓後會保持比AP核更長的工做時間,根據手機和網絡類型的不一樣,多是1到5s甚至是更長時間。最後,也是最好理解的,每開啓一個外設,都會額外增長耗電。
因此,優化的措施主要就是儘量減小喚醒的頻率,以及進行任務合併,尤爲是網絡相關的操做,儘可能合併到同一時間內處理。在文件IO(尤爲是網絡IO)期間,AP核若是無所事事,就儘可能不要佔用Wakelock,釋放出來。當有網絡事件須要處理時,CP負責喚醒AP,進行後續操做。要實現這點很不容易,根據業務需求,程序結構上須要作很細緻的規劃。最後就是,儘可能別碰其餘的外設。orm

下面來看一下國內專業推送服務商 「個推」是怎麼作的,做爲專一推送三週年領先者,個推的作法是:1,開啓流量合併通道。目前,大多第三方信息推送採用的方式是,爲應用開發者提供SDK包嵌入應用程序來實現信息的推送。因而,每一個用戶的手機裏可能會有多個應用都包含了個推的SDK,也就是服務通道。這樣,每一個SDK在信息推送過程當中,都會消耗一小部分的流量。個推能夠自動將這樣的多個推送服務通道合併,只開啓一個通道便可。2,增量更新下載,,通常當應用有新版本時,咱們都須要下載一個全新的安裝包,個推推送的應用版本更新通知時,只要升級差量部分便可,也起到很好的省電省流量的效果。進程

結束
沒有一個應用但願本身長期佔據軟件耗電排行榜首,若是應用再也不前臺運行的時候也想作點有意義的事,就須要很是謹慎。若是每一個應用都不顧他人的感覺在手機上盡情撒野,那麼總會有人站出來把這樣的熊孩子揪出來幹掉的。資源是你們的,請珍惜每1mAh的電。事件

相關文章
相關標籤/搜索