¿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?
- Servicio remoto muerto mientras que el proceso principal está vinculado a él
- El servicio no se inicia de nuevo después de que la aplicación kill incluso utilice START_STICKY en algún dispositivo
- ¿Por qué se destruye el servicio remoto cuando se cierra la actividad principal?
- Parcel.readException pasando un objeto al servicio remoto
- Detener el servicio en android
- Error "No se puede iniciar el servicio de intención" al iniciar el servicio desde una actividad en Android
- Compruebe si el servicio se está ejecutando desde un receptor de difusión
- Comprobación de la conexión a Internet con el servicio en android
- Enfoque eficiente para comprobar continuamente si la conexión a Internet está disponible en Android
- Quiero publicar actualizaciones de ubicación cada 15 minutos al servidor incluso cuando la aplicación no se está ejecutando en primer plano
- Cómo desvincular correctamente los servicios
- Uso de facebook android sdk desde el servicio
- Devoluciones de llamadas del servicio remoto de Android
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.
- No se puede cambiar el color del icono del cajón de navegación en android
- Android AppWidget no aparece en el menú en panal hasta que se reinicie