2012-04-17 65 views
1

我有一個服務需要綁定,因爲調用者需要一些反饋和返回值。至少有一個Activity,一個片段和一個ContentProvider應該使用綁定的Service。因此,使用對象調用bindService。並且全部收到onServiceConnected。目前沒有問題,這是有效的。如何確保所有服務連接都被綁定?

但是:然後:活動希望所有片段顯示其內容,並且他們調用ContentProvider。它發生了,碎片和CP是而不是綁定。所以我不能確定,在服務連接期間,所有其他服務使用對象都已連接。

如何解決這個問題?一些想法浮現在我的腦海裏:

  • 有沒有辦法控制接收onServiceConnected回調的對象的順序?

  • 是否存在一個Activity生命週期回調,我可以確定所有onServiceConnected調用都已完成?那麼,是否有更好的方式開始填充碎片的內容?或者,也許,如果我在Activity的onServiceConnected中發佈消息,我能確定此消息是在所有其他onServiceConnected-calls之後處理的嗎?

  • 另一個想法是我將綁定的服務連接保存在其他地方的靜態單個字段中。由於ContentProvider需要訪問,我想到了Service類本身。但不知何故,這似乎違背了綁定服務的想法?!?!

還有其他想法嗎?

Thanx,Joerg

回答

0

我能想出一個非常簡單的解決方案來解決您的問題。

只要您將Activity,Fragment或ContentProvider綁定到指定的服務,您還可以告訴他誰剛剛註冊(通過服務中的已註冊元素的計數器)。 使用服務中的公共方法,您可以從活動中檢索已註冊元素的數量。

**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接口,每當一個新的元素已經被綁定或取消綁定通知活動。

+0

該解決方案的問題是,我不知道該等什麼(有多少片段和CP)。如果他們還沒有結束,該怎麼辦...... – Jockel 2012-04-20 17:02:54

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(); 
      } 
     }); 
    } 

有誰已經嘗試了雙核/四核設備上的類似的東西?

問候,Joerg

相關問題