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谢谢你的建议。这是唯一的方法吗?或者有其他方法吗?我想这可能会有所帮助:虽然我并不需要太多的功能,但我肯定会看看这个库。谢谢。我应该创建包含后端服务实例的片段构造函数吗?这取决于它是否对片段正常工作至关重要。这通常是我在添加内容时的规则