我试图从这样的另一个服务绑定服务:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我从goolge的示例中获取的一个简单片段:)代码工作正常,mDataService保存对ServiceB实例的引用,但有一件事我无法理解:在onServiceConnected调用之后调用回调onStart.正如我在android的文档中看到的那样,回调是在主线程上运行的 - 但是我可以指望它在我的情况下总是以这个顺序发生吗?onCreate - > onStart - > onServiceConnected?
yor*_*rkw 13
在官方开发指南中没有明确说明,Context.bindService()确实是一个异步调用,这也解释了为什么ServiceConnection.onServiceConnected()被实现为回调.查看开发指南:
客户端可以通过调用bindService()绑定到服务.如果是这样,它必须提供ServiceConnection的实现,它监视与服务的连接.bindService()方法立即返回而没有值,但是当Android系统在客户端和服务之间创建连接时,它调用ServiceConnection上的onServiceConnected(),以传递客户端可用于与服务通信的IBinder.
在正确建立与服务的连接之后,在将来的某个时刻(在调用Context.bindService()之后不立即)在UI线程上调用ServiceConnection.onServiceConnected().
我不会依赖它。这取决于 ServiceA 和 ServiceB 是在相同进程中还是在不同进程中运行。这可能还取决于 ServiceB 是否已经启动。您应该编写代码,以便不依赖于这一系列事件。
| 归档时间: |
|
| 查看次数: |
11615 次 |
| 最近记录: |