android 7.0 Settings 省电模式
来源:互联网 发布:sql 查询年龄最大的人 编辑:程序博客网 时间:2024/06/04 19:14
Settings 省电模式:
开启省电方式有两种:
第一种 自动开启,点击Turn on automatically,弹出下拉选项,选择never, at 5% battery, at 15% battery
第二种 手动开启,点击SwitchBar开关即可设置
先说第一种:
updateLowPowerModeLocked(); //此方法是最终功能实现的地方.
PowerManagerService.java
/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功能 关闭语音识别 等.
开启省电方式有两种:
第一种 自动开启,点击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
控件: <DropDownPreference android: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
@Override public 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) @Override protected 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 和 system key 控件的key setting 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() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { //当下拉选项改变时,将当前选项的值存入Settings数据库其实就是存如入setting_global.xml key值是Global.LOW_POWER_MODE_TRIGGER_LEVEL return 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); } @Override public 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.javapublic void onResume(){ mSwitchBar.addOnSwitchChangeListener(this); //注册}public void onPause() { mSwitchBar.removeOnSwitchChangeListener(this); //删除}监听事件的处理:
@Override public 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 call public 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 powered Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.LOW_POWER_MODE, 0); mLowPowerModeSetting = false; } /** mIsPowered 变量表示充电状态,true表示正在充电(已接入电源),否则为false mLowPowerModeSetting 变量(表示设置低电模式的当前状态;从系统设置中获取的值,即数据库字段“low_power”的值) mAutoLowPowerModeConfigured 自动开启省电模式的当前状态,即数据库字段“low_power_trigger_level”是否为0的值;不为0时表示打开了自动开 启功能,该变量为true mAutoLowPowerModeSnoozing 当电量低并且允许自动设置省电模式时,如果此时省电模式是开启的,就要设置mAutoLowPowerModeSnoozing的值为 false;如果省电模式是关闭的,就要设置mAutoLowPowerModeSnoozing的值为true。就是要求 mAutoLowPowerModeSnoozing变量与省电模式的逻辑保持一致。 mBatteryLevelLow 如果电池电量低为true,否则为false mBatteryLevelLowValue 当前自动开启省电模式的电量百分比,就是前面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() { @Override public void run() { //发送处理广播 ACTION_POWER_SAVE_MODE_CHANGING Intent 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功能 关闭语音识别 等.
2 0
- android 7.0 Settings 省电模式
- Android 7.0 settings 总结
- Android Wifi 省电模式基本概念
- Android 禁止黑屏进入省电模式
- Android 禁止黑屏进入省电模式
- Android Studio的省电模式
- android settings---------Settings.java
- Android 7.0 Settings 加载选项
- Android 7.0 Settings Summary 小记
- Android Settings
- android - Settings
- 自定义省电模式
- android 7.0 Settings列表加载流程
- android 7.0中Settings新功能全面解析
- Android 7.0 settings中添加新菜单
- Android 7.0Settings加载主界面流程
- Android 7.0Settings加载主界面流程
- Android 7.0 settings中添加/删除菜单
- [IMWeb训练营作业]vuejs仿写朋友圈
- 线性表
- 利用@DynamicInsert和@DynamicUpdate生成动态SQL语句
- Matlab绘制箱线图
- STM32-USB模块
- android 7.0 Settings 省电模式
- 如何理解指向指针的指针?
- java.lang.String.contains包
- java 代码优化
- wampserver 更改端口仍然无法访问的解决方法
- 关于c++map
- ServletContext 与application的异同
- eclipse pydev 部署 django web 项目
- Android studio2.3.1 更新以后Error:Failed to open zip file. Gradle's dependency cache may be corrupt