Android, como espero até que um serviço esteja realmente conectado?

Eu tenho uma atividade chamando um serviço definido em IDownloaderService.aidl:

public class Downloader extends Activity {
 IDownloaderService downloader = null;
// ...

No Downloader.onCreate (Bundle), tentei bindService

Intent serviceIntent = new Intent(this, DownloaderService.class);
if (bindService(serviceIntent, sc, BIND_AUTO_CREATE)) {
  // ...

e dentro do objeto ServiceConnection sc eu fiz isso

public void onServiceConnected(ComponentName name, IBinder service) {
  Log.w("XXX", "onServiceConnected");
  downloader = IDownloaderService.Stub.asInterface(service);
  // ...

Ao adicionar todos os tipos de Log.xx, descobri que o código depois de if (bindService (...)) passa ANTES de ser chamado ServiceConnection.onServiceConnected - ou seja, quando o downloader ainda é nulo - o que me causa problemas. Todas as amostras no ApiDemos evitam esse problema de temporização, apenas chamando serviços quando acionadas por ações do usuário. Mas o que devo fazer para usar corretamente este serviço após o êxito do bindService? Como posso esperar que ServiceConnection.onServiceConnected seja chamado de maneira confiável?

Outra questão relacionada. Todos os manipuladores de eventos: Activity.onCreate, qualquer View.onClickListener.onClick, ServiceConnection.onServiceConnected etc. são realmente chamados no mesmo thread (mencionado no documento como o "thread principal")? Existem intercalações entre eles, ou o Android agendaria todos os eventos para serem gerenciados um por um? Ou, quando exatamente será chamado ServiceConnection.onServiceConnected? Após a conclusão do Activity.onCreate ou em algum momento em que o A.oC ainda esteja em execução?

questionAnswers(6)

yourAnswerToTheQuestion