如何将 LocationRequest 对象从活动传递到服务?
Posted
技术标签:
【中文标题】如何将 LocationRequest 对象从活动传递到服务?【英文标题】:How to pass a LocationRequest object from an activity to a service? 【发布时间】:2017-02-11 18:57:28 【问题描述】:在我的应用程序中,我需要请求定期位置更新,检查 Activity 中的设置,然后使用 LocationServices.FusedLocationApi 在前台服务中请求位置。
Edit1:服务从activity启动并绑定。但我不明白如何传递该对象。
已解决:我想我已经解决了。我已经正确实现了绑定,然后我找到了这个答案:[1]How to send an object from one android Activity to another using Intents? 我在服务中获取 Parceable 时犯了一个菜鸟错误,这导致了 NullPointer 但我已经解决了。所以我一直在寻找的解决方案是: 使用 Parceable(并正确实施;))
注意阅读此 Shoaib 评论:
Google 建议不要使用 Intent 向服务传递任何额外的参数,它可能不会在服务端看到,因为多个组件可以绑定到服务并且不会始终调用 onBind()。
【问题讨论】:
请看如何绑定服务和活动 感谢您的回复。我忘了提到我的服务已启动并绑定到活动。我将编辑原始帖子。 【参考方案1】:Maybe you should study this
您将能够了解如何绑定以及与服务通信(也涉及传递对象)。
关于您对问题的编辑的扩展答案:
当客户端(您的活动)使用bindService()
方法绑定时,系统调用您服务的onBind()
方法,该方法返回IBinder。使用从 onBind() 返回的 IBinder 实例,调用者(您的活动)可以访问服务的公共方法。您可以拥有一种用于向其发送参数/对象的公共方法。
您可以进一步参考谷歌文档Here。
【讨论】:
感谢您的回复。我忘了提到我的服务已启动并绑定到活动。我将编辑原始帖子。 如果您是 android 和开发新手,我建议不要在不需要它的地方使用 EventBus,因为在某些情况下会过度使用它并且代码可能不再有意义。为您将来尝试理解您的代码带来困难。 谢谢Shoaib,我想我已经解决了。我已经正确实现了绑定,然后我找到了这个答案:***.com/questions/2139134/… 我在服务中获取 Parceable 时犯了一个菜鸟错误,这导致了 NullPointer,但我已经解决了。所以我一直在寻找的解决方案是:使用 Parceable (并正确实施;)) 不错不错。但只是一个很好的提示。 Google 建议不要使用 Intent 向服务传递任何额外的参数,它可能不会在服务端看到,因为多个组件可以绑定到服务并且onBind()
不会总是被调用。在这种情况下,您可能已经解决了它,但它有问题。 Refer to this answer also for better understanding【参考方案2】:
其中一个解决方案是EventBus 库。 您可以从任何地方广播一个对象并在您想要的任何线程上订阅该对象。 绑定此行后,您可以注册和订阅该事件:
EventBus.getDefault().register(this);
例如在 onStartCommand 中。
在 onDestroy 中取消注册(取消订阅)
EventBus.getDefault().unregister(this);
【讨论】:
以上是关于如何将 LocationRequest 对象从活动传递到服务?的主要内容,如果未能解决你的问题,请参考以下文章
它是如何工作的 - requestLocationUpdates() + LocationRequest/Listener
FusedLocationProviderApi:LocationRequest.setPriority 如何与“位置模式”设备设置一起使用?
如何检查我们是不是已经调用了 fusedLocationProviderClient.requestLocationUpdates(locationRequest, pendingIndent);