需要获得服务以回复活动

时间:2011-06-16 03:17:58

标签: android android-service

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

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

使用startService()stopService()方法:根据我的理解,我无法直接与开始活动对话。在谷歌文档中有一个example显示如何通过PendingIntent将BroadcastReceiver传递给服务并调用它,但我认为不允许我更新正在运行的活动的视图...或者它会?

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

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

非常感谢任何建议。

  1. indefinitely

      

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

  2. this

      

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

3 个答案:

答案 0 :(得分:8)

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

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

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

  1. 没有客户绑定它。
  2. 调用了stopService()。
  3. 它需要更多的维护,但我发现这是最合理的选择。

答案 1 :(得分:5)

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

当你bindService时,你可以获得实际的Service实例,然后只需调用你的自定义方法作为一种沟通方式。或者,您可以使用其中一个示例here

答案 2 :(得分:1)

与服务绑定将是最好的方法。

将此代码放在您的活动onCreate中,并通过实现返回binder对象的onBind方法来定义您的服务。在您的服务中正确定义您的IBinder。

这将确保服务在后台始终运行。每次您的活动开始时,它都会与服务绑定。在您的活动的onDestroy()方法解除绑定服务。否则会抛出ServiceLeakedException。

   YourService service;   

   ServiceConnection  serviceConnection = new ServiceConnection() {
      public void onServiceConnected(ComponentName name, IBinder binderService) {
          service = ((YourService.ServiceBinder)binderService).getService();
      }

      public void onServiceDisconnected(ComponentName name) {

      }
   };

    // ... and bind.
    bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

根据任何计算,您的服务可以自行启动您的活动。随着它的推出,它将与服务绑定。然后可以进行进一步的沟通。

希望有所帮助:)