Settings 省电模式:
开启省电方式有两种:
第一种 自动开启,点击Turn on automatically,弹出下拉选项,选择never, at 5% battery, at 15% battery
第二种 手动开启,点击SwitchBar开关即可设置
先说第一种:

关键字段:

/packages/apps/Settings/res/values/strings.xml<!-- [CHAR_LIMIT=40] Battery saver: Title for automatic entry option --><string name="battery_saver_turn_on_automatically_title">Turn on automatically</string>
对应布局:
/packages/apps/Settings/res/xml/battery_saver_settings.xml
控件:<DropDownPreferenceandroid:key="turn_on_automatically"android:title="@string/battery_saver_turn_on_automatically_title"android:summary="%s" />
使用类:
/packages/apps/Settings/src/com/android/settings/fuelgauge/BatterySaverSettings.java
@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);if (mCreated) {mSwitchBar.show();return;}mCreated = true;addPreferencesFromResource(R.xml.battery_saver_settings);mContext = getActivity();mSwitchBar = ((SettingsActivity) mContext).getSwitchBar();mSwitch = mSwitchBar.getSwitch();mSwitchBar.show();//SettingPref 帮助管理绑定到全局或系统设置的双状态或下拉式首选项, 这里使用下拉选项mTriggerPref = new SettingPref(SettingPref.TYPE_GLOBAL, KEY_TURN_ON_AUTOMATICALLY,Global.LOW_POWER_MODE_TRIGGER_LEVEL,0, /*default*/getResources().getIntArray(R.array.battery_saver_trigger_values)) { //设置下拉子选项 共3个 (0 5 15)@Overrideprotected String getCaption(Resources res, int value) {if (value > 0 && value < 100) {return res.getString(R.string.battery_saver_turn_on_automatically_pct,Utils.formatPercentage(value));}return res.getString(R.string.battery_saver_turn_on_automatically_never); //never选项 默认值}};mTriggerPref.init(this); //初始化 mDropDown.setEntries(entries); mDropDown.setEntryValues(values) , 设置点击事件mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);}/**type    存放类型 两种: global 和 systemkey     控件的keysetting Settings数据存放的键def     DropDownPreference 的默认值values  DropDownPreference 的下拉选项集合
*/
public SettingPref(int type, String key, String setting, int def, int... values) {mType = type;mKey = key;mSetting = setting;mDefault = def;mValues = values;mUri = getUriFor(mType, mSetting);}

在 mTriggerPref.init(this) 方法中设置了DropDownPreference的点击事件

      if (mDropDown != null && p != null) {p.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {//当下拉选项改变时,将当前选项的值存入Settings数据库其实就是存如入setting_global.xml key值是Global.LOW_POWER_MODE_TRIGGER_LEVELreturn setSetting(context, Integer.parseInt((String) newValue));}});return mDropDown;}

当Settings数据库中Global.LOW_POWER_MODE_TRIGGER_LEVEL改变时,在PowerManagerService中做了监听:

/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javapublic void systemReady(IAppOpsService appOps) {resolver.registerContentObserver(Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE),false, mSettingsObserver, UserHandle.USER_ALL);//注册Global.LOW_POWER_MODE_TRIGGER_LEVEL数据改变监听resolver.registerContentObserver(Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),false, mSettingsObserver, UserHandle.USER_ALL);}private final class SettingsObserver extends ContentObserver {public SettingsObserver(Handler handler) {super(handler);}@Overridepublic void onChange(boolean selfChange, Uri uri) {synchronized (mLock) {handleSettingsChangedLocked(); //更新省电模式}}}private void handleSettingsChangedLocked() {updateSettingsLocked();updatePowerStateLocked();}

updateSettingsLocked 和 updatePowerStateLocked 方法中做了一些状态的判断,最后都会调用:
updateLowPowerModeLocked(); //此方法是最终功能实现的地方.

再说第二种:
SwitchBar 开关的监听事件:
使用类:

/packages/apps/Settings/src/com/android/settings/fuelgauge/BatterySaverSettings.java
public void onResume(){mSwitchBar.addOnSwitchChangeListener(this); //注册
}public void onPause() {mSwitchBar.removeOnSwitchChangeListener(this); //删除
}

监听事件的处理:

@Overridepublic void onSwitchChanged(Switch switchView, boolean isChecked) {mHandler.removeCallbacks(mStartMode);if (isChecked) {mHandler.postDelayed(mStartMode, WAIT_FOR_SWITCH_ANIM); //开启省电模式  mStartMode是一个Runnable} else {if (DEBUG) Log.d(TAG, "Stopping low power mode from settings");trySetPowerSaveMode(false);}}

最后调用:

private void trySetPowerSaveMode(boolean mode) {if (!mPowerManager.setPowerSaveMode(mode)) { //PowerManager 实际调用的是PowerManagerService的方法if (DEBUG) Log.d(TAG, "Setting mode failed, fallback to current value");mHandler.post(mUpdateSwitch);}// TODO: Remove once broadcast is in place.ConditionManager.get(getContext()).getCondition(BatterySaverCondition.class).refreshState();}

实际调用: PowerManagerService -->  setPowerSaveMode()
PowerManagerService.java

@Override // Binder callpublic boolean setPowerSaveMode(boolean mode) {mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);final long ident = Binder.clearCallingIdentity();try {return setLowPowerModeInternal(mode); } finally {Binder.restoreCallingIdentity(ident);}}private boolean setLowPowerModeInternal(boolean mode) {synchronized (mLock) {if (DEBUG) Slog.d(TAG, "setLowPowerModeInternal " + mode + " mIsPowered=" + mIsPowered);if (mIsPowered) {return false;}Settings.Global.putInt(mContext.getContentResolver(),Settings.Global.LOW_POWER_MODE, mode ? 1 : 0);  //将开关状态存入数据库mLowPowerModeSetting = mode;if (mAutoLowPowerModeConfigured && mBatteryLevelLow) {if (mode && mAutoLowPowerModeSnoozing) {if (DEBUG_SPEW) {Slog.d(TAG, "setLowPowerModeInternal: clearing low power mode snooze");}mAutoLowPowerModeSnoozing = false;} else if (!mode && !mAutoLowPowerModeSnoozing) {if (DEBUG_SPEW) {Slog.d(TAG, "setLowPowerModeInternal: snoozing low power mode");}mAutoLowPowerModeSnoozing = true;}}updateLowPowerModeLocked(); //更新状态return true;}}

最后说一下updateLowPowerModeLocked()方法:

//此方法返回true,表示省电模式设置成功
private void updateLowPowerModeLocked() {if ((mIsPowered || !mBatteryLevelLow && !mBootCompleted) && mLowPowerModeSetting) {if (DEBUG_SPEW) {Slog.d(TAG, "updateLowPowerModeLocked: powered or booting with sufficient battery,"+ " turning setting off");}// Turn setting off if poweredSettings.Global.putInt(mContext.getContentResolver(),Settings.Global.LOW_POWER_MODE, 0);mLowPowerModeSetting = false;}/** mIsPowered 变量表示充电状态,true表示正在充电(已接入电源),否则为falsemLowPowerModeSetting 变量(表示设置低电模式的当前状态;从系统设置中获取的值,即数据库字段“low_power”的值)mAutoLowPowerModeConfigured 自动开启省电模式的当前状态,即数据库字段“low_power_trigger_level”是否为0的值;不为0时表示打开了自动开
启功能,该变量为truemAutoLowPowerModeSnoozing 当电量低并且允许自动设置省电模式时,如果此时省电模式是开启的,就要设置mAutoLowPowerModeSnoozing的值为
false;如果省电模式是关闭的,就要设置mAutoLowPowerModeSnoozing的值为true。就是要求
mAutoLowPowerModeSnoozing变量与省电模式的逻辑保持一致。mBatteryLevelLow  如果电池电量低为true,否则为falsemBatteryLevelLowValue 当前自动开启省电模式的电量百分比,就是前面DropDownPreference中设置的values值,0(never) 5% 15% */final boolean autoLowPowerModeEnabled = !mIsPowered && mAutoLowPowerModeConfigured&& !mAutoLowPowerModeSnoozing && mBatteryLevelLow &&(mBatteryManagerInternal.getBatteryLevel() <= mBatteryLevelLowValue);final boolean lowPowerModeEnabled = mLowPowerModeSetting || autoLowPowerModeEnabled;if (mLowPowerModeEnabled != lowPowerModeEnabled) {mLowPowerModeEnabled = lowPowerModeEnabled;powerHintInternal(POWER_HINT_LOW_POWER, lowPowerModeEnabled ? 1 : 0);postAfterBootCompleted(new Runnable() {@Overridepublic void run() {//发送处理广播 ACTION_POWER_SAVE_MODE_CHANGINGIntent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING).putExtra(PowerManager.EXTRA_POWER_SAVE_MODE, mLowPowerModeEnabled).addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);mContext.sendBroadcast(intent);ArrayList<PowerManagerInternal.LowPowerModeListener> listeners;synchronized (mLock) {listeners = new ArrayList<PowerManagerInternal.LowPowerModeListener>(mLowPowerModeListeners);}for (int i=0; i<listeners.size(); i++) {listeners.get(i).onLowPowerModeChanged(lowPowerModeEnabled);}//发送ACTION_POWER_SAVE_MODE_CHANGED广播,更新省电模式状态intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);mContext.sendBroadcast(intent);// Send internal version that requires signature permission.mContext.sendBroadcastAsUser(new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED_INTERNAL), UserHandle.ALL,Manifest.permission.DEVICE_POWER);}});}}

"ACTION_POWER_SAVE_MODE_CHANGING" 广播的接收类:
/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
/frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java

"ACTION_POWER_SAVE_MODE_CHANGED" 广播的接收类:
/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java
/frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
/frameworks/base/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
/frameworks/base/services/core/java/com/android/server/location/GnssLocationProvider.java
在对应的BroadcastReceiver中处理相关逻辑,比如: 降低屏幕亮度 关闭GPS功能 关闭语音识别 等.

android 7.0 Settings 省电模式相关推荐

  1. 安卓代码怎么设置省电模式_Android 5.0如何开启省电模式?Android 5.0如何省电?...

    Android 5.0如何开启省电模式?Android 5.0如何省电? 你也许还没有注意到,Android 5.0 Lollipop版本统正式加入了电池保护模式.这一功能的引进,帮助Android用 ...

  2. 安卓代码怎么设置省电模式_Android 5.0开启省电模式的方法 Android 5.0省电介绍

    你也许还没有注意到,Android 5.0 Lollipop版本统正式加入了电池保护模式.这一功能的引进,帮助Android用户彻底告别了需要寻找第三方应用程序来延长续航时间的尴尬日子.当然,在该项功 ...

  3. Android8.0(34)----Android 8.0 Settings流程分析与变动

    Android 8.0 Settings流程分析与变动 一,相比Android Settings 7.0 如下图,在7.0的基础上,去掉了7.0新加的侧滑菜单(可能是觉得有点鸡肋吧).多加了一级页面, ...

  4. Android 11.0 Settings源码分析 - 主界面加载

    Android 11.0 Settings源码分析 - 主界面加载 本篇主要记录AndroidR Settings源码主界面加载流程,方便后续工作调试其流程. Settings代码路径: packag ...

  5. android7.0夜间模式,Android 7.0隐藏的夜间模式 一个软件就能开启

    原标题:Android 7.0隐藏的夜间模式 一个软件就能开启 谷歌Android 7.0牛轧糖正式版在带来大量改进的同时,隐藏了多个在开发者预览版当中提供的选项和功能,其中就包括"夜间模式 ...

  6. android 音量最小时会变为静音,无语的设计 Android 5.0竟无静音模式

    或许谁也没有想到,已近乎完善的Android系统竟然会在看起来最不起眼的一个细节上犯下低级错误,那就是本文题目中笔者谈到的,缺少了静音模式.以往,当我们将音量调节至最低的时候会开启震动模式,而再次按音 ...

  7. Android 12.0 Settings 去掉打开开发者模式和USB调试模式的广播

    1.概述 在12.0的系统产品rom定制化开发中,在系统Settings的开发者模式中,打开开发者模式和usb调试模式都会发出开发者模式改变广播和usb调试模式改变广播, 项目开发功能需要要求去掉这两 ...

  8. Android 6.0变化之休眠模式

    休眠: Android 6.0最大变化之一就是加入了新的电量管理模式:休眠模式,当设备一段时间不用的时候,当屏幕关闭的时候,系统会自动进入休眠模式.这样所有的App都将进入挂起模式,不能在接入 网络等 ...

  9. android 6.0的DozeMode低功耗模式 及 引起的进程保活问题

    一.问题的来源 由于Android的开放特性,加上国内app开发者的觉悟普遍不高的情况下,越来越多的app开始利用安卓的系统特性甚至可以称为漏洞,故意让app退出后仍然占用大量的硬件资源.   越来越 ...

最新文章

  1. pip install失败报错解决方案
  2. 转图片_图片怎么转PDF?图片转PDF就用这些方法吧!
  3. 动态绘制圆环和扇形的源代码
  4. QTP中使用ExecuteFile加载vbs脚本
  5. 【数字信号处理】相关函数 ( 有限信号 | 有限信号的自相关函数 )
  6. 数据量很大的排序问题 大量数据如何排序,没有做测试
  7. 学习笔记11-C语言-指针
  8. C++总结篇(5)vector
  9. 华夏常春藤_我如何在没有常春藤大学学位的情况下从微软,亚马逊和Twitter获取报价
  10. 编写代码的软件用什么编写的_如果您编写代码,这就是您的黄金时代
  11. MFC开发IM-第二十六篇、vs2008添加库文件
  12. 员工出错处罚通知_员工被罚款50元!理由是用了单位公厕的厕纸…
  13. java setundecorated_java JFrame中与setUndecorated()相关的几个特效
  14. 电能表软件测试用例,一种用于电能表软件自动测试的方法专利_专利查询 - 天眼查...
  15. static,inline,volatile的作用
  16. html点击按钮展开文字,JS 展开/收起按钮显示隐藏文字示例
  17. C++ 如何改变鼠标光标位置
  18. SPEA2_Python
  19. linux 文件锁 超时,Linux中的两种文件锁——协同锁与强制锁
  20. [FirefoxOS_开发环境]Linux和Ubuntu环境下B2G(Firefox OS)安装、编译、测试教程集合

热门文章

  1. Android手机静态ip地址网关,安卓手机Android 4.0系统静态ip设置方法【详解】
  2. python编程:从入门到实践-2变量和简单数据类型
  3. 嘀嗒出行的IPO备战
  4. 云空间服务,助力用户数据存储与协同
  5. 2022 虎符 pwn mva
  6. 大师们的投资之道(十三)
  7. 前端经典面试500题【下】
  8. OPENSTACK-1-管理企业OSP部署-发布虚拟机实验
  9. box-shadow的具体使用方法(一分钟详解)
  10. 完整目标检测项目流程——从使用LabelImg标注到使用YOLOv5训练测试