2012-05-29 56 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,因此您将不会收到服务对象“。 –

相关问题