優(yōu)秀的體驗(yàn)來(lái)自于優(yōu)秀的性能,而優(yōu)秀的性能無(wú)非就是從這么幾個(gè)方面著手:降低耗電量、減少CPU使用、CPU使用均衡、及時(shí)回收內(nèi)存、避免頻繁GC、使設(shè)備及時(shí)休眠。
這里列舉一些具體實(shí)施時(shí)的切入點(diǎn)。
AlarmManager
不要不做限制地使用定時(shí)器,要根據(jù)場(chǎng)景選擇性地注冊(cè)并及時(shí)注銷(xiāo)定時(shí)器。比如,依賴(lài)網(wǎng)絡(luò)條件的應(yīng)該使用SyncAdapter;用戶注銷(xiāo)后,記得注銷(xiāo)定時(shí)器等。
另外,定時(shí)器的周期最好控制在15分鐘以上,這個(gè)是Android官方給出的經(jīng)驗(yàn)值,再頻繁的話,對(duì)待機(jī)電量消耗的影響就會(huì)明顯變大了。
關(guān)于定時(shí)器的模式。wakeup的好處是可以對(duì)用戶關(guān)心的狀態(tài)及時(shí)更新,但會(huì)打斷機(jī)器休眠,如果很頻繁的話,會(huì)使用機(jī)器睡不下去,耗電量明顯上升。非wakeup的好處就是比較省電,但會(huì)把所有的任務(wù)集中到用戶喚醒機(jī)器的那一剎那來(lái)執(zhí)行,從而造成用戶喚醒機(jī)器時(shí)的卡頓。
Wake Lock
除了像視頻播放這種即使用戶長(zhǎng)時(shí)間不操作也需要保持在前臺(tái)的程序,實(shí)質(zhì)上很少有申請(qǐng)Wake Lock的需求。另外,一旦程序退出前臺(tái),記得釋放。
Broadcast
通過(guò)AndroidManifest.xml靜態(tài)聲明的全局廣播接收器是耗電大戶??赡軙?huì)有很多程序注冊(cè)像“網(wǎng)絡(luò)狀態(tài)改變”、“電話狀態(tài)”、“設(shè)置解鎖”等常見(jiàn)事件。那么,在這些事件發(fā)生時(shí)會(huì)觸發(fā)多個(gè)進(jìn)程創(chuàng)建,頻繁的GC,卡頓也就來(lái)了。所以,請(qǐng)盡量使用動(dòng)態(tài)注冊(cè)。
另外,“網(wǎng)絡(luò)狀態(tài)改變”可以使用Android提供的SyncAdapter來(lái)實(shí)現(xiàn)低成本的監(jiān)聽(tīng)。
Receiver的進(jìn)程配置也有些技巧。如果Receiver需要喚醒UI進(jìn)程,就把它和UI配置到一個(gè)進(jìn)程當(dāng)中,如果需要喚醒后臺(tái)服務(wù),就把它和后臺(tái)服務(wù)配置到一個(gè)進(jìn)程當(dāng)中??梢詼p少系統(tǒng)創(chuàng)建進(jìn)程的開(kāi)銷(xiāo)。
后臺(tái)服務(wù)
把后臺(tái)服務(wù)單獨(dú)做為一個(gè)進(jìn)程,可以大大減少UI進(jìn)程的內(nèi)存壓力。如果把它們放到一個(gè)進(jìn)程中,只要它們中的任意一個(gè)沒(méi)有完成任務(wù),它們倆都會(huì)一直存在于內(nèi)存中。
長(zhǎng)連接
長(zhǎng)連接意味著需要保持網(wǎng)絡(luò)連接、周期性的心跳數(shù)據(jù)傳輸、設(shè)備無(wú)法休眠,使用需謹(jǐn)慎。
Bitmap
在Java的設(shè)計(jì)中沒(méi)有釋放內(nèi)存這個(gè)概念的,但實(shí)際使用中,大對(duì)象除外。Android中的Bitmap就是這么一個(gè)例外。Bitmap的不及時(shí)回收會(huì)造成內(nèi)存的彪升。詳細(xì)的分析可以參考這篇文章。
Bitmap recycle方法與制作Bitmap的內(nèi)存緩存:
http://blog.csdn.net/a345017062/article/details/7963081
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。