我正在尝试绑定来自其他服务的服务:
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?
答案 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是否已经启动。您应该编写代码,以便不依赖于这一系列事件。