Android 省电模式

下拉状态栏和设置开启省电模式调用的方法

vendor/freeme/packages/apps/FreemeSystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java

@Override
protected void handleClick() {
    if (getState().state == Tile.STATE_UNAVAILABLE) {
        return;
    }
    mBatteryController.setPowerSaveMode(!mPowerSave);
}

vendor/freeme/packages/apps/FreemeSystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java

@Override
public void setPowerSaveMode(boolean powerSave) {
    BatterySaverUtils.setPowerSaveMode(mContext, powerSave, /*needFirstTimeWarning*/ true);
}

frameworks/base/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java

/**
 * Enable / disable battery saver by user request.
 * - If it's the first time and needFirstTimeWarning, show the first time dialog.
 * - If it's 4th time through 8th time, show the schedule suggestion notification.
 *
 * @param enable true to disable battery saver.
 *
 * @return true if the request succeeded.
 */
public static synchronized boolean setPowerSaveMode(Context context,
        boolean enable, boolean needFirstTimeWarning) {
    if (DEBUG) {
        Log.d(TAG, "Battery saver turning " + (enable ? "ON" : "OFF"));
    }
    final ContentResolver cr = context.getContentResolver();
    final Bundle confirmationExtras = new Bundle(1);
    confirmationExtras.putBoolean(EXTRA_CONFIRM_TEXT_ONLY, false);
    if (enable && needFirstTimeWarning
            && maybeShowBatterySaverConfirmation(context, confirmationExtras)) {
        return false;
    }
    if (enable && !needFirstTimeWarning) {
        setBatterySaverConfirmationAcknowledged(context);
    }
    if (context.getSystemService(PowerManager.class).setPowerSaveModeEnabled(enable)) {
        if (enable) {
            final int count =
                    Secure.getInt(cr, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, 0) + 1;
            Secure.putInt(cr, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, count);
            final Parameters parameters = new Parameters(context);
            if ((count >= parameters.startNth)
                    && (count <= parameters.endNth)
                    && Global.getInt(cr, Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0) == 0
                    && Secure.getInt(cr,
                    Secure.SUPPRESS_AUTO_BATTERY_SAVER_SUGGESTION, 0) == 0) {
                showAutoBatterySaverSuggestion(context, confirmationExtras);
            }
        }
        return true;
    }
    return false;
}

真正核心的地方是

context.getSystemService(PowerManager.class).setPowerSaveModeEnabled(enable)

应用可以使用此方法打开或关闭省电模式,后续代码分析参考

Android R默认打开省电模式就会开启深色主题,为了延长电池续航时间,省电模式会执行以下操作:开启深色主题;闭或限制后台活动、部分视觉效果和其他功能,例如“Ok Google”。

新需求需要修改开启省电模式,不改变系统主题,用户可以自己选择,根据参考内容,这里涉及到一个省电策略,如果不需要每次开启省电模式切换到深色主题,只需要将enableNightMode默认策略改成false即可。

frameworks/base/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java

private static final Policy DEFAULT_FULL_POLICY = new Policy(
        0.5f,  /* adjustBrightnessFactor */
        true,  /* advertiseIsEnabled */
        true,  /* deferFullBackup */
        true,  /* deferKeyValueBackup */
        false, /* disableAnimation */
        true,  /* disableAod */
        true,  /* disableLaunchBoost */
        true,  /* disableOptionalSensors */
        true,  /* disableSoundTrigger */
        true,  /* disableVibration */
        false, /* enableAdjustBrightness */
        false, /* enableDataSaver */
        true,  /* enableFirewall */
        true, /* enableNightMode */
        true, /* enableQuickDoze */
        new ArrayMap<>(), /* filesForInteractive */
        new ArrayMap<>(), /* filesForNoninteractive */
        true, /* forceAllAppsStandby */
        true, /* forceBackgroundCheck */
        PowerManager.LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF /* locationMode */
);
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值