Files
HeartRateMonitorAndroid/Platforms/Android/HeartRateJobService.cs
2025-08-09 20:35:05 +08:00

130 lines
4.5 KiB
C#

using Android.App;
using Android.App.Job;
using Android.Content;
using Android.OS;
namespace HeartRateMonitorAndroid.Platforms.Android
{
[Service(Name = "com.nuanrmxi.heartratemonitor.HeartRateJobService",
Permission = "android.permission.BIND_JOB_SERVICE",
Enabled = true,
Exported = false)]
public class HeartRateJobService : JobService
{
private const int JOB_ID = 1002;
public override bool OnStartJob(JobParameters @params)
{
System.Diagnostics.Debug.WriteLine("HeartRateJobService: OnStartJob called");
// 在后台线程中执行任务
Task.Run(() =>
{
try
{
CheckAndRestartService();
}
catch (System.Exception ex)
{
System.Diagnostics.Debug.WriteLine($"HeartRateJobService Error: {ex.Message}");
}
finally
{
// 完成任务
JobFinished(@params, false);
}
});
return true; // 返回true表示任务在后台执行
}
public override bool OnStopJob(JobParameters @params)
{
System.Diagnostics.Debug.WriteLine("HeartRateJobService: OnStopJob called");
return false; // 返回false表示不需要重新调度
}
private void CheckAndRestartService()
{
try
{
// 检查前台服务是否正在运行
if (!IsServiceRunning(typeof(HeartRateKeepAliveService)))
{
System.Diagnostics.Debug.WriteLine("HeartRateJobService: 前台服务未运行,正在重启...");
var intent = new Intent(this, typeof(HeartRateKeepAliveService));
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
StartForegroundService(intent);
}
else
{
StartService(intent);
}
}
else
{
System.Diagnostics.Debug.WriteLine("HeartRateJobService: 前台服务正常运行");
}
// 重新调度下一次检查
ScheduleNextJob();
}
catch (System.Exception ex)
{
System.Diagnostics.Debug.WriteLine($"CheckAndRestartService Error: {ex.Message}");
}
}
private bool IsServiceRunning(System.Type serviceType)
{
try
{
var activityManager = GetSystemService(ActivityService) as ActivityManager;
var services = activityManager?.GetRunningServices(int.MaxValue);
if (services != null)
{
foreach (var service in services)
{
if (service.Service.ClassName.Equals(serviceType.FullName))
{
return true;
}
}
}
}
catch (System.Exception ex)
{
System.Diagnostics.Debug.WriteLine($"IsServiceRunning Error: {ex.Message}");
}
return false;
}
private void ScheduleNextJob()
{
try
{
var jobScheduler = GetSystemService(JobSchedulerService) as JobScheduler;
var jobInfo = new JobInfo.Builder(JOB_ID, new ComponentName(this, Java.Lang.Class.FromType(typeof(HeartRateJobService))))
.SetRequiredNetworkType(NetworkType.Any)
.SetPersisted(true)
.SetMinimumLatency(10 * 60 * 1000) // 最少10分钟后执行
.SetOverrideDeadline(15 * 60 * 1000) // 最多15分钟后必须执行
.SetRequiresCharging(false)
.SetRequiresDeviceIdle(false)
.Build();
var result = jobScheduler?.Schedule(jobInfo);
System.Diagnostics.Debug.WriteLine($"HeartRateJobService: 下次任务调度结果: {result}");
}
catch (System.Exception ex)
{
System.Diagnostics.Debug.WriteLine($"ScheduleNextJob Error: {ex.Message}");
}
}
}
}