概况
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_NAME(com.***.android.savepowermanager_preferences)中获取键值ManagerUtil.FORBIT_ALARM_APP_LIST_KEY中保存的数据,将获取的数据保存到forbitPkgs数组中,如果没有数据则返回null。
allowPkgs:表示允许唤醒的名单,界面没有勾选的应用。初始数据从SharedPreference数据库ManagerUtil.PRE_NAME(com.***.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 =