Android服务与其父Activity通信

时间:2014-12-10 21:11:07

标签: android service

我正在编写一个GPS跟踪应用程序,该应用程序从Google Play服务接收地理位置更新并调用我的Activity onLocationChanged(),其中我的活动在屏幕上的地图上绘制用户的移动。

问题是以上只有在我的应用处于前台时才有效,例如:当我手里拿着手机走路的时候。如果我把它放在口袋里然后再打开一段时间,应用程序就不知道当我没有积极使用该应用程序时我的位置。

要解决这个问题,我转向Android服务,其想法如下:
*我的应用程序启动后台服务 *该服务运行并侦听来自Google Play服务的位置更新 *在位置更改时,服务调用我的Activity上的方法并为其提供新位置,以便Activity可以在地图上绘制它 *当我的应用程序被系统暂停,停止和/或销毁时,服务会继续运行并收集位置数据 *当我再次启动我的应用程序时,它会连接到服务并获取自上次通信以来的所有位置数据。

我研究了这本优秀Android教科书的第33-36章(关于服务):http://www.techotopia.com/index.php/An_Overview_of_Android_Started_and_Bound_Services

但我仍然无法理解服务如何调用ACTIVITY。 (书中的所有示例都演示了ACTIVITY如何调用服务来请求数据)... :-(请帮忙!

此外,以下似乎没有提供解决方案: 1.启动服务:似乎是用于从UI线程卸载长时间运行的任务 2.意向服务:与上述相同 3.绑定服务:因为它在UI线程中运行所以不会做到这一点,因此每当我的应用程序被销毁时都会被销毁

我很茫然......请帮忙

1 个答案:

答案 0 :(得分:0)

我已经挖出来并想出如何解决我上面提到的问题。

我使用的服务是:

  • 本地:与我的活动
  • 在同一个主题中运行
  • 私密:只有我的应用可以启动/停止,绑定/取消绑定
  • 已启动:我启动它以便系统在活动状态更改时不会将其销毁,例如在电话屏幕方向上销毁/创建
  • AND 绑定:以便我的活动和服务可以通过
  • 进行沟通

要实现双向通信 - 我原始问题的本质 - 我只需通过调用公共元文MyService.setActivity(MyActivity)向服务传递对Activity的引用。我在myConnection.onServiceConnected()上执行此操作。一旦我的服务引用了Activity,它就可以调用activity的方法。例如,每次我的服务从Google Play服务获取新的位置对象时,它都会调用我的活动的updateLocation(位置)方法,其中活动使用用户路径上的新点更新地图。 / p>

该服务在启动和停止之间不断生存,但Activity的生命周期更加不稳定(例如,它会在手机屏幕方向更改时被破坏并重新创建)。为了避免我的服务在活动未激活时对活动进行方法调用的情况,我在活动被取消激活之前将null活动引用传递给我的服务,以便服务可以在调用活动之前检查非null。 #39;方法。