¿Cuándo se llamará exactamente onServiceConnected para el servicio limitado?

Estoy tratando de enlazar el servicio de otro servicio como este:

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; } } } 

Este es un simple fragmento que tomé de las muestras de goolge 🙂 El código funciona bien y mDataService contiene una referencia a la instancia de ServiceB, pero hay una cosa que no podía entender: la llamada a onServiceConnected se llama después de la llamada a onStart . Como vi en los documentos de Android, la devolución de llamada se está ejecutando en el hilo principal – pero ¿puedo contar con él que siempre sucederá en este orden en mi caso? OnCreate -> onStart -> onServiceConnected?

No se ha indicado claramente en la guía oficial de dev, el Context.bindService () es de hecho una llamada asíncrona, esto también explica por qué ServiceConnection.onServiceConnected () se implementa como una devolución de llamada. Echa un vistazo a la guía de dev :

Un cliente puede enlazar al servicio llamando a bindService (). Cuando lo hace, debe proporcionar una implementación de ServiceConnection, que supervisa la conexión con el servicio. El método bindService () devuelve inmediatamente sin un valor, pero cuando el sistema Android crea la conexión entre el cliente y el servicio, llama a ServiceServiceConnected () en ServiceConnection para entregar el IBinder que el cliente puede utilizar para comunicarse con el servicio.

ServiceConnection.onServiceConnected () se llama al hilo de la interfaz de usuario en algún momento en el futuro (no inmediatamente después de llamar a Context.bindService ()), una vez que la conexión al servicio esté establecida correctamente.

Yo no confiaría en ello. Depende si ServiceA y ServiceB se ejecutan en el mismo o en procesos diferentes. Probablemente también depende si ServiceB ya se ha iniciado. Debe escribir su código para que no dependa de esta secuencia de eventos.

  • "Service MeasurementBrokerService está en uso" está mostrando en mi proceso de solicitud
  • Atrapar en el golpe para despedir el evento
  • Android: crea servicio que se ejecuta cuando se detiene la aplicación
  • ¿Debería extender la clase Binder o usar un Messenger?
  • OnBind / onRebind no se llama en Service
  • Permiso denegado cuando intento iniciarServicio
  • Puede un servicio de Android proporcionar dos interfaces para comunicarse con?
  • Cómo establecer la prioridad de IntentService en Android
  • Servicio que se ejecuta cada minuto
  • Android: stopService () no llama a onDestroy ()!
  • ¿Por qué la aplicación Android basada en Android no está instalando en el dispositivo Android basado en Asistencia-GPS (A-GPS)?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.