在基于 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