1

我有一个需要绑定的服务,因为调用者需要一些反馈和返回值。至少有一个 Activity、一个 Fragment 和一个 ContentProvider 应该使用绑定的 Service。所以所有使用对象调用bindService。并且都收到 onServiceConnected。到目前为止没问题,这行得通。

但是随后:Activity 想要所有的 Fragment 显示它们的内容,它们调用 ContentProvider。碰巧的是,Fragments 和 CP 还没有绑定。所以我不能确定,在 onServiceConnected 期间,所有其他使用服务的对象都已连接。

如何解决这个问题?我想到了一些想法:

  • 有没有办法控制接收 onServiceConnected 回调的对象的顺序?

  • 是否有一个活动生命周期回调,我可以确定所有 onServiceConnected 调用都已完成?那么,有没有更好的方法来开始填充 Fragments 的内容?或者,如果我在 Activity 的 onServiceConnected 中发布消息,我能否确定在所有其他 onServiceConnected 调用之后处理此消息?

  • 另一个想法是我将绑定的服务连接保存在其他地方的静态单个字段中。因为 ContentProvider 需要访问,所以我想到了 Service 类本身。但不知何故,这似乎违背了绑定服务的想法?!?!

还有其他想法吗?

谢谢,约尔格

4

2 回答 2

1

啊,看来我找到了解决方案:

在 onServiceConnected 中,我向 UI 线程发布了一条消息。据我了解,此消息是在所有其他待处理的 onServiceConnected 回调完成后处理的。

所以现在我的代码看起来像:

private ServiceConnection mConnection = new ServiceConnection() {
    @Override public void onServiceConnected(ComponentName name, IBinder service) {
        HeftBinder binder = (HeftBinder)service;
        mService = binder.getService();
        mBound = true;
        new Handler().post(new Runnable() {
            @Override public void run() {
                fillAllTheFragments();
            }
        });
    }

有没有人在双/四核设备上尝试过类似的东西?

问候,约尔格

于 2012-04-20T17:09:02.403 回答
0

我可以想到一个非常简单的解决方案来解决您的问题。

每当您将 Activity、Fragment 或 ContentProvider 绑定到指定的 Service 时,您也会告诉他刚刚注册的人(通过 Service 中已注册元素的计数器)。使用服务中的公共方法,您可以从 Activity 中检索已注册元素的数量。

**Service.java**

private int nb_Fragments = 0;
private int nb_CProviders = 0;    

// Adds an element
public void addBoundElement(String nature)
    nb_Fragments++ OR nb_CProviders++;

// Remove an element
public void unBoundElement(String nature)
    nb_Fragments-- OR nb_CProviders--;

// Are both a Fragment and a ContentProvider bound ?
public boolean areAlreadyBound()

您应该能够执行几乎相同的操作,在您的服务中实现侦听器接口,并在绑定或取消绑定新元素时通知活动。

于 2012-04-18T09:39:35.877 回答