Android Wake Lock 機(jī)制

Android為了確保應(yīng)用程序中關(guān)鍵代碼的正確執(zhí)行叽奥,提供了WakeLock的API舱痘,使得應(yīng)用程序有權(quán)限通過(guò)代碼阻止AP進(jìn)入休眠狀態(tài)椅棺。
Wake Lock是一種鎖的機(jī)制, 只要有人拿著這個(gè)鎖,系統(tǒng)就無(wú)法進(jìn)入休眠,可以被用戶(hù)態(tài)程序和內(nèi)核獲得. 這個(gè)鎖可以是有超時(shí)的或者是沒(méi)有超時(shí)的,超時(shí)的鎖會(huì)在時(shí)間過(guò)去以后自動(dòng)解鎖.
如果沒(méi)有鎖了或者超時(shí)了, 內(nèi)核就會(huì)啟動(dòng)休眠的那套機(jī)制來(lái)進(jìn)入休眠.
WakeLock阻止應(yīng)用處理器(ApplicationProcessor)掛起序宦,確保關(guān)鍵代碼的運(yùn)行滥玷,通過(guò)中斷喚起應(yīng)用處理器(ApplicationProcessor)辟癌,可以阻止屏幕變暗寒屯。所有的WakeLock被釋放后,系統(tǒng)會(huì)掛起

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
WakeLock sCpuWakeLock =pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
                                     |PowerManager.ACQUIRE_CAUSES_WAKEUP,"okTag");
if(sCpuWakeLock !=null) {
    sCpuWakeLock.release();
    sCpuWakeLock =null;
}

PARTIAL_WAKE_LOCK:保持CPU運(yùn)轉(zhuǎn)黍少,屏幕和鍵盤(pán)燈有可能是關(guān)閉的寡夹。
SCREEN_DIM_WAKE_LOCK:保持CPU運(yùn)轉(zhuǎn),允許保持屏幕顯示但有可能是灰的厂置,允許關(guān)閉鍵盤(pán)燈
SCREEN_BRIGHT_WAKE_LOCK:保持CPU運(yùn)轉(zhuǎn)菩掏,保持屏幕高亮顯示,允許關(guān)閉鍵盤(pán)燈
FULL_WAKE_LOCK:保持CPU運(yùn)轉(zhuǎn)昵济,保持屏幕高亮顯示智绸,鍵盤(pán)燈也保持亮度
ACQUIRE_CAUSES_WAKEUP:不會(huì)喚醒設(shè)備,強(qiáng)制屏幕馬上高亮顯示访忿,鍵盤(pán)燈開(kāi)啟瞧栗。有一個(gè)例外,如果有notification彈出的話(huà)海铆,會(huì)喚醒設(shè)備迹恐。
ON_AFTER_RELEASE:WakeLock被釋放后,維持屏幕亮度一小段時(shí)間游添,減少WakeLock循環(huán)時(shí)的閃爍情況
如果申請(qǐng)了partialwakelock,那么即使按Power鍵,系統(tǒng)也不會(huì)進(jìn)Sleep,如Music播放時(shí)如果申請(qǐng)了其它的wakelocks,按Power鍵,系統(tǒng)還是會(huì)進(jìn)Sleep
但如果不領(lǐng)會(huì)Android設(shè)計(jì)者的意圖而濫用Wake Lock
API系草,為了自身程序在后臺(tái)的正常工作而長(zhǎng)時(shí)間阻止AP進(jìn)入休眠狀態(tài),就會(huì)成為待機(jī)電池殺手唆涝。

PS:PowerManager.WakeLock 有加鎖和解鎖兩種狀態(tài)找都,加鎖的方式有兩種,一種是永久的鎖住廊酣,這樣的鎖除非顯式的放開(kāi)能耻,是不會(huì)解鎖的,所以這種鎖用起來(lái)要非常的小心亡驰。第二種鎖是超時(shí)鎖晓猛,這種鎖會(huì)在鎖住后一段時(shí)間解鎖。
在創(chuàng)建了 PowerManager.WakeLock 后凡辱,有兩種機(jī)制戒职,第一種是不計(jì)數(shù)鎖機(jī)制,另一種是計(jì)數(shù)鎖機(jī)制透乾『樵铮可以通過(guò) setReferenceCounted(boolean value) 來(lái)指定磕秤,一般默認(rèn)為計(jì)數(shù)機(jī)制。這兩種機(jī)制的區(qū)別在于捧韵,前者無(wú)論 acquire() 了多少次市咆,只要通過(guò)一次 release()即可解鎖。而后者正真解鎖是在( --count == 0 )的時(shí)候再来,同樣當(dāng) (count == 0) 的時(shí)候才會(huì)去申請(qǐng)加鎖蒙兰,其他情況 isHeld 狀態(tài)是不會(huì)改變的。所以 PowerManager.WakeLock 的計(jì)數(shù)機(jī)制并不是正真意義上的對(duì)每次請(qǐng)求進(jìn)行申請(qǐng)/釋放每一把鎖芒篷,它只是對(duì)同一把鎖被申請(qǐng)/釋放的次數(shù)進(jìn)行了統(tǒng)計(jì)再正真意義上的去操作搜变。一下進(jìn)行了永久鎖的測(cè)試: 從測(cè)試我們可以看到使用計(jì)數(shù)和計(jì)數(shù)鎖的區(qū)別。
AlarmManager
AlarmManage有一個(gè)AlarmManagerService,該服務(wù)程序主要維護(hù)app注冊(cè)下來(lái)的各類(lèi)Alarm,并且一直監(jiān)聽(tīng)Alarm設(shè)備梭伐,一旦有Alarm觸發(fā)痹雅,或者是Alarm事件發(fā)生,AlarmManagerService就會(huì)遍歷Alarm列表糊识,找到相應(yīng)的注冊(cè)Alarm并發(fā)出廣播
AlarmManager會(huì)維持一個(gè)cpu的wakelock。這樣能保證電話(huà)休眠時(shí)摔蓝,也能處理alarm的廣播赂苗。一旦alarmreceiver的onReceive()方法執(zhí)行完,wakelock會(huì)迅速被釋放贮尉。如果在receiver中開(kāi)啟一個(gè)service拌滋,有可能service還沒(méi)啟動(dòng),wakelock已經(jīng)被釋放了猜谚。所以此時(shí)要實(shí)現(xiàn)單獨(dú)的wakelock策略败砂。
有4種Alarm類(lèi)型:

RTC_WAKEUP
在指定的時(shí)刻(設(shè)置Alarm的時(shí)候),喚醒設(shè)備來(lái)觸發(fā)Intent魏铅。
RTC
在一個(gè)顯式的時(shí)間觸發(fā)Intent昌犹,但不喚醒設(shè)備。
ELAPSED_REALTIME
從設(shè)備啟動(dòng)后览芳,如果流逝的時(shí)間達(dá)到總時(shí)間斜姥,那么觸發(fā)Intent,但不喚醒設(shè)備沧竟。流逝的時(shí)間包括設(shè)備睡眠的任何時(shí)間铸敏。注意一點(diǎn)的是,時(shí)間流逝的計(jì)算點(diǎn)是自從它最后一次啟動(dòng)算起悟泵。
ELAPSED_REALTIME_WAKEUP
從設(shè)備啟動(dòng)后杈笔,達(dá)到流逝的總時(shí)間后,如果需要將喚醒設(shè)備并觸發(fā)Intent糕非。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蒙具,一起剝皮案震驚了整個(gè)濱河市敦第,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌店量,老刑警劉巖芜果,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異融师,居然都是意外死亡右钾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)旱爆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)舀射,“玉大人,你說(shuō)我怎么就攤上這事怀伦〈嘌蹋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵房待,是天一觀的道長(zhǎng)邢羔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)桑孩,這世上最難降的妖魔是什么拜鹤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮流椒,結(jié)果婚禮上敏簿,老公的妹妹穿的比我還像新娘。我一直安慰自己宣虾,他們只是感情好惯裕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著绣硝,像睡著了一般蜻势。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上域那,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天咙边,我揣著相機(jī)與錄音,去河邊找鬼次员。 笑死败许,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淑蔚。 我是一名探鬼主播市殷,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼刹衫!你這毒婦竟也來(lái)了醋寝?” 一聲冷哼從身側(cè)響起搞挣,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎音羞,沒(méi)想到半個(gè)月后囱桨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗅绰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年舍肠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窘面。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翠语,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出财边,到底是詐尸還是另有隱情肌括,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布酣难,位于F島的核電站谍夭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鲸鹦。R本人自食惡果不足惜慧库,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馋嗜。 院中可真熱鬧,春花似錦吵瞻、人聲如沸葛菇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)眯停。三九已至,卻和暖如春卿泽,著一層夾襖步出監(jiān)牢的瞬間莺债,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工签夭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留齐邦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓第租,卻偏偏與公主長(zhǎng)得像措拇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慎宾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容