Android-电池优化Doze和Standby模式-AlarmManager失效
生活随笔
收集整理的這篇文章主要介紹了
Android-电池优化Doze和Standby模式-AlarmManager失效
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一.電池省電優(yōu)化(Doze和App Standby模式)
從Android6.0開始,系統(tǒng)提供了兩種省電功能(延長電池壽命和使用時間):Doze和App Standby Doze和App Standby模式會延緩CPU和網(wǎng)絡(luò)活動實現(xiàn)節(jié)能;1.Doze模式
1.進入Doze模式在手機未充電,完全靜止且熄屏一段時間后,Android系統(tǒng)會自動進入Doze模式2.Doze模式效果1.網(wǎng)絡(luò)訪問被掛起2.Wake Locks被無視 3.AlarmManager被推遲到下一個maintenance window窗口,除非使用AlarmManager新方法: setAndAllowWhileIdle(),setExactAndAllowWhileIdle(),setAlarmClock()4.WiFi掃描被停止5.SyncAdapter同步工作被停止6.JobScheduler定時任務(wù)被停止Doze模式的五種狀態(tài)ACTIVE: 活動狀態(tài)INACTIVE: 屏幕關(guān)閉進入非活動狀態(tài)IDLE_PENDING: 每隔30分鐘讓App進入預(yù)備狀態(tài)IDLE: 空閑狀態(tài)IDLE_MAINTENANCE:處理掛起任務(wù) 系統(tǒng)進入Doze模式后,每隔一段時間(30分鐘)會有一小段時間(30s)供APP處理被掛起任務(wù),但隨著時間推移,間隔時間會變長,以此減少電量消耗3.退出Doze模式1.手機充電2.手機移動3.手機屏幕打開2.App Standby模式
1.進入App Standby模式長時間未被用戶使用的App,將進入App Standby狀態(tài)(被標志為空閑狀態(tài))2.退出App Standby模式1.用戶主動啟動該App2.該App有前臺進程(前臺activity/前臺service),被其它前臺進程啟動3.該App在鎖屏或通知欄有可見的Notification4.Android設(shè)備充電時,會將所有Standby狀態(tài)的App釋放,處理掛起任務(wù)5.如果App空閑時間很長,系統(tǒng)將允許App一天一次訪問網(wǎng)絡(luò)3.App Standby和Doze區(qū)別 App Standby不需要屏幕關(guān)閉,App進入后臺一段時間,網(wǎng)絡(luò)也會受到限制 Doze模式需要屏幕關(guān)閉(通常晚上睡覺或長時間屏幕關(guān)閉才會進入)3.阻止電池優(yōu)化(白名單)
Android6.0及更高版本提供電池優(yōu)化白名單,App加入白名單可逃脫Doze和App Standby限制, 處于白名單中的App也會受到一定限制: Jobs和Syncs以及常規(guī)Alarms也會被推遲;用戶手動設(shè)置App進入白名單: 設(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.進入系統(tǒng)電池優(yōu)化設(shè)置界面,把當前APP加入白名單//startActivity(new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS));//2.彈出系統(tǒng)對話框,把當前APP加入白名單(無需進入設(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定時鬧鐘失效
1.App被Kill后,AlarmManager失效(只有App進程在運行時,才會收到系統(tǒng)定時AlarmManager通知)添加守護進程,相互監(jiān)聽重啟; 提醒用戶加入鎖屏清理白名單 2.手機重啟,AlarmManager任務(wù)失效監(jiān)聽重啟廣播,重新設(shè)置定時鬧鐘 3.從Android4.4(API19)開始,AlarmManager機制修改,set(),setRepeating()定時不再精確,甚至setRepeating只生效一次(不會重復(fù))新增精確定時方法: setExact(),setWindow(),setAlarmClock(), 4.從Android6.0(API23)開始,進入Doze模式(省電優(yōu)化),AlarmManager被延緩新增精確定時方法: setAndAllowWhileIdle(),setExactAndAllowWhileIdle()從Android4.4(API19)開始,新增精準定時方法都是一次性鬧鐘,沒有重復(fù)定時的方法, 所以當需要重復(fù)周期鬧鐘,只能在下一次喚醒時重新設(shè)置定時,間接實現(xiàn)重復(fù)鬧鐘!精確定時一次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不準確alarm.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + delay, pi);elsealarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + delay, pi); }簡書: http://www.jianshu.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
總結(jié)
以上是生活随笔為你收集整理的Android-电池优化Doze和Standby模式-AlarmManager失效的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: word怎么竖向选中,word怎么文字竖
- 下一篇: Android 应用统一字体设置 typ