文章目錄
- 一、Doze 低耗電模式簡介
- 二、Standby 應用待機模式簡介
- 三、Doze 和 Standby 模式測試
- 四、白名單添加 ( 方式一 )
- 五、白名單添加 ( 方式二 )
Android 6.0 之後 , 引入了電量優化相關特性 Doze 低電耗模式 和 Standby 應用待機模式 ;
- 優化電池續航時間
- 針對低電耗模式和應用待機模式進行優化
上述兩個特性都是通過 優化手機在未充電時的行為 , 達到延長手機待機時間的目的 ;
- Doze 低耗電模式 : 延遲背景應用的 CPU 和網絡子產品工作 , 之後集中執行相關工作 ;
- Standby 應用待機模式 : 延遲近期沒有使用過的應用的網絡活動 ;
一、Doze 低耗電模式簡介
手機進入 Doze 低耗電模式條件 :
- 未接通電源
- 螢幕關閉
- 裝置處于不活動狀态 , 并且已經維持了一段時間
- 沒有在白名單中
Doze 低耗電模式下 , 延遲 CPU 和網絡使用 , 每隔一段時間有一段維護時間 , 在維護視窗時間内 , 集中執行被延遲的 CPU 和 網絡操作 ; 維護期結束後 , 再次進入 Doze 低功耗模式 , 開始延遲 CPU 和網絡操作 ;
退出 Doze 低耗電模式 :
- 充電
- 喚醒裝置
下圖是官網給出的 Doze 工作示意圖 , 橫軸代表時間 , 橙色部分表示 CPU 工作時間 , 綠色部分表示裝置處于休眠狀态 ; CPU 會在維護視窗期 , 集中執行一些任務 , 剩餘的時間處于休眠狀态 ;
低耗電模式限制的操作 :
- 通路網絡
- 喚醒鎖定
- AlarmManager 鬧鐘管理器操作
- WLAN 掃描
- 同步擴充卡
- JobScheduler
上述操作都會在 Doze 視窗期進行集中操作 ;
二、Standby 應用待機模式簡介
Standby 應用待機模式簡介 : 如果使用者一段時間内沒有使用某個應用 , 則判定該應用處于待機模式 ;
以下操作不能判定為應用待機模式 :
- 使用者啟動的應用
- 應用有前台程序運作
- 該應用有對應的通知處于可見狀态
- 裝置管理器應用
三、Doze 和 Standby 模式測試
Doze 低耗電模式測試 :
- 進入 Doze 模式 : 進入 Doze 模式後 , 測試應用的運作狀況 , 是否能達到要求 ;
$ adb shell dumpsys deviceidle force-idle
- 退出 Doze 模式 : 退出 Doze 模式之後 , 測試應用運作狀态 , 是否恢複正常 ;
$ adb shell dumpsys deviceidle unforce
- 重新激活裝置 :
$ adb shell dumpsys battery reset
Standby 應用待機模式測試 :
- 使應用強行進入待機模式 : 進入 Standby 模式後 , 測試應用的運作狀況 , 是否能達到要求 ;
$ adb shell dumpsys battery unplug
$ adb shell am set-inactive <packageName> true
- 應用喚醒 : 退出 Standby 模式之後 , 測試應用運作狀态 , 是否恢複正常 ;
$ adb shell am set-inactive <packageName> false
$ adb shell am get-inactive <packageName>
四、白名單添加 ( 方式一 )
加入了白名單以後 , 就不再受該功能限制 , 自由使用以下功能 ;
白名單添加工具類 :
package kim.hsl.bp;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.PowerManager;
import android.provider.Settings;
/**
* 白名單
*/
public class WhiteListUtils {
public static final String TAG = "WhiteListUtils";
/**
* 引導使用者添加白名單
* @param context
*/
public static void addWhiteList(Context context){
// 擷取電量管理器
PowerManager powerManager = (PowerManager) context.
getSystemService(Context.POWER_SERVICE);
// Android 6.0 以上才能使用該功能
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 檢視目前應用是否則電量白名單中
boolean isInWhiteList = powerManager.
isIgnoringBatteryOptimizations(context.getPackageName());
// 如果沒有在白名單中 , 彈出對話框 , 引導使用者設定白名單
if(!isInWhiteList){
// 彈出白名單設定對話框
Intent intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
context.startActivity(intent);
}
}
}
}
Activity 中調用 :
public class MainActivity extends AppCompatActivity {
public static final String TAG = "Battery_Performance.MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 引導使用者打開白名單
WhiteListUtils.addWhiteList(this);
}
}
彈出白名單設定 : 需要自己從應用清單中選擇 ;
設定不進行優化 :
五、白名單添加 ( 方式二 )
白名單添加工具類 :
package kim.hsl.bp;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.PowerManager;
import android.provider.Settings;
/**
* 白名單
*/
public class WhiteListUtils {
public static final String TAG = "WhiteListUtils";
/**
* 引導使用者添加白名單
* @param context
*/
public static void addWhiteList2(Context context){
// 擷取電量管理器
PowerManager powerManager = (PowerManager) context.
getSystemService(Context.POWER_SERVICE);
// Android 6.0 以上才能使用該功能
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 檢視目前應用是否則電量白名單中
boolean isInWhiteList = powerManager.
isIgnoringBatteryOptimizations(context.getPackageName());
// 如果沒有在白名單中 , 彈出對話框 , 引導使用者設定白名單
if(!isInWhiteList){
// 彈出白名單設定對話框
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
// 帶上要設定的包名
intent.setData(Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);
}
}
}
}
public class MainActivity extends AppCompatActivity {
public static final String TAG = "Battery_Performance.MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 引導使用者打開白名單
WhiteListUtils.addWhiteList2(this);
}
}