将服务绑定到活动或片段?

时间:2014-06-19 14:42:09

标签: android android-fragments android-service

我正在制作音乐播放器应用。我有一个主要的活动,有多个片段,每个片段在设备专辑中明智地显示歌曲,艺术家明智等 我有一个音乐服务,处理所有的播放和其他东西 我所困惑的是这项服务与我拥有的各种片段的结合 现在我将主要活动和每个片段分别与服务绑定,并且它的工作非常好。但我想知道这是否真的是最好的做法?有没有办法将主要活动与服务绑定,然后一些如何在其子片段中使用它? 我可能错过了一些非常基本的活动概念或片段或服务。所以有人请指导我这方面 我想这更像是一个概念性问题,因此不需要任何代码。但如果需要,请告诉我。

编辑:
我的问题是:将服务绑定到具有多个子片段(每个片段都使用该服务)的活动的更好方法是什么?

7 个答案:

答案 0 :(得分:17)

我认为更清洁的架构是直接从片段绑定。关于Rarw的答案中概述的问题,您可以从您的活动和您的片段绑定到该服务。这样,您可以确保服务将在那里,直到活动未被销毁。

我可以看到从片段连接的两个主要优点:

  1. 服务连接是异步的,因此在片段内部,您永远不会确定从活动获得的服务不是null。这将导致您至少进行一些空指针检查以及某些机制,以便在创建片段和服务连接时刷新片段(因此您确定无论先发生哪一个都会显示数据)。

  2. 您不依赖于您的片段所处的特定活动。要从活动中获取服务,我认为您正在对特定于活动的类进行强制转换。您可以使用类似BoundActivity的方法创建getBoundService之类的接口以从中获取服务,但我认为考虑到第1点的优势,这是一个开销。如果您有多个服务,那该怎么办呢。

  3. <强>更新

    这是一个非常简单的项目。 https://github.com/ena1106/FragmentBoundServiceExample

答案 1 :(得分:15)

Service绑定到您的活动,而不是Fragment。您的应用程序的描述,一个具有多个Fragment的交换进出的活动,使其成为最实用的(也是唯一的)实用方法。

Service绑定到Activity时,您将其生命周期与Activity的生命周期联系起来。 参见 Bound Services。每次在活动中添加或删除Fragment时,Fragment都会被创建和销毁。您不希望尝试将服务链接到此进程,因为每次创建或销毁新片段时都必须创建和销毁服务。

而是绑定到主机Activity。然后,您可以使用接口访问绑定服务或通过Intent从您的片段与主机活动进行交互。

答案 2 :(得分:0)

您可以通过getActivity()

从片段中访问您的活动

答案 3 :(得分:0)

您可以使用事件总线模式托盘,使用此库,eventbus发布/订阅模式。https://github.com/greenrobot/EventBus检查项目网站以获取更多信息。

您可以将活动从/向服务发送到活动或片段

答案 4 :(得分:0)

如果您需要在片段生命周期开始时从服务中获取一些数据到片段,则无法调用onServiceConnected on活动,主要是在您旋转设备时,您将获得NPE 。 我认为让片段建立自己的连接是一个好主意,因为服务是以startService()而不是使用bindService()启动的。

答案 5 :(得分:0)

我在My Host Activity中绑定服务,并通过Bundle传递Ibinder的对象,该对象在参数中设置。

我的代码可能是这样的:

private ServiceConnection mConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        //put service in bundle
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }
};

答案 6 :(得分:0)

我发现唯一可靠的方法是Fragment 中使用加载程序:

  1. 在片段
  2. 中创建Loader
  3. 使用context的{​​{1}}(在Loader设置为activity时,会调用片段initLoader
  4. 使用onCreate绑定onStartLoading中的服务,并在服务绑定后立即调用ServiceConnection
  5. 可选择在forceLoad() / onStartLoading
  6. 中注册回调
  7. 取消绑定onStopLoading
  8. 中的服务