8

我正在尝试从另一个服务绑定服务,如下所示:

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 的文档上看到的,回调在主线程上运行- 但我可以指望它在我的情况下总是按这个顺序发生吗?onCreate -> onStart -> onServiceConnected ?

4

2 回答 2

13

如果官方开发指南(仍然)不清楚,那么 Context.bindService() 确实是一个异步调用。这也解释了为什么ServiceConnection.onServiceConnected()实现为回调。

查看开发指南

客户端通过调用绑定到服务bindService()。当它这样做时,它必须提供一个实现ServiceConnection,它监视与服务的连接。

的返回值bindService()指示请求的服务是否存在以及是否允许客户端访问它。

当 Android 系统在客户端和服务之间建立连接时,它会调用onServiceConnected(). ServiceConnectiononServiceConnected()方法包括一个IBinder参数,然后客户端使用该参数与绑定的服务进行通信。

ServiceConnection.onServiceConnected()一旦正确建立到服务的连接,在将来的某个时间点在 UI 线程上调用(不是在调用 Context.bindService() 之后立即调用)。

于 2012-05-29T22:00:26.937 回答
2

我不会依赖它。这取决于 ServiceA 和 ServiceB 是在相同的进程中运行还是在不同的进程中运行。它可能还取决于 ServiceB 是否已经启动。你应该编写你的代码,这样你就不会依赖于这个事件序列。

于 2012-05-29T16:05:48.820 回答