在基于 Xamarin 表单的应用程序中将数据从 android 服务传递到 ContentPage

Posted

技术标签:

【中文标题】在基于 Xamarin 表单的应用程序中将数据从 android 服务传递到 ContentPage【英文标题】:Pass data from android service to ContentPage in Xamarin Form based application 【发布时间】:2015-07-24 16:13:30 【问题描述】:

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

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

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

一种解决方案是:

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

如果有更好的解决方案,可以提供给我吗?

【问题讨论】:

【参考方案1】:

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

依赖服务 事件

这样的实现需要有 4 个类:

    PCL 中的接口(例如 CurrentLocationService.cs),其中定义了事件处理程序。

namespace NAMESPACE

	public interface CurrentLocationService
	
		void start();

		event EventHandler<PositionEventArgs> positionChanged;
	
    使用依赖服务实现 xxx.Droid 项目中 PCL 的接口(例如 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 - 将具有接口实现的对象。 对象可以通过

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 之间传递数据。

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

希望这对您有所帮助。

【讨论】:

以上是关于在基于 Xamarin 表单的应用程序中将数据从 android 服务传递到 ContentPage的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xamarin 表单中将边距、填充、宽度和高度值转换为像素(px)?

如何在 Xamarin 表单中将数组绑定到 ListView

基于日期 Xamarin 表单过滤 ObservableCollection

在 Xamarin 表单中将 Observable 集合绑定到我的 ListView 时遇到问题

如何在 Xamarin(iOS) 中将按钮从右向左移动

如何使用 Xamarin 表单和 C# 将 Html 数据从网站保存到文本文件