在Android Sprd省电管理(一)appPowerSaveConfig.xml,我们介绍了appPowerSaveConfig.xml的主要参数的意义,这一篇我们介绍下,怎么设置应用的各种省电模式

首先看SprdManageApplications这个类

以锁屏清理为例,点击开关

    @Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {if (mApplications != null && mApplications.getCount() > position) {ApplicationsState.AppEntry entry = mApplications.getAppEntry(position);String pkg = entry.info.packageName;muid = entry.info.uid;//for app standy optimizationif (mArgument == TYPE_APP_WAKEUP) {Log.d(TAG,"onItemClick pkg = " + pkg);startAppConfigFragment(SprdAppItemBatterySaverFragment.class, pkg, entry.label);return;} else if (mArgument == TYPE_APP_POWER_INTENSIVE) {restartBatteryStatsLoader();startAdvancedPowerUsageDetail(pkg);return;}//for lock screen close-app and app auto-runSprdAppViewHolder holder = (SprdAppViewHolder) view.getTag();if (holder == null ) return;holder.app_switch.toggle();boolean isChecked = holder.app_switch.isChecked();Log.d(TAG, "isChecked: " + isChecked + " pkg: " + pkg);mSwitchState = DEFAULT;int configValue = CLOSE;if (mArgument == TYPE_APP_CLOSE_LOCKED) {configValue = isChecked ? CLOSE : DO_NOT_CLOSE;} else {configValue = isChecked ? DO_NOT_OPTIMIZE : OPTIMIZE;}try {//将package name, 省电模式,省电模式的值传给setAppPowerSaveConfigWithTypemPowerManagerEx.setAppPowerSaveConfigWithType(pkg, mAppConfigType, configValue);mApplications.setAppStateText(isChecked, holder);} catch (RemoteException e) {// Not much we can do here}if (isChecked) {mApplications.setSwitchIfAllAppOpen();} else {if (mAllAppSwitch != null) mAllAppSwitch.setChecked(false);}}}

PowerManagerServiceEx.java-->setAppPowerSaveConfigWithType()

    public boolean setAppPowerSaveConfigWithType(String appName, int type, int value) {return mPowerControllerInternal.setAppPowerSaveConfigWithType(appName, type, value);}

PowerControll.java-->setAppPowerSaveConfigWithType()

        boolean setAppPowerSaveConfigWithType(String appName, int type, int value) {if (DEBUG) Slog.d(TAG, "setAppPowerSaveConfigWithType(), appName: " + appName + ", type: " + AppPowerSaveConfig.ConfigType2Str(type) + ", value: " + AppPowerSaveConfig.ConfigValue2Str(value));if ((null == appName) || ((type <= AppPowerSaveConfig.ConfigType.TYPE_NULL.value) || (type >= AppPowerSaveConfig.ConfigType.TYPE_MAX.value))|| ((value < AppPowerSaveConfig.VALUE_AUTO) || (value > AppPowerSaveConfig.VALUE_NO_OPTIMIZE))) {return false;}try {synchronized (mMsgLock) {if
//发送MSG_SET_APP_POWERSAVE_CONFIG_WITHTYPE
(!msgHandler.sendMessage(msgHandler.obtainMessage(MSG_SET_APP_POWERSAVE_CONFIG_WITHTYPE, type, value, appName))) return false;mMsgLock.wait();}} catch (InterruptedException e) {Slog.e(TAG, e.toString());}return true;}
            case MSG_SET_APP_POWERSAVE_CONFIG_WITHTYPE: {String appName = (String)msg.obj;setAppPowerSaveConfigWithTypeInternal(appName, msg.arg1, msg.arg2);}break;

PowerControll.java-->setAppPowerSaveConfigWithTypeInternal()

private boolean setAppPowerSaveConfigWithTypeInternal(String appName, int type, int value) {AppPowerSaveConfig oldConfig = mAppConfigMap.get(appName);if (null == oldConfig) {oldConfig = new AppPowerSaveConfig();}int oldValue = AppPowerSaveConfig.getConfigValue(oldConfig, type);if (DEBUG) Slog.d(TAG, "setAppPowerSaveConfigWithTypeInternal(), appName: " + appName + ", config type: " + AppPowerSaveConfig.ConfigType2Str(type) + ", new value: " + AppPowerSaveConfig.ConfigValue2Str(value)+ ", old value: " + AppPowerSaveConfig.ConfigValue2Str(oldValue));if (value != oldValue) {onPowerSaveConfigChanged(type, appName, oldValue, value, false);for (int j = 0; j < mHelpers.size(); j++) {PowerSaveHelper helper = mHelpers.get(j);if (0 != (AppPowerSaveConfig.mMaskArray[type] & helper.mMask)) {helper.onPowerSaveConfigChanged(type, appName, oldValue, value, false);}}}AppPowerSaveConfig.setConfigWithType(oldConfig, type, value);if (DEBUG) Slog.d(TAG, "setAppPowerSaveConfigWithTypeInternal() config: " + oldConfig);if (oldConfig.isReset()) {if (DEBUG) Slog.d(TAG, "setAppPowerSaveConfigWithTypeInternal() remove old");mAppConfigMap.remove(appName);} else {if (DEBUG) Slog.d(TAG, "setAppPowerSaveConfigWithTypeInternal() put new");mAppConfigMap.put(appName, oldConfig);}//写入到xml文件保存AppPowerSaveConfig.writeConfig(mAppConfigMap);synchronized(mMsgLock) {mMsgLock.notify();}return true;}

AppPowerSaveConfig.java-->writeConfig()

    public static boolean writeConfig(Map<String, AppPowerSaveConfig> appConfigMap) {AtomicFile aFile = new AtomicFile(new File(new File(Environment.getDataDirectory(), "system"), APPCONFIG_FILENAME));FileOutputStream stream;try {stream = aFile.startWrite();} catch (IOException e) {Slog.e(TAG, "Failed to write state: " + e);return false;}try {XmlSerializer serializer = new FastXmlSerializer();serializer.setOutput(stream, "utf-8");serializer.startDocument(null, true);serializer.startTag(null, XML_TAG_FILE);if (appConfigMap!= null) {for (Map.Entry<String, AppPowerSaveConfig> cur : appConfigMap.entrySet()) {final String appName = cur.getKey();final AppPowerSaveConfig config = cur.getValue();if (config.isReset()) continue;serializer.startTag(null, XML_TAG_PKG);serializer.attribute(null, XML_ATTRIBUTE_PKG_NAME, appName);serializer.attribute(null, XML_ATTRIBUTE_PKG_OPTIMIZE, String.valueOf(config.optimize));serializer.attribute(null, XML_ATTRIBUTE_PKG_ALARM, String.valueOf(config.alarm));serializer.attribute(null, XML_ATTRIBUTE_PKG_WAKELOCK, String.valueOf(config.wakelock));serializer.attribute(null, XML_ATTRIBUTE_PKG_NETWORK, String.valueOf(config.network));serializer.attribute(null, XML_ATTRIBUTE_PKG_AUTOLAUNCH, String.valueOf(config.autoLaunch));serializer.attribute(null, XML_ATTRIBUTE_PKG_SECONDARYLAUNCH, String.valueOf(config.secondaryLaunch));serializer.attribute(null, XML_ATTRIBUTE_PKG_LOCKSCREENCLEANUP, String.valueOf(config.lockscreenCleanup));serializer.attribute(null, XML_ATTRIBUTE_PKG_POWERCONSUMERTYPE, String.valueOf(config.powerConsumerType));serializer.endTag(null, XML_TAG_PKG);}}serializer.endTag(null, XML_TAG_FILE);serializer.endDocument();aFile.finishWrite(stream);} catch (IOException e) {Slog.e(TAG, "Failed to write state, restoring backup."+"exp:"+"\n"+e);aFile.failWrite(stream);return false;}return true;}

每次开机的时候,都会读取这个xml文件,将xml的值赋值给mAppConfigMap

private void initData() {......AppPowerSaveConfig.readConfig(mAppConfigMap);......
}

AppPowerSaveConfig.java-->readConfig()

public static boolean readConfig(Map<String, AppPowerSaveConfig> appConfigMap){AtomicFile aFile = new AtomicFile(new File(new File(Environment.getDataDirectory(), "system"), APPCONFIG_FILENAME));InputStream stream = null;try {stream = aFile.openRead();}catch (FileNotFoundException exp){Slog.e(TAG, ">>>file not found,"+exp);}if (null == stream) {aFile = new AtomicFile(new File(new File(Environment.getRootDirectory(), "etc"), APPCONFIG_FILENAME));try {stream = aFile.openRead();} catch (FileNotFoundException exp){Slog.e(TAG, ">>>default file not found,"+exp);return false;}}try {String appName = null;AppPowerSaveConfig appConfig = null;XmlPullParser pullParser = Xml.newPullParser();pullParser.setInput(stream, "UTF-8");int event = pullParser.getEventType();while (event != XmlPullParser.END_DOCUMENT) {switch (event) {case XmlPullParser.START_DOCUMENT://retList = new ArrayList<PowerGuruAlarmInfo>();break;case XmlPullParser.START_TAG:if (XML_TAG_PKG.equals(pullParser.getName())) {appConfig = new AppPowerSaveConfig();appName = pullParser.getAttributeValue(null, XML_ATTRIBUTE_PKG_NAME);appConfig.optimize = Integer.parseInt(pullParser.getAttributeValue(null, XML_ATTRIBUTE_PKG_OPTIMIZE));appConfig.alarm = Integer.parseInt(pullParser.getAttributeValue(null, XML_ATTRIBUTE_PKG_ALARM));appConfig.wakelock = Integer.parseInt(pullParser.getAttributeValue(null, XML_ATTRIBUTE_PKG_WAKELOCK));appConfig.network = Integer.parseInt(pullParser.getAttributeValue(null, XML_ATTRIBUTE_PKG_NETWORK));appConfig.autoLaunch = Integer.parseInt(pullParser.getAttributeValue(null, XML_ATTRIBUTE_PKG_AUTOLAUNCH));appConfig.secondaryLaunch = Integer.parseInt(pullParser.getAttributeValue(null, XML_ATTRIBUTE_PKG_SECONDARYLAUNCH));appConfig.lockscreenCleanup = Integer.parseInt(pullParser.getAttributeValue(null, XML_ATTRIBUTE_PKG_LOCKSCREENCLEANUP));appConfig.powerConsumerType = Integer.parseInt(pullParser.getAttributeValue(null, XML_ATTRIBUTE_PKG_POWERCONSUMERTYPE));}break;case XmlPullParser.END_TAG:if(XML_TAG_PKG.equals(pullParser.getName())) {appConfigMap.put(appName, appConfig);appConfig = null;}break;}event = pullParser.next();}} catch (IllegalStateException e) {Slog.e(TAG, "Failed parsing " + e);return false;} catch (NullPointerException e) {Slog.e(TAG, "Failed parsing " + e);return false;} catch (NumberFormatException e) {Slog.e(TAG, "Failed parsing " + e);return false;} catch (XmlPullParserException e) {Slog.e(TAG, "Failed parsing " + e);return false;} catch (IOException e) {Slog.e(TAG, "Failed parsing " + e);return false;} catch (IndexOutOfBoundsException e) {Slog.e(TAG, "Failed parsing " + e);return false;} finally {try {stream.close();} catch (IOException e) {Slog.e(TAG, "Fail to close stream " + e);return false;} catch (Exception e) {Slog.e(TAG, "exception at last,e: " + e);return false;}}return true;}

Android Sprd省电管理(二)应用省电模式设置流程相关推荐

  1. Android 12系统源码_系统壁纸(二)动态壁纸的设置流程

    在Android中,壁纸分为静态与动态两种.静态壁纸是一张图片,而动态壁纸则以动画为表现形式,或者可以对用户的操作作出反应.这两种形式看似差异很大,其实二者的本质是统一的.它们都以一个Service的 ...

  2. Android广播管理二--广播注册(registerReceiver)流程分析

    前面分析了Android系统的广播机制,从本质来说,它是一种消息订阅/发布机制.因此,使用这种消息驱动模型的第一步便是订阅消息:而对Android应用程序来说,订阅消息其实就是注册广播接收器. 接下来 ...

  3. Android学习之工具类一:系统声音模式设置工具类

    权限:<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> impor ...

  4. Android 核心分析之十二Android GEWS窗口管理之基本架构原理

    Android GWES之窗口管理之基本构架原理 Android的窗口管理是C/S模式的.Android中的Window是表示Top Level等顶级窗口的概念.DecorView是Window的To ...

  5. Android AccountManager帐号管理(二)

    Android AccountManager 帐号管理(一)分享了如何将自己的帐号体系注册到系统服务AccountManagerService,统一由AccountManager来管理,这仅是自己的一 ...

  6. android 开发省电管理,★省电秘籍★ 告别半天一充 安卓手机极致省电方案

    智能手机时代,续航问题一直是让人头疼的问题.由于智能手机屏幕越做越大.手机硬件性能越来越好,尽管电池也在不断增加容量,但是也难以赶上硬件提升导致功耗增加的速度,很多朋友的智能手机电池使用不到半天就需要 ...

  7. 【朝花夕拾】Android性能篇之(二)Java内存分配

    前言       原文:[朝花夕拾]Android性能篇之(二)Java内存分配        在内存方面,相比于C/C++程序员,咱们java系程序员算是比较幸运的,因为对于内存的分配和回收,都交给 ...

  8. Android Studio配置统一管理依赖版本号引用

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo采用的是其中一个方案,其他方案请阅读参考资料<Android Studio中统一管理版本号引用配置> 使用步骤 ...

  9. Android系列之Fragment(二)----Fragment的生命周期和返回栈

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

最新文章

  1. HTML frameset 标签
  2. PopupMenu消失(Dismiss)抓住
  3. 计算机的桌面图片还原,电脑桌面图标重启后自动复原的解决方法。
  4. liferay 如何添加css或者js
  5. how to resolve error message java.lang.ClassNotFoundException: org.springframework
  6. 写时复制就这么几行代码,还是不会?
  7. (转)使用tar和split打包分割文件
  8. Javascript的错误处理
  9. 利用console控制台调试php代码
  10. SCO UNIX环境下自动增加网关的两种方法
  11. Android:JNI与NDK(二)交叉编译与动态库,静态库
  12. markdown新手入门使用指南
  13. 在ASP.NET WebAPI 中使用缓存【Redis】
  14. 动态FormBean
  15. Deli条码打印机如何批量打印二维码
  16. 理解Java虚拟机(七)低延迟垃圾收集器-Shenandoah
  17. numpy多维数组获取指定矩形区域
  18. nba2k14mod android,nba2k14安卓mod
  19. 要做差异性分析,如何选择正确的统计方法?
  20. 江苏省高中计算机合格性考试题目,江苏省2020年普通高中学业水平合格性考试试卷(含答案)...

热门文章

  1. 中国程序员的真实工资亦或幸福指数
  2. 计算机wold标题文字加背景,office word文档添加背景图片以及背景颜色来美化枯燥乏味的文字...
  3. Eclipse中maven项目update project后项目编码会自动变成GBK的问题
  4. python读取dxf文件_GitHub - XUIgit/dxfReader: dxf文件解析 用来提取CAD中的dxf文件格式所保存的图像信息...
  5. PHP经典实例读书笔记--变量
  6. Hive中的distribute by、order by、sort by解析
  7. 自学Java day53 使用jvav实现 并查集 数据结构 从jvav到架构师
  8. 华为p4支持鸿蒙功能吗_华为P40或用鸿蒙 鸿蒙系统支持哪些手机 鸿蒙系统什么时候能用...
  9. 动态拨号vps有什么作用?
  10. 你还在找全国省市县大全吗