我正在制作音乐播放器应用。我有一个主要的活动,有多个片段,每个片段在设备专辑中明智地显示歌曲,艺术家明智等 我有一个音乐服务,处理所有的播放和其他东西 我所困惑的是这项服务与我拥有的各种片段的结合 现在我将主要活动和每个片段分别与服务绑定,并且它的工作非常好。但我想知道这是否真的是最好的做法?有没有办法将主要活动与服务绑定,然后一些如何在其子片段中使用它? 我可能错过了一些非常基本的活动概念或片段或服务。所以有人请指导我这方面 我想这更像是一个概念性问题,因此不需要任何代码。但如果需要,请告诉我。
编辑:
我的问题是:将服务绑定到具有多个子片段(每个片段都使用该服务)的活动的更好方法是什么?
答案 0 :(得分:17)
我认为更清洁的架构是直接从片段绑定。关于Rarw的答案中概述的问题,您可以从您的活动和您的片段绑定到该服务。这样,您可以确保服务将在那里,直到活动未被销毁。
我可以看到从片段连接的两个主要优点:
服务连接是异步的,因此在片段内部,您永远不会确定从活动获得的服务不是null。这将导致您至少进行一些空指针检查以及某些机制,以便在创建片段和服务连接时刷新片段(因此您确定无论先发生哪一个都会显示数据)。
您不依赖于您的片段所处的特定活动。要从活动中获取服务,我认为您正在对特定于活动的类进行强制转换。您可以使用类似BoundActivity
的方法创建getBoundService
之类的接口以从中获取服务,但我认为考虑到第1点的优势,这是一个开销。如果您有多个服务,那该怎么办呢。
<强>更新强>
这是一个非常简单的项目。 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
中使用加载程序:
Loader
context
的{{1}}(在Loader
设置为activity
时,会调用片段initLoader
onCreate
绑定onStartLoading
中的服务,并在服务绑定后立即调用ServiceConnection
forceLoad()
/ onStartLoading
onStopLoading