修复闹钟没有循环的bug
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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>
|
||||
@@ -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,
|
||||
|
||||
@@ -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 + ")");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
// 只要有一个命令收到有效响应就认为串口可用
|
||||
|
||||
Reference in New Issue
Block a user