QinGang_interested/lib/services/heartbeat_service.dart

105 lines
2.8 KiB
Dart
Raw Permalink Normal View History

2025-12-12 09:11:30 +08:00
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');
// 心跳失败不停止服务,继续尝试
}
}
}