Как сделать счетчик шагов, работающий при закрытом приложении? xamarin android

Есть сервис счетчика шагов, который прекрасно работает при открытом приложении. Как сделать так, чтобы он продолжал реагировать на события ISensorEventListener даже после закрытия приложения?

Счетчик шагов:

[Service(Exported = true, Enabled = true,
         Label = "StepCounterService")]
public class StepCounterService : Service, ISensorEventListener
{
    private SensorManager sManager;
    private long currentStepsCount = 0;

    private long overSteppers = 0;

    private DateTime lastUpdateTime;

    public event EventHandler<long> StepUpdated;

    private long _steps = 0;
    public long Steps
    {
        get
        {
            UpdateValue(_steps);
            return _steps;
        }
        private set { _steps = value; }
    }

    public static StepCounterService Current { get; private set; }

    public StepCounterService()
    {

    }

    [return: GeneratedEnum]
    public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
    {
        lastUpdateTime = AppPreferences.Get(nameof(lastUpdateTime), nameof(Class), new DateTime());
        overSteppers = AppPreferences.Get(nameof(overSteppers), nameof(Class), 0L);
        InitSensorService();
        return StartCommandResult.Sticky;
    }

    public override void OnCreate()
    {
        base.OnCreate();
        Current = this;
        Created?.Invoke(this, null);
    }

    public void InitSensorService()
    {
        sManager = Android.App.Application.Context.GetSystemService(Context.SensorService) as SensorManager;
        sManager.RegisterListener(this, sManager.GetDefaultSensor(SensorType.StepCounter), SensorDelay.Fastest);
    }

    public void OnAccuracyChanged(Sensor sensor, [GeneratedEnum] SensorStatus accuracy)
    {
    }

    public void OnSensorChanged(SensorEvent e)
    {
        if (e.Values[0] == 0)
        {
            overSteppers = 0;
            AppPreferences.Save(overSteppers, nameof(overSteppers), nameof(Class));
            currentStepsCount = AppPreferences.Get(nameof(currentStepsCount), nameof(Class), 0L);
        }
        UpdateValue((long)e.Values[0]);
        Steps = (long)e.Values[0] - overSteppers + currentStepsCount;
    }

    private void UpdateValue(long defaultValue)
    {
        if (DateTime.Now.Date > lastUpdateTime.Date)
        {
            lastUpdateTime = DateTime.Now;
            overSteppers = defaultValue;
            Steps = 0;
            currentStepsCount = 0;
        }
    }

    private void SaveData()
    {
        AppPreferences.Save(lastUpdateTime, nameof(lastUpdateTime), nameof(Class));
        AppPreferences.Save(overSteppers, nameof(overSteppers), nameof(Class));
        AppPreferences.Save(_steps, nameof(currentStepsCount), nameof(Class));
    }

    public void StopSensorService()
    {
        sManager.UnregisterListener(this);
        sManager.Dispose();
        SaveData();
    }

    public override void OnDestroy()
    {
        SaveData();
        base.OnDestroy();

    }

    public override IBinder OnBind(Intent intent)
    {
        return null;
    }

}

Каким образом его можно запустить, чтобы он работал в фоне даже после закрытия приложения?


Ответы (0 шт):