添加广播接收器的注册与释放。

This commit is contained in:
2025-12-20 13:49:02 +08:00
parent 23beabe99b
commit 1d9a03554c
3 changed files with 31 additions and 15 deletions

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Sat Dec 20 05:22:35 GMT 2025 #Sat Dec 20 05:46:25 GMT 2025
stageCount=10 stageCount=10
libraryProject= libraryProject=
baseVersion=15.14 baseVersion=15.14
publishVersion=15.14.9 publishVersion=15.14.9
buildCount=51 buildCount=54
baseBetaVersion=15.14.10 baseBetaVersion=15.14.10

View File

@@ -22,11 +22,11 @@ import java.lang.ref.WeakReference;
*/ */
public class ControlCenterServiceReceiver extends BroadcastReceiver { public class ControlCenterServiceReceiver extends BroadcastReceiver {
// ================================== 静态常量区(置顶归类,消除魔法值)================================= // ================================== 静态常量区(置顶归类,消除魔法值)=================================
public static final String TAG = ControlCenterServiceReceiver.class.getSimpleName(); public static final String TAG = "ControlCenterServiceReceiver";
// 广播Action常量带包名前缀防冲突 // 广播Action常量带包名前缀防冲突
public static final String ACTION_UPDATE_FOREGROUND_NOTIFICATION = "cc.winboll.studio.powerbell.action.ACTION_UPDATE_SERVICE_FOREGROUND_NOTIFICATION"; public static final String ACTION_UPDATE_FOREGROUND_NOTIFICATION = "cc.winboll.studio.powerbell.action.ACTION_UPDATE_FOREGROUND_NOTIFICATION";
public static final String ACTION_APPCONFIG_CHANGED = "cc.winboll.studio.powerbell.action.ACTION_START_REMIND__NOTIFICATION"; public static final String ACTION_APPCONFIG_CHANGED = "cc.winboll.studio.powerbell.action.ACTION_APPCONFIG_CHANGED";
public static final String EXTRA_APP_CONFIG_BEAN = "extra_app_config_bean"; public static final String EXTRA_APP_CONFIG_BEAN = "extra_app_config_bean";
// 广播优先级与电量范围常量 // 广播优先级与电量范围常量
@@ -129,7 +129,7 @@ public class ControlCenterServiceReceiver extends BroadcastReceiver {
private void handleNotifyAppConfigUpdate(ControlCenterService service) { private void handleNotifyAppConfigUpdate(ControlCenterService service) {
LogUtils.d(TAG, "handleNotifyAppConfigUpdate: 同步缓存状态到配置 | service=" + service); LogUtils.d(TAG, "handleNotifyAppConfigUpdate: 同步缓存状态到配置 | service=" + service);
try { try {
// 加载最新配置(三级兜底) // 加载最新配置
AppConfigBean latestConfig = AppConfigUtils.getInstance(service).loadAppConfig(); AppConfigBean latestConfig = AppConfigUtils.getInstance(service).loadAppConfig();
// 同步缓存的电池状态到配置 // 同步缓存的电池状态到配置

View File

@@ -9,7 +9,6 @@ import android.os.Build;
import android.os.IBinder; import android.os.IBinder;
import android.os.PowerManager; import android.os.PowerManager;
import android.provider.Settings; import android.provider.Settings;
import java.util.List;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.ToastUtils; import cc.winboll.studio.libappbase.ToastUtils;
import cc.winboll.studio.powerbell.handlers.ControlCenterServiceHandler; import cc.winboll.studio.powerbell.handlers.ControlCenterServiceHandler;
@@ -19,6 +18,7 @@ import cc.winboll.studio.powerbell.models.NotificationMessage;
import cc.winboll.studio.powerbell.receivers.ControlCenterServiceReceiver; import cc.winboll.studio.powerbell.receivers.ControlCenterServiceReceiver;
import cc.winboll.studio.powerbell.threads.RemindThread; import cc.winboll.studio.powerbell.threads.RemindThread;
import cc.winboll.studio.powerbell.utils.NotificationManagerUtils; import cc.winboll.studio.powerbell.utils.NotificationManagerUtils;
import java.util.List;
/** /**
* 电池提醒核心服务 * 电池提醒核心服务
@@ -31,7 +31,7 @@ public class ControlCenterService extends Service {
// 超时/阈值常量 // 超时/阈值常量
private static final long THREAD_STOP_TIMEOUT = 1000L; private static final long THREAD_STOP_TIMEOUT = 1000L;
// 服务状态标记常量 // 服务返回策略常量
private static final int SERVICE_RETURN_STICKY = START_STICKY; private static final int SERVICE_RETURN_STICKY = START_STICKY;
// ================================== 成员变量区按功能分层volatile保证多线程可见性================================= // ================================== 成员变量区按功能分层volatile保证多线程可见性=================================
@@ -39,6 +39,7 @@ public class ControlCenterService extends Service {
private ControlCenterServiceBean mServiceControlBean; private ControlCenterServiceBean mServiceControlBean;
// 业务核心组件 // 业务核心组件
private ControlCenterServiceHandler mServiceHandler; private ControlCenterServiceHandler mServiceHandler;
private ControlCenterServiceReceiver mControlCenterServiceReceiver;
private NotificationManagerUtils mNotificationManager; private NotificationManagerUtils mNotificationManager;
private AppConfigBean mCurrentConfigBean; private AppConfigBean mCurrentConfigBean;
private NotificationMessage mForegroundNotifyMsg; private NotificationMessage mForegroundNotifyMsg;
@@ -82,9 +83,13 @@ public class ControlCenterService extends Service {
LogUtils.d(TAG, "onDestroy: 服务销毁流程启动"); LogUtils.d(TAG, "onDestroy: 服务销毁流程启动");
super.onDestroy(); super.onDestroy();
// 资源释放顺序:前台服务 → 线程 → Handler → 通知 → 引用(避免内存泄漏) // 资源释放顺序:前台服务 → 线程 → 广播接收器 → Handler → 通知 → 引用(避免内存泄漏)
stopForegroundService(); stopForegroundService();
RemindThread.stopRemindThreadSafely(); RemindThread.stopRemindThreadSafely();
if (mControlCenterServiceReceiver != null) {
mControlCenterServiceReceiver.release();
LogUtils.d(TAG, "onDestroy: 广播接收器已释放");
}
destroyHandler(); destroyHandler();
releaseNotificationResource(); releaseNotificationResource();
clearAllReferences(); clearAllReferences();
@@ -200,7 +205,7 @@ public class ControlCenterService extends Service {
mCurrentConfigBean.setEnableUsageReminder(true); mCurrentConfigBean.setEnableUsageReminder(true);
mCurrentConfigBean.setUsageReminderValue(20); mCurrentConfigBean.setUsageReminderValue(20);
mCurrentConfigBean.setBatteryDetectInterval(1000); mCurrentConfigBean.setBatteryDetectInterval(1000);
LogUtils.d(TAG, "loadDefaultConfig: 默认配置加载完成 | 充电阈值=80 | 耗电阈值=20"); LogUtils.d(TAG, "loadDefaultConfig: 默认配置加载完成 | 充电阈值=80 | 耗电阈值=20 | 检测间隔=1000ms");
} else { } else {
LogUtils.d(TAG, "loadDefaultConfig: 内存已有配置,无需加载"); LogUtils.d(TAG, "loadDefaultConfig: 内存已有配置,无需加载");
} }
@@ -212,12 +217,21 @@ public class ControlCenterService extends Service {
*/ */
private void initServiceBusinessLogic() { private void initServiceBusinessLogic() {
LogUtils.d(TAG, "initServiceBusinessLogic: 初始化业务组件"); LogUtils.d(TAG, "initServiceBusinessLogic: 初始化业务组件");
// 初始化Handler
if (mServiceHandler == null) { if (mServiceHandler == null) {
mServiceHandler = new ControlCenterServiceHandler(this); mServiceHandler = new ControlCenterServiceHandler(this);
LogUtils.d(TAG, "initServiceBusinessLogic: Handler初始化完成"); LogUtils.d(TAG, "initServiceBusinessLogic: Handler初始化完成");
} else { } else {
LogUtils.d(TAG, "initServiceBusinessLogic: Handler已存在"); LogUtils.d(TAG, "initServiceBusinessLogic: Handler已存在");
} }
// 初始化广播接收器
if (mControlCenterServiceReceiver == null) {
mControlCenterServiceReceiver = new ControlCenterServiceReceiver(this);
mControlCenterServiceReceiver.registerAction(this);
LogUtils.d(TAG, "initServiceBusinessLogic: 广播接收器初始化并注册完成");
} else {
LogUtils.d(TAG, "initServiceBusinessLogic: 广播接收器已存在");
}
} }
/** /**
@@ -273,15 +287,16 @@ public class ControlCenterService extends Service {
// 保存启用配置 // 保存启用配置
ControlCenterServiceBean controlBean = new ControlCenterServiceBean(true); ControlCenterServiceBean controlBean = new ControlCenterServiceBean(true);
ControlCenterServiceBean.saveBean(context, controlBean); ControlCenterServiceBean.saveBean(context, controlBean);
LogUtils.d(TAG, "startControlCenterService: 服务启用配置已保存");
// 启动服务区分API版本 // 启动服务区分API版本
Intent intent = new Intent(context, ControlCenterService.class); Intent intent = new Intent(context, ControlCenterService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(intent); context.startForegroundService(intent);
LogUtils.d(TAG, "startControlCenterService: 以前台服务方式启动"); LogUtils.d(TAG, "startControlCenterService: 以前台服务方式启动API26+");
} else { } else {
context.startService(intent); context.startService(intent);
LogUtils.d(TAG, "startControlCenterService: 以普通服务方式启动"); LogUtils.d(TAG, "startControlCenterService: 以普通服务方式启动API26-");
} }
} }
@@ -299,6 +314,7 @@ public class ControlCenterService extends Service {
// 保存停用配置 // 保存停用配置
ControlCenterServiceBean controlBean = new ControlCenterServiceBean(false); ControlCenterServiceBean controlBean = new ControlCenterServiceBean(false);
ControlCenterServiceBean.saveBean(context, controlBean); ControlCenterServiceBean.saveBean(context, controlBean);
LogUtils.d(TAG, "stopControlCenterService: 服务停用配置已保存");
// 停止服务 // 停止服务
Intent intent = new Intent(context, ControlCenterService.class); Intent intent = new Intent(context, ControlCenterService.class);
@@ -331,7 +347,7 @@ public class ControlCenterService extends Service {
public static void checkIgnoreBatteryOptimization(Context context) { public static void checkIgnoreBatteryOptimization(Context context) {
LogUtils.d(TAG, "checkIgnoreBatteryOptimization: 检查电池优化 | context=" + context); LogUtils.d(TAG, "checkIgnoreBatteryOptimization: 检查电池优化 | context=" + context);
if (context == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { if (context == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
LogUtils.w(TAG, "checkIgnoreBatteryOptimization: 无需检查"); LogUtils.w(TAG, "checkIgnoreBatteryOptimization: 无需检查Context为空或API<23");
return; return;
} }
@@ -361,7 +377,7 @@ public class ControlCenterService extends Service {
* @return true=运行中 false=未运行 * @return true=运行中 false=未运行
*/ */
private static boolean isServiceRunning(Context context, Class<?> serviceClass) { private static boolean isServiceRunning(Context context, Class<?> serviceClass) {
LogUtils.d(TAG, "isServiceRunning: 检查服务状态 | context=" + context + " | service=" + serviceClass.getName()); LogUtils.d(TAG, "isServiceRunning: 检查服务状态 | context=" + context + " | service=" + (serviceClass != null ? serviceClass.getName() : "null"));
if (context == null || serviceClass == null) { if (context == null || serviceClass == null) {
LogUtils.e(TAG, "isServiceRunning: 参数为空"); LogUtils.e(TAG, "isServiceRunning: 参数为空");
return false; return false;
@@ -437,7 +453,7 @@ public class ControlCenterService extends Service {
if (latestConfig != null && mServiceHandler != null) { if (latestConfig != null && mServiceHandler != null) {
mCurrentConfigBean = latestConfig; mCurrentConfigBean = latestConfig;
RemindThread.startRemindThread(this, mServiceHandler, latestConfig); RemindThread.startRemindThread(this, mServiceHandler, latestConfig);
LogUtils.d(TAG, "notifyAppConfigUpdate: 配置已同步到提醒线程"); LogUtils.d(TAG, "notifyAppConfigUpdate: 配置已同步到提醒线程 | 充电阈值=" + latestConfig.getChargeReminderValue() + " | 耗电阈值=" + latestConfig.getUsageReminderValue());
} else { } else {
LogUtils.e(TAG, "notifyAppConfigUpdate: 参数为空,同步失败 | latestConfig=" + latestConfig + " | mServiceHandler=" + mServiceHandler); LogUtils.e(TAG, "notifyAppConfigUpdate: 参数为空,同步失败 | latestConfig=" + latestConfig + " | mServiceHandler=" + mServiceHandler);
} }