在没有参考活动的情况下聆听GPS更新事件(在背景中)

时间:2014-01-10 00:57:56

标签: android gps xamarin.android

我的应用程序需要定期了解GPS更新。我正在使用MonoForAndroid,因此 我有许多从Windows继承的代码,我仍然与Windows和iOS共享此代码。

在当前的解决方案体系结构中,硬件相关元素在应用程序heirachy底部的不同层(HAL Hardware Abstraction Layer)中分隔。

我想保持相同的架构,以便我不需要更改大量的移植代码。

我按照MonoForAndroid(receipe)http://docs.xamarin.com/recipes/android/os_device_resources/gps/get_current_device_location/

上的示例进行操作

但是,这假定ActivityListener

问题:

  1. 如何在没有ILocationListener的情况下实施Activity。我发现ILocationListener有一个Dispose()方法和一个Handle字段,我需要实现!! 当我尝试创建一个实现ILocationListener的类并将其传递给LocationManager.RequestLocationUpdates()时,我得到InvalidArgumentException。我假设ILocationListener的实施无效。

  2. 即使我Activity实现listener,我也会SystemRunTimeException

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。

  

首先:

实施ILocationListener的类需要从Java.Lang.Object开始,而不是从System.Object开始 这是因为LocationListenerJava Delvik env中都需要存在.NET。我从http://johnclaytonmoore.com/blog/monodroid-gps-listening得到了这个提示 继承自Java.Lang.Object后,您无需实施Handle属性和Dispose()方法

  

第二

SystemRunTimeException被抛出,因为Android期望设置在MainLooper线程上发生。 我使用Applicatoin.Context执行此操作而无需引用Activity,如下所示:

var handler = new Handler(Application.Context.MainLooper);
handler.Post(SetupLocationUpdatesListener);

private void SetupLocationUpdatesListener()
{
    _AndroidLocationUpdatesReceiver = new AndroidLocationListener();
    _LocationManager.RequestLocationUpdates(LocationManager.GpsProvider, GpsFilters.MinimumGpsUpdatesTimeIntervalInMiliSeconds, GpsFilters.DistanceInMeters, _AndroidLocationUpdatesReceiver);
    _LocationManager.RequestLocationUpdates(LocationManager.NetworkProvider, GpsFilters.MinimumGpsUpdatesTimeIntervalInMiliSeconds, GpsFilters.DistanceInMeters, _AndroidLocationUpdatesReceiver);
    HookGpsEvents();
}

如果您对LocationListener的完整代码感兴趣,我已在我的博客上发布了整个内容,这里有一个链接

http://www.hasaltaiar.com.au/listenening-to-gps-updates-events-without-a-reference-to-the-activity-in-background-on-monoforandroid/