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

Android 将服务绑定到活动或片段?,android,android-fragments,android-service,Android,Android Fragments,Android Service,我正在开发一个音乐播放器应用程序。我有一个主要活动,它有多个片段,每个片段都在设备上显示歌曲专辑、艺术家等。 我有一个音乐服务,可以处理所有的播放和其他事情。 我所困惑的是这个服务与我拥有的各种片段的绑定。 现在,我将主要活动和每个片段分别与服务绑定,并且它的工作非常好。但我想知道这是否是最好的做法?有没有办法只将主活动与服务绑定,然后在其子片段中使用它? 我可能缺少一些关于活动、片段或服务的基本概念。所以请有人在这方面指导我。 我想这更像是一个概念性的问题,所以不需要任何代码。但如果需要的话,

我正在开发一个音乐播放器应用程序。我有一个主要活动,它有多个片段,每个片段都在设备上显示歌曲专辑、艺术家等。
我有一个音乐服务,可以处理所有的播放和其他事情。
我所困惑的是这个服务与我拥有的各种片段的绑定。
现在,我将主要活动和每个片段分别与服务绑定,并且它的工作非常好。但我想知道这是否是最好的做法?有没有办法只将主活动与服务绑定,然后在其子片段中使用它?
我可能缺少一些关于活动、片段或服务的基本概念。所以请有人在这方面指导我。
我想这更像是一个概念性的问题,所以不需要任何代码。但如果需要的话,请告诉我

编辑:

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

您可以通过
getActivity()

从片段访问您的活动,您可以使用事件总线模式和该库eventbus发布/订阅模式。查看项目站点以了解更多信息


您可以将事件从服务发送到活动或片段

服务
绑定到您的活动,而不是
片段
。对您的应用程序的描述,一个包含多个
片段的活动,这些片段可以进行交换,这使得这是最(也是唯一)实用的方法

当您将
服务
绑定到
活动
时,您将其生命周期绑定到
活动
的生命周期。看见每次在活动中添加或删除
片段
,都会创建并销毁
片段。您不希望尝试将服务链接到此进程,因为这样,每次创建或销毁新片段时,您都必须创建和销毁服务


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

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

我在主机活动中绑定服务,并通过参数中设置的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) {

    }
};

我认为更干净的架构是直接从片段绑定。关于Rarw回答中概述的问题,您可以从活动和片段绑定到服务。通过这种方式,您可以确保服务将一直存在,直到活动未被销毁

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

  • 服务连接是异步的,因此在片段中,您永远无法真正确定从活动中获得的服务是否为null。这将至少引导您进行一些空指针检查,以及在创建片段和服务连接时刷新片段的某种机制(因此您可以确定,无论这两种情况中的哪一种先发生,都将显示数据)

  • 您不依赖于您的片段所在的特定活动。为了从活动中获得服务,我认为您正在对特定于活动的类进行转换。您可以使用
    getBoundService
    这样的方法创建一个像
    BoundActivity
    这样的接口,从中获取服务,但考虑到第1点的优势,我认为这是一种开销。如果你有多个服务呢

  • 更新

    下面是一个非常简单的项目,展示了这一点。
    我发现唯一可靠的方法是
    片段中使用加载程序

  • 在片段中创建一个
    加载程序
  • 使用
    加载程序的
    上下文
    (在调用片段的
    onCreate
    时,在
    initLoader
    中设置为
    活动
  • onStartLoading
    中绑定服务,使用
    ServiceConnection
    在绑定服务后立即调用
    forceLoad()
  • onStartLoading
    /
    onStopLoading
  • onStopLoading

  • 谢谢你的快速回复。我知道这个功能。但我想问的是,是否建议只将服务与主活动绑定,并在片段中使用getActivity()来使用该服务?或者我应该单独将其与所有活动和片段绑定?我会绑定到尽可能少的实体,尽管我不知道这是否可取。getActivity()可以返回null。最好使用onAttach(),ref getActivity将返回片段正在使用的任何父活动。因此,它不能保证活动是什么类型。请将其绑定到承载片段的活动。一个片段接受宿主活动的上下文,该上下文通过getActivity()方法访问。然后,您可以通过活动与服务交互。试图绑定到每个片段和活动都是一团混乱。@Rarw谢谢你的建议。这是唯一的方法吗?或者有其他方法吗?我想这可能会有所帮助:虽然我并不需要太多的功能,但我肯定会看看这个库。谢谢。我应该创建包含后端服务实例的片段构造函数吗?这取决于它是否对片段正常工作至关重要。这通常是我在添加内容时的规则