如何确保所有服务连接都绑定?

时间:2012-04-17 22:31:03

标签: android android-service android-contentprovider

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

然后:活动希望所有片段显示其内容,并调用ContentProvider。它发生了,片段和CP 尚未绑定。所以我无法确定,在onServiceConnected期间,所有其他使用Service的对象都已连接。

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

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

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

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

还有其他想法吗?

Thanx,Joerg

2 个答案:

答案 0 :(得分: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();
            }
        });
    }

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

问候,约尔格

答案 1 :(得分:0)

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

每当您将Activity,Fragment或ContentProvider绑定到指定的服务时,您也会告诉他刚注册的人(通过服务中注册元素的计数器)。 使用服务中的公共方法,可以从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()

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