2012-05-29 100 views
7

我想從這樣的其他服務綁定服務:什麼時候完全onServiceConnected有界服務會被調用?

public class ServiceA extends Service { 
    private ServiceB mDataService; 
    private boolean mIsBound; 

    @Override 
    public void onCreate(){ 
     super.onCreate(); 
     doBindService(); 
     /* ... */ 
    } 

    @Override 
    public void onStart(final Intent intent, final int startId){ 
     /*...*/ 
    } 

    private ServiceConnection mConnection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName className, IBinder service) {    
      mDataService = ((ServiceB.LocalBinder)service).getService(); 
     } 
     public void onServiceDisconnected(ComponentName className) {    
      mDataService = null; 
     } 
    }; 

    void doBindService() {   
     bindService(new Intent(ServiceA.this, ServiceB.class), mConnection, Context.BIND_AUTO_CREATE);   
     mIsBound = true; 
    } 

    void doUnbindService() { 
     if (mIsBound) {      
      unbindService(mConnection); 
      mIsBound = false; 
     } 
    }  
} 

這是一個簡單的代碼片段,我從GOOLGE的樣品了:) 代碼工作得很好,mDataService持有至ServiceB實例的引用,但有一件事我不明白:在onStart的調用之後調用onServiceConnected回調。正如我在Android的文檔中看到的那樣,the callback is running on the main thread - 但我能指望它會始終按照我的情況順序發生嗎? onCreate - > onStart - > onServiceConnected?

回答

2

我不會依賴它。這取決於ServiceA和ServiceB是否在相同或不同的進程中運行。它可能還取決於ServiceB是否已經啓動。你應該編寫代碼,以便不依賴於這一系列事件。

12

在官方開發指南中沒有明確說明Context.bindService()確實是異步調用,這也解釋了爲什麼ServiceConnection.onServiceConnected()被實現爲回調函數。檢查出dev guide

客戶端可以通過調用bindService()綁定到服務。當它這樣做時,它必須提供ServiceConnection的實現,它監視與服務的連接。 bindService()方法立即返回沒有值,但是當Android系統創建客戶端和服務之間的連接時,它會調用ServiceConnection上的onServiceConnected()以提供客戶端可以用來與服務進行通信的IBinder。

ServiceConnection.onServiceConnected()在將來的某個時間點(不是在調用Context.bindService()之後立即調用)在UI線程上調用服務的連接正確建立後調用。

+0

是。下面應該用大紅色字母表示:**不要在等待服務連接時阻塞活動/服務啓動器線程!**(好吧,不要阻止它,但是在服務綁定的情況下它會加倍) – snuk182

+2

-1,開發指南是錯誤的。 'bindService()'確實返回一個值。從http://developer.android.com/reference/android/content/Context.html,「如果您已成功綁定到服務,則返回true;如果未建立連接,則返回false,因此您將不會收到服務對象「。 –

相關問題