我已经在这个问题上停留了很长时间了。我正在开发一个在多个不同 Activity 中广泛使用位置的应用程序。我发现的每个示例在每个Activity中都使用一个单独的LocationListener。在我的情况下,这是不可行的。
我想知道在几种 Activity 中跟踪用户位置的最有效方法是什么。现在,我已经创建了一个服务,该服务实现了LocationListener并使用广播来更新Activity基类中的静态经纬度和长字段。这意味着该服务始终处于运行状态,这是不理想的。但是,如果我关闭该服务并仅在需要时重新启动它,则需要花费一些时间才能找到合适的位置。我需要Activity的onCreate()中的位置数据。如果我尝试在 Activity 基类中实现它,则是相同的。如果我在onResume/onCreate中不断注册监听器,并在onPause()中取消注册监听器,则花费太多时间开始接收更新。我还尝试创建可以绑定(bind)到的服务,因此该服务仅在需要位置时才启动。但是我也有同样的问题,绑定(bind)到服务并开始获取更新花费的时间太长。
我正在使用的服务现在可以使用,但是从我读过的所有内容来看,我不应该为此类琐碎的事情使用持续运行的服务。但是该应用程序的重点是根据用户的当前位置提供相关数据。因此,我有一项仅在后台运行并定期提供更新的服务。导致我在这一点上重新检查设计的一个主要问题是,我最近发现,如果用户在未打开GPS的情况下启动应用并随后启用它,则不会调用onProviderEnabled()。在这种情况下,该应用无法识别已启用GPS,因此它可以开始监听更新。
我以为通过查看示例我了解了LocationManager和LocationListener,但是我似乎无法将其应用于需要多个Activity中的位置数据的情况。任何帮助或建议,将不胜感激。
最佳答案
我通常会实现此要求的方式是使用绑定(bind)的Service实现,如SDK文档中Local Service Sample中的实现。显然,您熟悉该服务的优势,该服务仅允许一次创建所有位置代码。
通过绑定(bind)访问服务允许服务启动和停止自身,因此当您的应用程序不在前台时它不会运行(一旦没有更多的 Activity 被绑定(bind),它将终止)。使其成功运行的关键IMO是在onStart()
中绑定(bind)服务,在onStop()
中绑定(bind)UNBIND,因为当您从一个 Activity 移动到另一个 Activity 时,这两个调用会重叠(第二个 Activity 在第一个 Activity 停止之前开始)。这样可以防止服务在应用程序内部移动时死亡,并且仅在整个应用程序(或至少对位置感兴趣的任何部分)离开前台时才使服务死亡。
使用绑定(bind),您不必在广播中传递位置数据,因为 Activity 可以直接在服务上调用方法以获取最新位置。但是,广播作为指示何时有新更新可用的方法仍将是有利的...但是,这仅会成为监听 Activity 的通知者,以在服务上调用getLocation()
方法。
我的$ 0.02。希望对您有所帮助!
关于android - Android-跨多个 Activity 实现LocationListener的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5783611/