From 7278e9f22fefcd829f42001c9f1088bbe0c6e552 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Fri, 26 Dec 2025 19:47:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=BA=90=E7=A0=81=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activities/BatteryReportActivity.java | 50 ++++++++----------- .../activities/ClearRecordActivity.java | 45 +++++++++-------- 2 files changed, 45 insertions(+), 50 deletions(-) diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BatteryReportActivity.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BatteryReportActivity.java index 547f64d..dd38fe0 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BatteryReportActivity.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BatteryReportActivity.java @@ -39,8 +39,8 @@ import java.util.Map; public class BatteryReportActivity extends WinBoLLActivity implements IWinBoLLActivity { // ======================== 静态常量(按功能分类) ========================= public static final String TAG = "BatteryReportActivity"; - private static final long ONE_DAY_MS = 24 * 3600 * 1000; // 24小时毫秒数 - private static final long ONE_MINUTE_MS = 60 * 1000; // 1分钟毫秒数 + private static final long ONE_DAY_MS = 24 * 3600 * 1000; // 24小时毫秒数 + private static final long ONE_MINUTE_MS = 60 * 1000; // 1分钟毫秒数 // ======================== 成员变量(按依赖优先级+功能分类) ========================= // UI组件 @@ -50,18 +50,18 @@ public class BatteryReportActivity extends WinBoLLActivity implements IWinBoLLAc // 数据与适配器 private BatteryReportAdapter adapter; - private List dataList = new ArrayList(); - private List filteredList = new ArrayList(); + private List dataList = new ArrayList<>(); + private List filteredList = new ArrayList<>(); // 电池相关 private BroadcastReceiver batteryReceiver; - private int batteryCapacity = 5400; // 电池容量(mAh) - private float lastBatteryPercent = 100.0f; - private long lastCheckTime = System.currentTimeMillis(); + private int batteryCapacity = 5400; // 电池容量(mAh) + private float lastBatteryPercent = 100.0f; // 上次电池百分比 + private long lastCheckTime = System.currentTimeMillis(); // 上次检查时间戳 // 缓存相关 - private Map appRunTimeCache = new HashMap(); - private Map packageToAppNameCache = new HashMap(); + private Map appRunTimeCache = new HashMap<>(); + private Map packageToAppNameCache = new HashMap<>(); private PackageManager mPackageManager; // ======================== 接口实现方法 ========================= @@ -110,9 +110,8 @@ public class BatteryReportActivity extends WinBoLLActivity implements IWinBoLLAc rvBatteryReport.setAdapter(adapter); LogUtils.d(TAG, "【onCreate】适配器初始化完成,过滤后数据量:" + filteredList.size()); - // 绑定搜索监听 + // 绑定搜索监听 + 注册电池广播 bindSearchListener(); - // 注册电池广播 registerBatteryReceiver(); LogUtils.d(TAG, "【onCreate】BatteryReportActivity 初始化完成"); @@ -185,11 +184,14 @@ public class BatteryReportActivity extends WinBoLLActivity implements IWinBoLLAc float dropPercent = lastBatteryPercent - currentPercent; long duration = System.currentTimeMillis() - lastCheckTime; LogUtils.d(TAG, "【电池广播】电池消耗:" + dropPercent + "%,时长:" + formatRunTime(duration)); + + // 更新运行时长并计算耗电 appRunTimeCache = getAppRunTime(); updateAppRunTimeToModel(); calculateSingleConsumptionAndAccumulate(dropPercent, appRunTimeCache); } + // 刷新记录 lastBatteryPercent = currentPercent; lastCheckTime = System.currentTimeMillis(); } @@ -234,15 +236,12 @@ public class BatteryReportActivity extends WinBoLLActivity implements IWinBoLLAc private void loadAllAppPackage() { List appList = mPackageManager.getInstalledApplications(PackageManager.GET_META_DATA); dataList.clear(); - LogUtils.d(TAG, "【loadAllAppPackage】开始加载应用包名列表,共找到" + appList.size() + "个应用"); for (ApplicationInfo appInfo : appList) { String packageName = appInfo.packageName; - // 初始化:单次耗电=0,累计耗电=0,运行时长=0 dataList.add(new AppBatteryModel(packageName, 0.0f, 0.0f, 0)); } - LogUtils.d(TAG, "【loadAllAppPackage】应用包名列表加载完成,共添加" + dataList.size() + "个包名"); } @@ -258,7 +257,6 @@ public class BatteryReportActivity extends WinBoLLActivity implements IWinBoLLAc String appName = getAppNameByPackage(packageName); packageToAppNameCache.put(packageName, appName); } - LogUtils.d(TAG, "【preCacheAllAppNames】预缓存完成,共缓存" + packageToAppNameCache.size() + "个应用名称"); } @@ -302,7 +300,7 @@ public class BatteryReportActivity extends WinBoLLActivity implements IWinBoLLAc * @return 应用包名-运行时长(ms)映射 */ private Map getAppRunTime() { - Map runTimeMap = new HashMap(); + Map runTimeMap = new HashMap<>(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { try { android.app.usage.UsageStatsManager manager = @@ -347,7 +345,6 @@ public class BatteryReportActivity extends WinBoLLActivity implements IWinBoLLAc String packageName = model.getPackageName(); Long app24hRunTime = appRunTimeCache.getOrDefault(packageName, 0L); - // 计算占比与累计耗电 float ratio = (total24hRunTime > 0) ? (float) app24hRunTime / total24hRunTime : 0; float initialTotalConsumption = batteryCapacity * ratio; model.setTotalConsumption(initialTotalConsumption); @@ -357,9 +354,9 @@ public class BatteryReportActivity extends WinBoLLActivity implements IWinBoLLAc } /** - * 计算单次耗电(赋值给consumption)+ 累加至累计耗电(totalConsumption = totalConsumption + consumption) + * 计算单次耗电(赋值给consumption)+ 累加至累计耗电 * @param dropPercent 电池下降百分比 - * @param runTimeMap 应用运行时长映射 + * @param runTimeMap 应用运行时长映射 */ private void calculateSingleConsumptionAndAccumulate(float dropPercent, Map runTimeMap) { LogUtils.d(TAG, "【calculateSingleConsumptionAndAccumulate】开始计算,电池下降百分比:" + dropPercent); @@ -370,28 +367,25 @@ public class BatteryReportActivity extends WinBoLLActivity implements IWinBoLLAc } LogUtils.d(TAG, "【calculateSingleConsumptionAndAccumulate】本次电池下降总运行时长:" + formatRunTime(totalSingleRunTime)); - // 2. 遍历计算每个应用的“单次耗电”并“累加至累计” + // 2. 遍历计算每个应用的单次耗电并累加 for (AppBatteryModel model : dataList) { String packageName = model.getPackageName(); Long appSingleRunTime = runTimeMap.getOrDefault(packageName, 0L); - // 步骤1:计算本次单次耗电 float ratio = (totalSingleRunTime > 0) ? (float) appSingleRunTime / totalSingleRunTime : 0; float singleConsumption = batteryCapacity * dropPercent / 100 * ratio; model.setConsumption(singleConsumption); - // 步骤2:累加单次耗电到累计耗电 + // 累加至累计耗电 float newTotalConsumption = model.getTotalConsumption() + singleConsumption; model.setTotalConsumption(newTotalConsumption); - - // 同步运行时长 model.setRunTime(appSingleRunTime); LogUtils.v(TAG, String.format("【calculateSingleConsumptionAndAccumulate】应用包%s:单次耗电%.1f mAh,累计耗电%.1f mAh", packageName, singleConsumption, newTotalConsumption)); } - // 3. 按累计耗电排序(从高到低) + // 3. 按累计耗电降序排序 Collections.sort(dataList, new Comparator() { @Override public int compare(AppBatteryModel m1, AppBatteryModel m2) { @@ -399,7 +393,7 @@ public class BatteryReportActivity extends WinBoLLActivity implements IWinBoLLAc } }); - // 4. 重新应用过滤并刷新列表 + // 4. 重新过滤并刷新列表 filterAppsByPackageAndName(etSearch.getText().toString().trim()); LogUtils.d(TAG, "【calculateSingleConsumptionAndAccumulate】单次耗电计算与累加完成,列表已刷新"); } @@ -421,9 +415,7 @@ public class BatteryReportActivity extends WinBoLLActivity implements IWinBoLLAc String appName = packageToAppNameCache.get(packageName); String appNameLower = appName.toLowerCase(); - boolean isMatched = packageNameLower.contains(lowerKeyword) - || appNameLower.contains(lowerKeyword); - + boolean isMatched = packageNameLower.contains(lowerKeyword) || appNameLower.contains(lowerKeyword); if (isMatched) { filteredList.add(model); } diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ClearRecordActivity.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ClearRecordActivity.java index 69970d5..a942d55 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ClearRecordActivity.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ClearRecordActivity.java @@ -22,19 +22,20 @@ import java.util.ArrayList; /** * 电池记录清理页面,支持滑动清理记录、切换记录显示格式 * 适配 API30,基于 Java7 开发 - * @Author ZhanGSKen&豆包大模型 + * @Author 豆包&ZhanGSKen */ public class ClearRecordActivity extends WinBoLLActivity implements IWinBoLLActivity { - // ======================== 静态常量 ========================= + // ======================== 静态常量(按功能分类) ========================= public static final String TAG = "ClearRecordActivity"; private static final String TOAST_MSG_CLEAR_SUCCESS = "The APP battery record is cleaned."; - // ======================== 成员变量 ========================= + // ======================== 成员变量(按依赖优先级+功能分类) ========================= // UI组件 private Toolbar mToolbar; private TextView mtvRecordText; private TextView tvAOHPCTCSeekBarMSG; private AOHPCTCSeekBar aOHPCTCSeekBar; + // 应用与配置 private App mApplication; private boolean mIsShowRecordWithEnter = false; // 记录是否带换行显示 @@ -50,7 +51,7 @@ public class ClearRecordActivity extends WinBoLLActivity implements IWinBoLLActi return TAG; } - // ======================== 生命周期方法 ========================= + // ======================== 生命周期方法(按执行顺序排列) ========================= @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -59,11 +60,11 @@ public class ClearRecordActivity extends WinBoLLActivity implements IWinBoLLActi // 初始化应用实例 mApplication = (App) getApplication(); - // 初始化UI组件 + LogUtils.d(TAG, "【onCreate】应用实例初始化完成"); + + // 初始化核心逻辑 initView(); - // 初始化滑动清理控件 initSeekBar(); - // 初始化记录显示文本 initRecordText(); LogUtils.d(TAG, "【onCreate】ClearRecordActivity 初始化完成"); @@ -75,7 +76,7 @@ public class ClearRecordActivity extends WinBoLLActivity implements IWinBoLLActi */ private void initView() { // 初始化Toolbar - mToolbar = findViewById(R.id.toolbar); + mToolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(mToolbar); mToolbar.setSubtitle(getTag()); mToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText); @@ -83,29 +84,30 @@ public class ClearRecordActivity extends WinBoLLActivity implements IWinBoLLActi mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - LogUtils.d(TAG, "【导航栏】点击返回"); + LogUtils.d(TAG, "【导航栏】点击返回按钮,关闭当前页面"); finish(); } }); // 初始化显示文本组件 - tvAOHPCTCSeekBarMSG = findViewById(R.id.activityclearrecordTextView1); - mtvRecordText = findViewById(R.id.activityclearrecordTextView2); + tvAOHPCTCSeekBarMSG = (TextView) findViewById(R.id.activityclearrecordTextView1); + mtvRecordText = (TextView) findViewById(R.id.activityclearrecordTextView2); tvAOHPCTCSeekBarMSG.setText(R.string.msg_AOHPCTCSeekBar_ClearRecord); + LogUtils.d(TAG, "【initView】UI组件初始化完成"); } /** - * 初始化滑动清理控件 + * 初始化滑动清理控件,设置回调监听 */ private void initSeekBar() { - aOHPCTCSeekBar = findViewById(R.id.activityclearrecordAOHPCTCSeekBar1); + aOHPCTCSeekBar = (AOHPCTCSeekBar) findViewById(R.id.activityclearrecordAOHPCTCSeekBar1); aOHPCTCSeekBar.setThumb(getDrawable(R.drawable.cursor_pointer)); aOHPCTCSeekBar.setThumbOffset(0); aOHPCTCSeekBar.setOnOHPCListener(new AOHPCTCSeekBar.OnOHPCListener() { @Override public void onOHPCommit() { - LogUtils.d(TAG, "【onOHPCommit】滑动清理触发"); + LogUtils.d(TAG, "【onOHPCommit】滑动清理触发,开始执行记录清理逻辑"); // 清理电池历史记录 mApplication.clearBatteryHistory(); // 发送广播更新前台通知 @@ -114,10 +116,11 @@ public class ClearRecordActivity extends WinBoLLActivity implements IWinBoLLActi initRecordText(); // 提示清理成功 ToastUtils.show(TOAST_MSG_CLEAR_SUCCESS); - LogUtils.d(TAG, "【onOHPCommit】电池记录清理完成,已发送更新广播"); + LogUtils.d(TAG, "【onOHPCommit】电池记录清理完成,已发送前台通知更新广播"); } }); - LogUtils.d(TAG, "【initSeekBar】滑动清理控件初始化完成"); + + LogUtils.d(TAG, "【initSeekBar】滑动清理控件初始化完成,回调监听已绑定"); } // ======================== 业务逻辑方法 ========================= @@ -131,20 +134,20 @@ public class ClearRecordActivity extends WinBoLLActivity implements IWinBoLLActi // 判空处理:避免空列表导致异常 if (listBatteryInfo == null || listBatteryInfo.isEmpty()) { szRecordText = getString(R.string.msg_no_battery_record); - LogUtils.d(TAG, "【initRecordText】无电池记录数据"); + LogUtils.d(TAG, "【initRecordText】无电池记录数据,显示空记录提示文本"); } else { // 根据配置切换显示格式 if (mIsShowRecordWithEnter) { szRecordText = StringUtils.formatPCMListStringWithEnter(listBatteryInfo); - LogUtils.d(TAG, "【initRecordText】使用带换行格式显示记录,数量:" + listBatteryInfo.size()); + LogUtils.d(TAG, String.format("【initRecordText】使用带换行格式显示记录,记录数量:%d", listBatteryInfo.size())); } else { szRecordText = StringUtils.formatPCMListString(listBatteryInfo); - LogUtils.d(TAG, "【initRecordText】使用无换行格式显示记录,数量:" + listBatteryInfo.size()); + LogUtils.d(TAG, String.format("【initRecordText】使用无换行格式显示记录,记录数量:%d", listBatteryInfo.size())); } } mtvRecordText.setText(szRecordText); - LogUtils.d(TAG, "【initRecordText】记录显示文本初始化完成"); + LogUtils.d(TAG, "【initRecordText】记录显示文本刷新完成"); } // ======================== 事件回调方法 ========================= @@ -155,7 +158,7 @@ public class ClearRecordActivity extends WinBoLLActivity implements IWinBoLLActi public void onShowRecordWithEnter(View view) { Switch swShowRecordWithEnter = (Switch) view; mIsShowRecordWithEnter = swShowRecordWithEnter.isChecked(); - LogUtils.d(TAG, "【onShowRecordWithEnter】记录显示格式切换,带换行:" + mIsShowRecordWithEnter); + LogUtils.d(TAG, String.format("【onShowRecordWithEnter】记录显示格式切换,带换行显示:%b", mIsShowRecordWithEnter)); // 刷新记录显示 initRecordText(); }