修复闹钟没有循环的bug

This commit is contained in:
Zhanghu
2026-03-13 09:07:26 +08:00
parent 08144f5106
commit 6c0204325f
5 changed files with 76 additions and 15 deletions

View File

@@ -9,15 +9,17 @@ author:
2. $ {VERSION_CODE} (去掉空格),会自动替换实际修订号,比如 1.1.4.$ {VERSION_CODE}
-->
### [1.0.6.$ {VERSION_CODE}] - 2026.3.X
### [1.1.0.${VERSION_CODE}] - 2026.3.13
#### 文件下载
* [dashboardclient_1.0.6.apk](dashboardclient_1.0.6.apk)
* [dashboardclient_1.1.0.apk](dashboardclient_1.1.0.apk)
#### 更新记录
* 设置界面增加电源开关测试
* App 启动时默认不发送开机指令
* WebView 启用 LocalStorage支持新版前端
* 优化定时开关机逻辑,增加不控制和本地控制
* 命令发送3次避免命令丢失
* 支持老款网关检测
### [1.0.5.26] - 2026.3.5

View File

@@ -29,7 +29,6 @@
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
@@ -55,5 +54,4 @@
</intent-filter>
</receiver>
</application>
</manifest>

View File

@@ -276,6 +276,10 @@ public class PowerAlarmManager {
Intent intent = new Intent(context, CommandBroadcastReceiver.class);
intent.setAction(CommandBroadcastReceiver.ACTION_SEND_COMMAND);
intent.putExtra(CommandBroadcastReceiver.EXTRA_COMMAND_HEX, cmdHex);
// 传递时间信息和 alarmId用于重新设置下一个闹钟
intent.putExtra(CommandBroadcastReceiver.EXTRA_HOUR, hour);
intent.putExtra(CommandBroadcastReceiver.EXTRA_MINUTE, minute);
intent.putExtra(CommandBroadcastReceiver.EXTRA_ALARM_ID, alarmId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context, alarmId, intent,

View File

@@ -1,11 +1,18 @@
package cn.ykbox.dashboard.receiver;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
import java.util.Calendar;
import cn.ykbox.dashboard.perferences.PreferenceConfiguration;
import cn.ykbox.dashboard.serial.SerialPortDetector;
@@ -13,6 +20,9 @@ public class CommandBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "CommandReceiver";
public static final String ACTION_SEND_COMMAND = "cn.ykbox.dashboard.ACTION_SEND_COMMAND";
public static final String EXTRA_COMMAND_HEX = "EXTRA_COMMAND_HEX";
public static final String EXTRA_HOUR = "EXTRA_HOUR";
public static final String EXTRA_MINUTE = "EXTRA_MINUTE";
public static final String EXTRA_ALARM_ID = "EXTRA_ALARM_ID";
@Override
public void onReceive(Context context, Intent intent) {
@@ -30,7 +40,61 @@ public class CommandBroadcastReceiver extends BroadcastReceiver {
if (!success) {
Log.e(TAG, "Failed to send command via broadcast receiver.");
}
// 重新设置明天的闹钟(实现每天循环)
Integer hour = intent.getIntExtra(EXTRA_HOUR, -1);
Integer minute = intent.getIntExtra(EXTRA_MINUTE, -1);
int alarmId = intent.getIntExtra(EXTRA_ALARM_ID, 0);
if (hour >= 0 && minute >= 0) {
scheduleNextAlarm(context, alarmId, hexCommand, hour, minute);
}
}
}
}
/**
* 调度下一个闹钟(明天同一时间)
*/
private void scheduleNextAlarm(Context context, int alarmId, String cmdHex, int hour, int minute) {
new Handler(Looper.getMainLooper()).post(() -> {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, CommandBroadcastReceiver.class);
intent.setAction(ACTION_SEND_COMMAND);
intent.putExtra(EXTRA_COMMAND_HEX, cmdHex);
intent.putExtra(EXTRA_HOUR, hour);
intent.putExtra(EXTRA_MINUTE, minute);
intent.putExtra(EXTRA_ALARM_ID, alarmId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context, alarmId, intent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
);
// 计算明天的触发时间
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, 1);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
// 使用精确的一次性闹钟
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), pendingIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(
AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), pendingIntent);
} else {
alarmManager.set(
AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), pendingIntent);
}
Log.d(TAG, "Next alarm scheduled for " + hour + ":" + minute + " tomorrow (ID: " + alarmId + ")");
});
}
}

View File

@@ -20,7 +20,7 @@ public class SerialPortDetector {
public static final String TEST_CMD_ON = "ACEAB400ED"; // 打开设备
// 响应超时时间(毫秒)
private static final long RESPONSE_TIMEOUT = 4000;
private static final long RESPONSE_TIMEOUT = 6000;
private DetectionCallback callback;
private Handler mainHandler;
@@ -190,14 +190,6 @@ public class SerialPortDetector {
notifyDetectionProgress(portPath, i + 1, devicePaths.length);
Log.d(TAG, "Testing port: " + portPath + " at " + baudRate + " baud");
// 老设备没有反馈,如果测试成功,很快就进入下个测试,导致用户看不清串口路径,这里添加延时
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Log.e(TAG, "Sleep interrupted", e);
}
if (testSerialPort(portPath, baudRate, ensurePowerOn)) {
Log.i(TAG, "Serial port detected successfully: " + portPath);
notifyDetectionSuccess(portPath);
@@ -228,6 +220,7 @@ public class SerialPortDetector {
Log.d(TAG, "Ensuring device power on by sending both commands");
boolean cmd1Success = sendCommandAndWaitResponse(serialHelper, TEST_CMD_OFF);
Thread.sleep(1000);
boolean cmd2Success = sendCommandAndWaitResponse(serialHelper, TEST_CMD_ON);
// 只要有一个命令收到有效响应就认为串口可用