我想在我的Xamarin.Forms项目中使用StepCounter。
如果我正确理解,则需要使用Dependency Service,为stepcounter及其在Android / IOS应用程序上的实现编写接口。

问题是当步进传感器状态更改时,我想每时每刻更新ui控件(文本)。例如在Android中,

using Android.Hardware;
/*Dependency Service header
[assembly: Dependency(typeof(.....
*/
...
namespace tmp
{
 public class Stepper : ISensorEventListener, INameOfDependencyInterface
 {
   public static void Init()
    {
    SensorManager senMgr = (SensorManager)GetSystemService(SensorService);
         Sensor counter = senMgr.GetDefaultSensor(SensorType.StepCounter);

         if (counter != null)
         {
             senMgr.RegisterListener(this, counter, SensorDelay.Normal);
         }
    }
  public void OnSensorChanged(SensorEvent e)
    {
        /*something that change text on ui*/
    }
 }
}


如您所见,在这里,我想在OnSensorChanged void中更改UI中的文本。

也许这个问题有更好的解决方案,例如:


使呼叫表单平台依赖服务类实现为PCL或在PCL中进行诸如侦听器之类的操作
在PCL make计时器中,它对依赖项服务做出响应并例如每秒获取stepcounter值
忘记Xamarin.Forms并迁移到Xamarin.Native

最佳答案

我在您的Action构造函数中添加了Init,并且在更改传感器时将调用它:

public class Stepper : ISensorEventListener, INameOfDependencyInterface
{

    private Action<float> _stepCountChanged;

    public static void Init(Action<float> stepCountChanged)
    {
        SensorManager senMgr = (SensorManager)GetSystemService(SensorService);
        Sensor counter = senMgr.GetDefaultSensor(SensorType.StepCounter);

        if (counter != null)
        {
            senMgr.RegisterListener(this, counter, SensorDelay.Normal);
        }

        _stepCountChanged = stepCountChanged;
    }
    public void OnSensorChanged(SensorEvent e)
    {
        _stepCountChanged(e.Values.First());

    }
}


例如,在您的Activity中这样初始化它:

DependencyService.Get<...>().Init((steps) => {
    // Label.Steps = steps;
});

10-06 12:17