Android-電池優(yōu)化Doze和Standby模式-AlarmManager失效

一.電池省電優(yōu)化(Doze和App Standby模式)

從Android6.0開始,系統(tǒng)提供了兩種省電功能(延長電池壽命和使用時(shí)間):Doze和App Standby
Doze和App Standby模式會(huì)延緩CPU和網(wǎng)絡(luò)活動(dòng)實(shí)現(xiàn)節(jié)能;

1.Doze模式

1.進(jìn)入Doze模式
    在手機(jī)未充電,完全靜止且熄屏一段時(shí)間后,Android系統(tǒng)會(huì)自動(dòng)進(jìn)入Doze模式
    
2.Doze模式效果
    1.網(wǎng)絡(luò)訪問被掛起
    2.Wake Locks被無視     
    3.AlarmManager被推遲到下一個(gè)maintenance window窗口,
    除非使用AlarmManager新方法: setAndAllowWhileIdle(),setExactAndAllowWhileIdle(),setAlarmClock()
    4.WiFi掃描被停止
    5.SyncAdapter同步工作被停止
    6.JobScheduler定時(shí)任務(wù)被停止
    
    Doze模式的五種狀態(tài)
        ACTIVE:           活動(dòng)狀態(tài)
        INACTIVE:         屏幕關(guān)閉進(jìn)入非活動(dòng)狀態(tài)
        IDLE_PENDING:     每隔30分鐘讓App進(jìn)入預(yù)備狀態(tài)
        IDLE:             空閑狀態(tài)
        IDLE_MAINTENANCE:處理掛起任務(wù)     
    系統(tǒng)進(jìn)入Doze模式后,每隔一段時(shí)間(30分鐘)會(huì)有一小段時(shí)間(30s)供APP處理被掛起任務(wù),
    但隨著時(shí)間推移,間隔時(shí)間會(huì)變長,以此減少電量消耗
            
3.退出Doze模式
    1.手機(jī)充電
    2.手機(jī)移動(dòng)
    3.手機(jī)屏幕打開

2.App Standby模式

1.進(jìn)入App Standby模式
    長時(shí)間未被用戶使用的App,將進(jìn)入App Standby狀態(tài)(被標(biāo)志為空閑狀態(tài))
    
2.退出App Standby模式
    1.用戶主動(dòng)啟動(dòng)該App
    2.該App有前臺(tái)進(jìn)程(前臺(tái)activity/前臺(tái)service),被其它前臺(tái)進(jìn)程啟動(dòng)
    3.該App在鎖屏或通知欄有可見的Notification
    4.Android設(shè)備充電時(shí),會(huì)將所有Standby狀態(tài)的App釋放,處理掛起任務(wù)
    5.如果App空閑時(shí)間很長,系統(tǒng)將允許App一天一次訪問網(wǎng)絡(luò)
    
3.App Standby和Doze區(qū)別
App Standby不需要屏幕關(guān)閉,App進(jìn)入后臺(tái)一段時(shí)間,網(wǎng)絡(luò)也會(huì)受到限制
Doze模式需要屏幕關(guān)閉(通常晚上睡覺或長時(shí)間屏幕關(guān)閉才會(huì)進(jìn)入)

3.阻止電池優(yōu)化(白名單)

Android6.0及更高版本提供電池優(yōu)化白名單,App加入白名單可逃脫Doze和App Standby限制,
處于白名單中的App也會(huì)受到一定限制: Jobs和Syncs以及常規(guī)Alarms也會(huì)被推遲;

用戶手動(dòng)設(shè)置App進(jìn)入白名單: 設(shè)置>電池>電池優(yōu)化白名單

App檢測是否在白名單: PowerManager.isIgnoringBatteryOptimizations()

App請求加入白名單:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    if (pm != null && !pm.isIgnoringBatteryOptimizations(getPackageName())) {
        //1.進(jìn)入系統(tǒng)電池優(yōu)化設(shè)置界面,把當(dāng)前APP加入白名單
        //startActivity(new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS));
        
        //2.彈出系統(tǒng)對話框,把當(dāng)前APP加入白名單(無需進(jìn)入設(shè)置界面)
        //在manifest添加權(quán)限 <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
        Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:" + getPackageName()));
        startActivity(intent);
    }
}

二.AlarmManager定時(shí)鬧鐘失效

1.App被Kill后,AlarmManager失效(只有App進(jìn)程在運(yùn)行時(shí),才會(huì)收到系統(tǒng)定時(shí)AlarmManager通知)
    添加守護(hù)進(jìn)程,相互監(jiān)聽重啟; 提醒用戶加入鎖屏清理白名單
2.手機(jī)重啟,AlarmManager任務(wù)失效
    監(jiān)聽重啟廣播,重新設(shè)置定時(shí)鬧鐘
3.從Android4.4(API19)開始,AlarmManager機(jī)制修改,set(),setRepeating()定時(shí)不再精確,甚至setRepeating只生效一次(不會(huì)重復(fù))
    新增精確定時(shí)方法: setExact(),setWindow(),setAlarmClock(),
4.從Android6.0(API23)開始,進(jìn)入Doze模式(省電優(yōu)化),AlarmManager被延緩
    新增精確定時(shí)方法: setAndAllowWhileIdle(),setExactAndAllowWhileIdle()

從Android4.4(API19)開始,新增精準(zhǔn)定時(shí)方法都是一次性鬧鐘,沒有重復(fù)定時(shí)的方法,
所以當(dāng)需要重復(fù)周期鬧鐘,只能在下一次喚醒時(shí)重新設(shè)置定時(shí),間接實(shí)現(xiàn)重復(fù)鬧鐘挥吵!

精確定時(shí)一次Demo如下:
void setWakeAtTime(Context cxt, int delay) {
    PendingIntent pi = PendingIntent.getService(cxt,0,new Intent(cxt, xxService.class),PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager alarm = (AlarmManager) cxt.getSystemService(Context.ALARM_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) //Android 6山宾,針對省電優(yōu)化
        alarm.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + delay, pi);
    else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) //Android 4.4,針對set不準(zhǔn)確
        alarm.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + delay, pi);
    else
        alarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + delay, pi);   
}

簡書: http://www.reibang.com/p/585ca251b871
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/78848386
GitHub博客: http://lioil.win/2017/12/19/Android-Alarm_Doze_Standby.html
Coding博客: http://c.lioil.win/2017/12/19/Android-Alarm_Doze_Standby.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子汁政,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滨彻,死亡現(xiàn)場離奇詭異,居然都是意外死亡挪蹭,警方通過查閱死者的電腦和手機(jī)亭饵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梁厉,“玉大人辜羊,你說我怎么就攤上這事〈使耍” “怎么了八秃?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肉盹。 經(jīng)常有香客問我更舞,道長虎锚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮印颤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缴挖。我一直安慰自己掉瞳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布它抱。 她就那樣靜靜地躺著秕豫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上混移,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天祠墅,我揣著相機(jī)與錄音,去河邊找鬼歌径。 笑死毁嗦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的回铛。 我是一名探鬼主播狗准,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茵肃!你這毒婦竟也來了腔长?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤验残,失蹤者是張志新(化名)和其女友劉穎捞附,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體您没,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸟召,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氨鹏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欧募。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖仆抵,靈堂內(nèi)的尸體忽然破棺而出跟继,到底是詐尸還是另有隱情,我是刑警寧澤肢础,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布还栓,位于F島的核電站,受9級(jí)特大地震影響传轰,放射性物質(zhì)發(fā)生泄漏剩盒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一慨蛙、第九天 我趴在偏房一處隱蔽的房頂上張望辽聊。 院中可真熱鬧,春花似錦期贫、人聲如沸跟匆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玛臂。三九已至烤蜕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迹冤,已是汗流浹背讽营。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泡徙,地道東北人橱鹏。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像堪藐,于是被迫代替她去往敵國和親莉兰。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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