可以bindService()被阻止吗?

我有一个使用远程服务的Android应用程序,并使用bindService()来绑定它,这是asynchronous的。

该应用程序是没有用的,直到服务被绑定,所以我想等到绑定完成之前,任何活动开始。 有没有办法让onCreate()onResume()被调用之前绑定服务? 我认为可能有办法在Application进行绑定。 有任何想法吗?

编辑:

如果在onCreate()我这样做。

 bindService(service, mWebServiceConnection, BIND_AUTO_CREATE); synchronized (mLock) { mLock.wait(40000); } 

ServiceConnection.onServiceConnected不会被调用40秒。 很明显,如果我想让服务绑定,我必须让onCreate()返回。

所以看起来没有办法做我想要的。

编辑2: Android如何等待一个服务实际连接? 在绑定一个服务时,对Android中发生了什么有一些很好的评论。

Solutions Collecting From Web of "可以bindService()被阻止吗?"

你不能有bindService()块。 但是,ServiceConnection(bindService的第二个参数)具有callback函数来告诉您服务何时连接和断开连接,因此您可以使用其他代码阻塞,直到您的onServiceConnected()方法取消阻止。

当我在做别的事情之前需要等待一个服务被绑定的时候,我用锁来玩。 确切地说, ServiceConnection拥有一个锁对象并公开一个waitUntilConnected锁的waitUntilConnected方法,直到唤醒信号。 该通知位于onServiceConnectedcallback中。

 public class MyServiceConnection implements ServiceConnection { private 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(); } } 

我只是在onStart放置了waitUntilConnected方法,但必须在不同的线程中调用它 。 我想听听更优雅的方式! 🙂

似乎有办法做到这一点。 KeyChain.java和几个Google编写的类使用LinkedBlockingQueue来允许同步绑定到服务。

例如,看到这个方法称为bind : https : //github.com/android/platform_frameworks_base/blob/master/keystore/java/android/security/KeyChain.java

由于使用阻塞队列,似乎同步返回服务对象。

不幸的是,正如在Android文档https://developer.android.com/reference/android/security/KeyChain.html中所述 ,由于队列中的元素可能会在等待时被InterruptedException ,所以有些方法会抛出InterruptedException

bindService()不能被阻塞。 这种打败了Service的全部目的。 你说你整个用户界面是由服务的结果组成的。 我认为你需要重新考虑你的用户界面,并用一些中间表示来填充它,以显示用户应用程序正在收集数据。