何时将调用有线服务的onServiceConnected?

时间:2012-05-29 15:46:42

标签: android service

我正在尝试绑定来自其他服务的服务:

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实例的引用,但有一件事我无法理解:onServiceConnected回调是在调用onStart之后调用的。正如我在android的文档the callback is running on the main thread上看到的那样 - 但是我可以指望它在我的情况下总是按照这个顺序发生吗? onCreate - > onStart - > onServiceConnected?

2 个答案:

答案 0 :(得分:12)

官方开发指南中没有明确说明, Context.bindService()确实是异步调用,这也解释了为什么ServiceConnection.onServiceConnected()被实现为回调。查看dev guide

  

客户端可以通过调用bindService()绑定到服务。如果是这样,它必须提供ServiceConnection的实现,它监视与服务的连接。 bindService()方法在没有值的情况下立即返回,但是当Android系统在客户端和服务之间创建连接时,它会调用ServiceConnection上的onServiceConnected(),以提供客户端可以用来与服务通信的IBinder。 / p>

ServiceConnection.onServiceConnected()在未来的某个时刻在UI线程上调用(在调用Context.bindService()之后不立即调用),一旦正确建立了与服务的连接。

答案 1 :(得分:2)

我不会依赖它。这取决于ServiceA和ServiceB是在相同或不同的进程中运行。它可能还取决于ServiceB是否已经启动。您应该编写代码,以便不依赖于这一系列事件。