Android: ¿Cómo forzar onStartCommand () que se llama antes de onBind ()?

Estoy intentando crear un servicio pegajoso que sea bindable a (necesito funcionar operaciones potencialmente asincrónicas en el fondo en algunos datos que el servicio se sostiene). Para ello, necesito estar seguro de que onBind siempre se ejecuta después de onStartCommand. ¿Hay alguna manera de garantizar esto?

4 Solutions collect form web for “Android: ¿Cómo forzar onStartCommand () que se llama antes de onBind ()?”

De sus requerimientos, es probable que no tenga que vincular a su Service . Entonces usar un IntentService sería suficiente, ya que este servicio se detendrá después de que su trabajo esté terminado.

Tomado de los documentos:

IntentService es una clase base para Servicios que manejan solicitudes asincrónicas (expresadas como Intentes) a petición. Los clientes envían solicitudes a través de llamadas startService (Intent); El servicio se inicia según sea necesario, maneja cada intento a su vez usando un hilo de trabajo y se detiene cuando se queda sin trabajo.

Un ejemplo de un IntentService :

 public class MyService extends IntentService { @Override protected void onHandleIntent(Intent intent) { if (intent != null) { // Do some work here, get Intent extras if any, etc. // ... // Once this method ends, the IntentService will stop itself. } } } 

Más información sobre cómo crear un IntentService se puede encontrar aquí .

Eso puede manejar sus operaciones asíncronas. Y si necesita algún comentario, que "romperá" la parte asincrónica del requisito, podría usar un LocalBroadcastManager o, como usted dijo, podría enlazar a este Service . Y luego otra vez, depende de lo que usted está intentando hacer.

De los documentos, usted tiene dos tipos de servicios.

Empezado

Un servicio se "inicia" cuando un componente de aplicación (como una actividad) lo inicia llamando a startService (). Una vez iniciado, un servicio puede ejecutarse en segundo plano indefinidamente, incluso si el componente que lo inició se destruye. Normalmente, un servicio iniciado realiza una sola operación y no devuelve un resultado a la persona que llama. Por ejemplo, puede descargar o cargar un archivo a través de la red. Cuando se realiza la operación, el servicio debe detenerse.

Ligado

Un servicio está "enlazado" cuando un componente de aplicación se une a él llamando a bindService (). Un servicio enlazado ofrece una interfaz cliente-servidor que permite a los componentes interactuar con el servicio, enviar solicitudes, obtener resultados e incluso hacerlo a través de procesos con comunicación interproceso (IPC). Un servicio enlazado se ejecuta sólo siempre y cuando otro componente de aplicación esté vinculado a él. Varios componentes pueden enlazar al servicio de una vez, pero cuando todos ellos se desvinculan, el servicio se destruye.

Recordatorio: Puede iniciar un Service través de startService() para que se ejecute "indefinidamente" y vincularlo llamando a onBind() más adelante.

 Intent it = new Intent(this, MyService.class); startService(it); // Start the service. bindService(it, this, 0); // Bind to it. 

Si desea simplemente ejecutar este servicio mientras su Activity esté en ejecución, podría simplemente llamar a onBind() .

 Intent it = new Intent(this, MyService.class); bindService(it, this, 0); // This will create the service and bind to it. 

Más información sobre el servicio "predeterminado", cómo usarlo e implementarlo se puede encontrar aquí .

Sólo elija lo que funciona mejor para su caso de uso, y usted es bueno para ir.

El punto es que no se debe llamar a startService () y bindService (). Si desea enlazar a un servicio, llame a bindService (). Cuando el servicio está conectado, se llama a su implementación de ServiceConnection.onServiceConnected (), lo que le da un IBinder al Servicio. Normalmente, un servicio enlazado se utiliza como parte del servidor de una interfaz cliente-servidor interna. Se enlaza al servicio, devuelve un IBinder que le da un identificador al objeto de servicio en sí y, a continuación, utilice el identificador de servicio para pasar datos o métodos de llamada en el servicio.

Los servicios vinculados se utilizan casi siempre para conectar entre procesos (IPC).

Según los documentos :

Un servicio puede esencialmente tomar dos formas:

Empezado
Un servicio se "inicia" cuando un componente de aplicación (como una actividad) lo inicia llamando a startService ().
Ligado
Un servicio está "enlazado" cuando un componente de aplicación se une a él llamando a bindService (). [..] Un servicio enlazado se ejecuta sólo mientras otro componente de la aplicación esté vinculado a él. Varios componentes pueden enlazar al servicio de una vez, pero cuando todos ellos se desvinculan, el servicio se destruye.

Para asegurarse de que onStartCommand() siempre se ejecuta antes de onBind() , siga enviando una nueva intención al servicio cada vez que quiera onBind() . Esto se debe a que cualquier nueva intención al servicio activará onStartCommand() , entonces una llamada a bindService() ejecutará onBind() .

Para cualquier persona que resuelve excepto problema. Puede llamar a start service en el método onBind.

 @Override public IBinder onBind(Intent intent) { //stars self Intent myIntent = new Intent(this, Service.class); startService(myIntent); //TODO return null; } 

A continuación, simplemente compruebe si el servicio ya está iniciado o no y manejarlo.

  • Servicio de detector de balizas de estimación en segundo plano
  • Android servicio notificar actividad completó la mejor manera?
  • Implementación de un grupo de subprocesos dentro de un servicio
  • ¿Qué es un JobService en Android?
  • Android: ¿Cómo solucionar la falla de la conexión de la API de Google desde un servicio?
  • OnStart () y onStartCommand () siguen llamados en 2.0 y superiores
  • Enviar datos de la actividad al servicio
  • ¿Cómo ejecuto un método de servicio periódicamente?
  • ¿Cómo detener / cancelar el administrador de alarmas en otra actividad?
  • Preferencias compartidas entre dos procesos de la misma aplicación
  • Cómo el calendario de Google o Instagram hacer sus aplicaciones todo el tiempo en marcha y funcionando incluso después de la parada de fuerza
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.