功耗优化--对齐唤醒

本文详细介绍了Android系统中针对应用频繁唤醒导致的功耗问题的对齐唤醒管理方案。通过在应用层和系统层实现机制,如黑名单管理、闹钟类型修改等,以达到智能节省电量的目的。当对齐唤醒名单发生变化时,通过发送广播通知AlarmManagerService进行相应调整。
摘要由CSDN通过智能技术生成

概况

Android手机上安装的很多应用都会频繁唤醒手机(唤醒系统、唤醒屏幕),造成手机耗电等现象。良好的对齐唤醒管理方案,就是对后台应用待机时不频繁唤醒,智能节省电量。

实现原理:APK作为该功能的入口,勾选应用后,将勾选的应用写入黑名单,并通知framework黑名单内容变化;framework接收到通知后,自动获取黑名单中的应用,保存到列表中;在framework调用接口中检测应用是否在黑名单中,如果在黑名单中则检测闹钟类型,如果闹钟类型是0或2,对应修改为1或3。

应用层功能实现

APK界面初始化

在ForbitAlarmLogic构造方法中初始化了数组列表listPkgs、forbitPkgs、allowPkgs、showPkgs。

listPkgs:表示需要设置对齐唤醒的应用,如果这些应用已经安装,就会显示在对齐唤醒设置的界面上。初始数据从/data/data/com.***.android.security/app_bin/forbitapplist.xml中获取,如果文件不存在,则从本地资源数组security_array_savepower_forbitalarms中获取。

forbitPkgs:表示对齐唤醒名单,即禁止唤醒的名单,界面勾选的应用。初始数据从SharedPreference数据库名ManagerUtil.PRE_NAMEcom.***.android.savepowermanager_preferences中获取键值ManagerUtil.FORBIT_ALARM_APP_LIST_KEY中保存的数据,将获取的数据保存到forbitPkgs数组中,如果没有数据则返回null。

allowPkgs:表示允许唤醒的名单,界面没有勾选的应用。初始数据从SharedPreference数据库ManagerUtil.PRE_NAMEcom.***.android.savepowermanager_preferences中获取键值为ManagerUtil.ALLOW_ALARM_APP_LIST_KEY中保存的数据,将获取的数据保存到allowPkgs数组列表中;如果没有数据则返回null。

showPkgs:表示要显示在对齐唤醒设置界面的数组应用列表,在数据初始化之前先将该数组清空。对齐唤醒方案优化之前,该数组保存的是listPkgs列表与已安装应用的交集。优化之后,同时还保存了已安装的第三方应用。

    public ForbitAlarmLogic(Context ctx) {
        this.mCtx = ctx;
        pm = ctx.getPackageManager();
        xmlAppList = Util.getDefaultDataPath(ctx) + "/app_bin/applist.xml";
        String xmlFile = Util.getDefaultDataPath(ctx)+"/app_bin/forbitapplist.xml";
        File f = new File(xmlFile);
        if (!f.exists()) {
            Log.e("forbitapplist not exist!");
            String[] strs = mCtx.getResources().getStringArray(R.array.security_array_savepower_forbitalarms);
            for (String str : strs) {
                listPkgs.add(str);
            }
        } else {
            readFromXmlWithFilename(xmlFile, listPkgs);
        }
//      readFromXml();
        Set<String> forbitset = (Set<String>)ManagerUtil.getPreferenceValue(mCtx, ManagerUtil.PRE_NAME,
                ManagerUtil.FORBIT_ALARM_APP_LIST_KEY, null, 4);
        if (forbitset != null) {
            Iterator<String> forbitir = forbitset.iterator();
            while(forbitir.hasNext()) {
                String forbit = forbitir.next();
                forbitPkgs.add(forbit);
            }
        }

        Set<String> allowset =
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值