105 lines
2.8 KiB
Dart
105 lines
2.8 KiB
Dart
|
|
import 'dart:async';
|
||
|
|
import 'package:flutter/foundation.dart';
|
||
|
|
import 'package:qhd_prevention/http/ApiService.dart';
|
||
|
|
import 'package:qhd_prevention/services/SessionService.dart';
|
||
|
|
|
||
|
|
/// 心跳服务 - 单例模式
|
||
|
|
/// 每5秒发送一次心跳请求
|
||
|
|
class HeartbeatService {
|
||
|
|
HeartbeatService._internal();
|
||
|
|
|
||
|
|
static final HeartbeatService _instance = HeartbeatService._internal();
|
||
|
|
|
||
|
|
factory HeartbeatService() => _instance;
|
||
|
|
|
||
|
|
Timer? _heartbeatTimer;
|
||
|
|
bool _isRunning = false;
|
||
|
|
bool _isPaused = false; // 用于应用生命周期暂停
|
||
|
|
|
||
|
|
/// 心跳间隔(秒)
|
||
|
|
static const Duration heartbeatInterval = Duration(seconds: 5);
|
||
|
|
|
||
|
|
/// 是否正在运行
|
||
|
|
bool get isRunning => _isRunning;
|
||
|
|
|
||
|
|
/// 启动心跳
|
||
|
|
/// 只有在用户已登录时才会启动
|
||
|
|
void start() {
|
||
|
|
// 检查是否已登录
|
||
|
|
if (!SessionService.instance.isLoggedIn) {
|
||
|
|
debugPrint('HeartbeatService: 用户未登录,不启动心跳');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 如果已经在运行,不重复启动
|
||
|
|
if (_isRunning && _heartbeatTimer != null) {
|
||
|
|
debugPrint('HeartbeatService: 心跳已在运行');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
_isRunning = true;
|
||
|
|
_isPaused = false;
|
||
|
|
debugPrint('HeartbeatService: 启动心跳,间隔 ${heartbeatInterval.inSeconds} 秒');
|
||
|
|
|
||
|
|
// 立即发送一次心跳
|
||
|
|
_sendHeartbeat();
|
||
|
|
|
||
|
|
// 启动定时器
|
||
|
|
_heartbeatTimer = Timer.periodic(heartbeatInterval, (timer) {
|
||
|
|
if (!_isPaused && SessionService.instance.isLoggedIn) {
|
||
|
|
_sendHeartbeat();
|
||
|
|
} else if (!SessionService.instance.isLoggedIn) {
|
||
|
|
// 如果用户已退出登录,停止心跳
|
||
|
|
stop();
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/// 停止心跳
|
||
|
|
void stop() {
|
||
|
|
if (_heartbeatTimer != null) {
|
||
|
|
_heartbeatTimer!.cancel();
|
||
|
|
_heartbeatTimer = null;
|
||
|
|
}
|
||
|
|
_isRunning = false;
|
||
|
|
_isPaused = false;
|
||
|
|
debugPrint('HeartbeatService: 停止心跳');
|
||
|
|
}
|
||
|
|
|
||
|
|
/// 暂停心跳(应用进入后台时)
|
||
|
|
void pause() {
|
||
|
|
if (_isRunning) {
|
||
|
|
_isPaused = true;
|
||
|
|
debugPrint('HeartbeatService: 暂停心跳');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// 恢复心跳(应用回到前台时)
|
||
|
|
void resume() {
|
||
|
|
if (_isRunning && _isPaused) {
|
||
|
|
_isPaused = false;
|
||
|
|
debugPrint('HeartbeatService: 恢复心跳');
|
||
|
|
// 立即发送一次心跳
|
||
|
|
_sendHeartbeat();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/// 发送心跳请求
|
||
|
|
Future<void> _sendHeartbeat() async {
|
||
|
|
try {
|
||
|
|
// 检查登录状态
|
||
|
|
if (!SessionService.instance.isLoggedIn) {
|
||
|
|
debugPrint('HeartbeatService: 用户未登录,停止心跳');
|
||
|
|
stop();
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
// 调用心跳接口
|
||
|
|
// await HiddenDangerApi.heartbeat();
|
||
|
|
// debugPrint('HeartbeatService: 心跳发送成功');
|
||
|
|
} catch (e) {
|
||
|
|
debugPrint('HeartbeatService: 心跳发送失败: $e');
|
||
|
|
// 心跳失败不停止服务,继续尝试
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|