【问题标题】:Need to get a service to talk back to the activity需要获得服务才能与活动对话
【发布时间】:2011-06-16 03:17:58
【问题描述】:

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

由于有几种不同的方法可以使用服务,我有点困惑,哪一种最适合我的情况。

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

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

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

任何建议将不胜感激。

  1. this

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

  2. this

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

【问题讨论】:

标签: android android-service


【解决方案1】:

您可以拥有一个既绑定又通过startService() 启动的服务。使用ServiceConnection,您可以进行两种通信,使用startService()/stopService(),您可以控制它的生命周期。

来自 android 网站的生命周期图像很好地解释了这一点:

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

  1. 没有绑定到它的客户端。
  2. stopService() 被调用。

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

【讨论】:

    【解决方案2】:

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

    当您bindService 时,您可以取回实际的服务实例,然后调用您的自定义方法作为一种通信方式。或者,您可以使用示例之一here

    【讨论】:

    • 这是一个很好的例子,但不清楚我是否可以从服务调用活动中的方法。这是可行的,还是只能在相反的方向工作?
    • 可行:调用Service上的方法,传入Activity实例。然后,您可以调用 Activity 上的任何方法(只要它们不是私有的并且对服务适当可见)。您必须非常小心地注意 Activity 被销毁且不再有效的情况。
    • 使用与 LocalServiceSample 类似的样式并传入对活动的引用非常有效。谢谢
    • 这个项目实现了这个服务(BothService),并展示了一个服务如何无限期地运行并允许绑定多个活动。 (github.com/shanrais/BothService)
    【解决方案3】:

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

    将此代码放入您的活动 onCreate 并通过实现返回活页夹对象的 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);
    

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

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      相关资源
      最近更新 更多