2012-04-17 6 views
1

私は、呼び出し元がフィードバックと戻り値を必要とするため、バインドする必要のあるサービスを持っています。少なくとも1つのアクティビティ、1つのフラグメント、1つのContentProviderがあり、バインドされたサービスを使用する必要があります。したがって、使用するオブジェクトはbindServiceを呼び出します。そして、すべてonServiceConnectedを受け取ります。これまでどおり問題はありません。すべてのサービス接続がバインドされていることを確認する方法

しかし、アクティビティでは、すべてのフラグメントにコンテンツが表示され、ContentProviderが呼び出されます。そして、断片とCPはではなく、まだになっていません。ですから、私は、onServiceConnected中に他のすべてのService-usingオブジェクトが接続されていることを確認できません。

これを解決するにはどうすればよいですか?

  • onServiceConnectedコールバックを受け取るオブジェクトのシーケンスを制御する方法はありますか?

  • すべてのonServiceConnected呼び出しが完了したことを確認できるアクティビティライフサイクルコールバックはありますか?だから、フラグメントの内容を満たすためのより良い方法がありますか?あるいは、私がActivityのonServiceConnectedにメッセージを投稿した場合、他のすべてのonServiceConnected-Callの後にこのメッセージが処理されることを確認できますか?

  • もう一つのアイデアは、バインドされたサービス接続を他の場所の静的な単一フィールドに保存することでした。 ContentProviderにアクセスする必要があるため、私はServiceクラスそのものを考えました。しかし、どういうわけかこれは縛られたサービスのアイデアに反しているようです。

他のアイデアはありますか?

Thanx、Joerg

答えて

0

私はあなたの問題を非常に簡単な解決策と考えることができます。

アクティビティ、フラグメント、またはコンテンツプロバイダを指定されたサービスにバインドするたびに、登録したばかりの人に(サービス内の登録された要素のカウンタを介して)通知することもできます。 サービス内のパブリックメソッドを使用すると、アクティビティから登録された要素の量を取得できます。

**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() 

あなたはかなり新しい要素が結合または非結合された時はいつでもあなたのサービスや通知活動のリスナーインタフェースを実装する同じ操作を実行することができるはずです。

はonServiceConnectedで、私はUIスレッドにメッセージを投稿:

+0

この解決策の問題は、私は(どのように多くの断片とCPS)を待つかわからないということでしょう。そして、もし彼らがまだ縛られていなければ何をすべきか... – Jockel

1

ああ、私が解決策を見つけたようです。私の理解では、このメッセージは、他のすべての保留中の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(); 
      } 
     }); 
    } 

誰でもデュアル/クアッドコアデバイスに似た何かをしようとしていますか?

挨拶、イェルク

関連する問題