130 lines
4.5 KiB
C#
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}");
|
|
}
|
|
}
|
|
}
|
|
}
|