AlarmManager机制和系统唤醒锁的总结
轉(zhuǎn)自?http://blog.csdn.net/d_clock/article/details/42968039
前段時(shí)間,在公司做項(xiàng)目的時(shí)候發(fā)現(xiàn)原有項(xiàng)目中的代碼在Service中使用handler不斷發(fā)送Message到Looper處理MessageQueue中來維持IM功能的“心跳”,心里瞬間覺得這個(gè)地方的代碼很不靠譜,主要原因分為兩個(gè):
1.handler的生命周期和Service不一致,如果Service某個(gè)時(shí)刻被系統(tǒng)回收內(nèi)存殺死了,邏輯上handler應(yīng)該就會(huì)停止心跳包的發(fā)送,但是此時(shí)實(shí)際代碼運(yùn)用中handler依舊可以源源不斷的發(fā)送消息,而且由于handler持有了外部銷毀的Service的引用,造成Service即使被殺但是內(nèi)存不被回收的內(nèi)存泄漏問題也是比較嚴(yán)重的;
2.Android官方的API文檔建議我們,如果要執(zhí)行定時(shí)任務(wù)的話,可以使用AlarmManager來定期執(zhí)行任務(wù),減少喚醒系統(tǒng)時(shí)鐘的次數(shù),從而減少電量的消耗;
針對以上問題,做了一下小小了解,因?yàn)轫?xiàng)目開發(fā)中我對于AlarmManager的使用已經(jīng)相當(dāng)熟悉,但是對系統(tǒng)喚醒鎖的概念還是不是很理解,之前甚至天真的認(rèn)為,只要鎖了屏,系統(tǒng)鎖就不會(huì)被喚醒,亮屏的時(shí)候,系統(tǒng)喚醒鎖才重新喚醒。可是想想又不太對,系統(tǒng)在鎖屏的時(shí)候,如果我們設(shè)置了鬧鐘提醒的功能,時(shí)間到了之后,鬧鐘就會(huì)響起來,這恰恰說明了鎖屏的時(shí)候系統(tǒng)鎖仍舊被喚醒工作,估計(jì)系統(tǒng)提供AlarmManager給開發(fā)者使用,只是為了讓系統(tǒng)喚醒鎖的次數(shù)交給統(tǒng)一的管理者管理,這樣可以降低鎖頻繁被喚醒的幾率,從而達(dá)到節(jié)能的目的,對此我也對AlarmManager和系統(tǒng)時(shí)鐘的概念做了以下一些小小的總結(jié):
Android手機(jī)有兩個(gè)處理器,一個(gè)叫ApplicationProcessor(AP),一個(gè)叫BasebandProcessor(BP)。AP是ARM架構(gòu)的處理器,用于運(yùn)行Linux+Android系統(tǒng);BP用于運(yùn)行實(shí)時(shí)操作系統(tǒng)(RTOS),通訊協(xié)議棧運(yùn)行于BP的RTOS之上。非通話時(shí)間,BP的能耗基本上在5mA左右,而AP只要處于非休眠狀態(tài),能耗至少在50mA以上,執(zhí)行圖形運(yùn)算時(shí)會(huì)更高。另外LCD工作時(shí)功耗在100mA左右,WIFI也在100mA左右。一般手機(jī)待機(jī)時(shí),AP、LCD、WIFI均進(jìn)入休眠狀態(tài),這時(shí)Android中應(yīng)用程序的代碼也會(huì)停止執(zhí)行。Android為了確保應(yīng)用程序中關(guān)鍵代碼的正確執(zhí)行,提供了WakeLock的API,使得應(yīng)用程序有權(quán)限通過代碼阻止AP進(jìn)入休眠狀態(tài)。但如果不領(lǐng)會(huì)Android設(shè)計(jì)者的意圖而濫用Wake Lock API,為了自身程序在后臺(tái)的正常工作而長時(shí)間阻止AP進(jìn)入休眠狀態(tài),就會(huì)成為待機(jī)電池殺手。
首先,完全沒必要擔(dān)心AP休眠會(huì)導(dǎo)致收不到消息推送。通訊協(xié)議棧運(yùn)行于BP,一旦收到數(shù)據(jù)包,BP會(huì)將AP喚醒,喚醒的時(shí)間足夠AP執(zhí)行代碼完成對收到的數(shù)據(jù)包的處理過程。其它的如Connectivity事件觸發(fā)時(shí)AP同樣會(huì)被喚醒。那么唯一的問題就是程序如何執(zhí)行向服務(wù)器發(fā)送心跳包的邏輯。你顯然不能靠AP來做心跳計(jì)時(shí)。Android提供的AlarmManager就是來解決這個(gè)問題的。Alarm應(yīng)該是BP計(jì)時(shí)(或其它某個(gè)帶石英鐘的芯片,不太確定,但絕對不是AP),觸發(fā)時(shí)喚醒AP執(zhí)行程序代碼。那么WakeLock API有啥用呢?比如心跳包從請求到應(yīng)答,比如斷線重連重新登陸這些關(guān)鍵邏輯的執(zhí)行過程,就需要WakeLock來保護(hù)。而一旦一個(gè)關(guān)鍵邏輯執(zhí)行成功,就應(yīng)該立即釋放掉Wake Lock了。兩次心跳請求間隔5到10分鐘,基本不會(huì)怎么耗電。除非網(wǎng)絡(luò)不穩(wěn)定,頻繁斷線重連,那種情況辦法不多。
總結(jié)
以上是生活随笔為你收集整理的AlarmManager机制和系统唤醒锁的总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android OpenGL ES(十)
- 下一篇: 新建linux组、用户命令