需要获得服务以回复活动

chr*_*ris 3 android android-service

我需要创建一个活动来启动监视用户位置的服务,并且在某个区域内允许调用Activity更新其视图以通知用户.

由于有几种不同的方式来处理服务,我有点困惑的是哪一种对我的情况是正确的.

使用startService()stopService()方法:从我的理解,我不能直接回到起始活动.在谷歌文档中有一个示例显示如何通过PendingIntent将BroadcastReceiver传递给服务并调用它,但我不认为允许我更新正在运行的活动的视图...或者它会吗?

绑定服务:从文档看来,这将允许服务和活动之间的双向通信,但也提到绑定服务不会无限期地在后台运行.现在我不需要甚至不想让服务无限期地运行,但在最糟糕的情况下,我可能需要它在bg中运行至少一两个小时而不会被杀死.

第三个(可能不是那么好)选项:在活动的线程中运行位置服务,这将使实时视图更新变得容易,然后在onPause事件中,停止活动中的位置服务并将其交给服务通过startService()并使用通知服务在输入定义的区域时提醒用户.

任何建议将不胜感激.

  1. 如果您希望服务返回结果,则启动服务的客户端可以为广播创建PendingIntent(使用getBroadcast())并将其传递给启动服务的Intent中的服务.然后,该服务可以使用广播来传递结果.

  2. 绑定服务通常仅在其服务于另一个应用程序组件时才存在,并且不会无限期地在后台运行.

Noe*_*oel 8

您可以拥有一个既受约束又通过启动的服务startService().使用ServiceConnection你可以进行双向通信,使用startService()/stopService()你可以控制它的生命周期.

来自android站点的生命周期图像真的很好地解释了它: 生命周期

通过绑定和启动服务,您将获得可以无限期运行的服务.只有满足以下两个条件时,服务才会停止:

  1. 没有客户端绑定它.
  2. 调用了stopService().

它需要更多的维护,但我发现这是最合理的选择.


Fem*_*emi 5

啊,选项(2)可能就是你想要的.您可以覆盖onStartCommand以返回,START_STICKY并且在Activity完成后服务将继续运行.

当您bindService可以获得实际的Service实例时,然后只需调用您的自定义方法作为一种通信方式.或者,您可以使用此处的示例之一

  • 它是可行的:您在服务上调用方法并传入Activity实例.然后,您可以调用活动上的任何方法(只要它们不是私有的,并且对服务是适当的可见的).您必须非常小心地观察活动被销毁且不再有效的情况. (3认同)