gpt4 book ai didi

notifications - 将数据从 android 服务传递到基于 Xamarin Form 的应用程序中的 ContentPage

转载 作者:行者123 更新时间:2023-12-04 05:43:41 25 4
gpt4 key购买 nike

我有一个基于 XamarinForms 的应用程序。

我在 Android 项目中创建了一项后台服务,该服务希望将数据发送到向用户显示的 ContentPage(在 PCL 中)。

我如何将数据传递给 ContentPage(从 xx.Droid 项目到 PCL)?

一种解决方案是:

  • 使用静态变量(例如 var TEMP_VAR)在 PCL 中创建类,该变量将从 xxx.Droid 项目中访问。
  • 从 xxx.Droid 项目的服务类更新该静态变量 (TEMP_VAR) 的值。
  • 需要在该静态变量上创建通知程序 (TEMP_VAR)
  • 如果需要,使用 MessageCenter 机制更新内容页面。

  • 如果有更好的解决方案,能否提供给我?

    最佳答案

    这可以使用 C# 的概念来实现

  • 依赖服务
  • 事件

  • 这样的实现需要 4 个类:
  • PCL 中的接口(interface)(例如 CurrentLocationService.cs),其中定义了事件处理程序。


  • namespace NAMESPACE
    {
    public interface CurrentLocationService
    {
    void start();

    event EventHandler<PositionEventArgs> positionChanged;
    }
    }


  • 使用依赖服务
  • 在xxx.Droid项目中实现PCL接口(interface)(例如CurrentLocationService_Android.cs)


    class CurrentLocationService_Android : CurrentLocationService
    {

    public static CurrentLocationService_Android mySelf;

    public event EventHandler<PositionEventArgs> positionChanged;


    public void start()
    {
    mySelf = this;
    Forms.Context.StartService(new Intent(Forms.Context, typeof(MyService)));

    }

    public void receivedNewPosition(CustomPosition pos)
    {
    positionChanged(this, new PositionEventArgs(pos));
    }

    }


  • PCL 中的 ContentPage - 将具有接口(interface)实现的对象。
    对象可通过
  • 获取


    public CurrentLocationService LocationService
    {
    get
    {
    if(currentLocationService == null)
    {
    currentLocationService = DependencyService.Get<CurrentLocationService>();
    currentLocationService.positionChanged += OnPositionChange;
    }
    return currentLocationService;
    }


    }

    private void OnPositionChange(object sender, PositionEventArgs e)
    {
    Debug.WriteLine("Got the update in ContentPage from service ");
    }


  • xxx.Droid 项目中的后台服务。该服务将引用依赖服务 CurrentLocationService.cs
  • 的实现


    [Service]
    public class MyService : Service
    {
    public string TAG = "MyService";

    public override IBinder OnBind(Intent intent)
    {
    throw new NotImplementedException();
    }



    public override StartCommandResult OnStartCommand(Android.Content.Intent intent, StartCommandFlags flags, int startId)
    {
    Log.Debug(TAG, TAG + " started");

    doWork();

    return StartCommandResult.Sticky;
    }

    public void doWork()
    {
    var t = new Thread(
    () =>
    {
    Log.Debug(TAG, "Doing work");
    Thread.Sleep(10000);
    Log.Debug(TAG, "Work completed");

    if(CurrentLocationService_Android.mySelf != null)
    {
    CustomPosition pos = new CustomPosition();
    pos.update = "Finally value is updated";
    CurrentLocationService_Android.mySelf.receivedNewPosition(pos);

    }

    StopSelf();
    });
    t.Start();
    }

    }


    注意:需要根据使用情况创建 PositionEventArgs 类,以便在服务和 ContentPage 之间传递数据。

    这对我来说就像魅力一样。

    希望这对您有所帮助。

    关于notifications - 将数据从 android 服务传递到基于 Xamarin Form 的应用程序中的 ContentPage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30213726/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com