天天看點

【Android 電量優化】電量優化特性 ( Doze 低電耗模式 | Standby 應用待機模式 | 白名單設定 | 白名單添加系統設定界面 | 指定應用的白名單添加界面 | 測試應用 )

文章目錄

  • 一、Doze 低耗電模式簡介
  • 二、Standby 應用待機模式簡介
  • 三、Doze 和 Standby 模式測試
  • 四、白名單添加 ( 方式一 )
  • 五、白名單添加 ( 方式二 )

Android 6.0 之後 , 引入了電量優化相關特性 Doze 低電耗模式 和 Standby 應用待機模式 ;

  • 優化電池續航時間
  • 針對低電耗模式和應用待機模式進行優化

上述兩個特性都是通過 優化手機在未充電時的行為 , 達到延長手機待機時間的目的 ;

  • Doze 低耗電模式 : 延遲背景應用的 CPU 和網絡子產品工作 , 之後集中執行相關工作 ;
  • Standby 應用待機模式 : 延遲近期沒有使用過的應用的網絡活動 ;

一、Doze 低耗電模式簡介

手機進入 Doze 低耗電模式條件 :

  • 未接通電源
  • 螢幕關閉
  • 裝置處于不活動狀态 , 并且已經維持了一段時間
  • 沒有在白名單中

Doze 低耗電模式下 , 延遲 CPU 和網絡使用 , 每隔一段時間有一段維護時間 , 在維護視窗時間内 , 集中執行被延遲的 CPU 和 網絡操作 ; 維護期結束後 , 再次進入 Doze 低功耗模式 , 開始延遲 CPU 和網絡操作 ;

退出 Doze 低耗電模式 :

  • 充電
  • 喚醒裝置

下圖是官網給出的 Doze 工作示意圖 , 橫軸代表時間 , 橙色部分表示 CPU 工作時間 , 綠色部分表示裝置處于休眠狀态 ; CPU 會在維護視窗期 , 集中執行一些任務 , 剩餘的時間處于休眠狀态 ;

【Android 電量優化】電量優化特性 ( Doze 低電耗模式 | Standby 應用待機模式 | 白名單設定 | 白名單添加系統設定界面 | 指定應用的白名單添加界面 | 測試應用 )

低耗電模式限制的操作 :

  • 通路網絡
  • 喚醒鎖定
  • 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);
    }
}

           

彈出白名單設定 : 需要自己從應用清單中選擇 ;

【Android 電量優化】電量優化特性 ( Doze 低電耗模式 | Standby 應用待機模式 | 白名單設定 | 白名單添加系統設定界面 | 指定應用的白名單添加界面 | 測試應用 )

設定不進行優化 :

【Android 電量優化】電量優化特性 ( Doze 低電耗模式 | Standby 應用待機模式 | 白名單設定 | 白名單添加系統設定界面 | 指定應用的白名單添加界面 | 測試應用 )

五、白名單添加 ( 方式二 )

白名單添加工具類 :

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);
    }
}

           

繼續閱讀