我有一个使用远程服务的安卓应用程序,我用bindService()绑定到它,这是异步的。
在绑定服务之前,应用程序是无用的,所以我想简单地等待,直到绑定完成,然后再启动任何活动。有没有办法在调用onCreate()或onResume()之前绑定服务?我认为也许有一种方法可以在Application中完成绑定。有什么想法吗?
编辑:
如果在onCreate()中,我这样做。
bindService(service, mWebServiceConnection, BIND_AUTO_CREATE);
synchronized (mLock) { mLock.wait(40000); }ServiceConnection.onServiceConnected在40秒内不会被调用。很明显,如果我想要绑定服务,就必须让onCreate()返回。
所以看起来没有办法做我想做的事。
编辑2:在绑定服务时,Android how do I wait until a service is actually connected?对安卓中发生的事情有一些很好的评论。
发布于 2011-06-25 02:49:31
您不能使用bindService()块。但是,您的ServiceConnection (bindService的第二个参数)有回调来告诉您服务何时连接和断开,因此您可以使用其他代码块,直到您的onServiceConnected()方法取消阻塞它。
发布于 2014-03-03 06:39:59
当我需要在做其他事情之前等待服务被绑定时,我会使用锁。确切地说,ServiceConnection拥有一个锁对象,并公开一个waitUntilConnected方法,该方法在锁上阻塞,直到出现唤醒信号。该通知位于onServiceConnected回调中。
public class MyServiceConnection implements ServiceConnection {
private volatile boolean connected = false;
private Object lock = new Object();
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
connected = true;
synchronized (lock) {
lock.notifyAll();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
connected = false;
}
public void waitUntilConnected() throws InterruptedException {
if (!connected) {
synchronized (lock) {
lock.wait();
}
}
}
}因此,例如,如果一个活动必须等待服务被绑定,它只调用waitUntilConnected方法。
protected void onStart() {
super.onStart();
bindService(myServiceIntent, myServiceConnection, Context.BIND_AUTO_CREATE);
try {
myServiceConnection.waitUntilConnected();
} catch (InterruptedException e) {
e.printStackTrace();
}
}我只是将waitUntilConnected方法放在onStart中作为示例,但是必须在不同的线程中调用它。我想听到一个更优雅的方式!:)
发布于 2013-04-08 17:32:33
似乎有一种方法可以做到这一点。KeyChain.java和几个谷歌编写的类使用LinkedBlockingQueue来允许同步绑定到服务。
例如,请参阅https://github.com/android/platform_frameworks_base/blob/master/keystore/java/android/security/KeyChain.java上名为bind的方法
由于阻塞队列的使用,它似乎会同步返回服务对象。
不幸的是,正如Android文档https://developer.android.com/reference/android/security/KeyChain.html中所述,一些方法会抛出InterruptedException,这是因为从队列中获取元素可能会在等待时被中断。
https://stackoverflow.com/questions/6472345
复制相似问题