2010-08-18 23 views

Respuesta

80

creo que la respuesta de Hara era un poco complicado. Lo que describes es perfectamente legítimo y, de hecho, es la única forma de obtener el comportamiento que deseas. Si crea un servicio enlazándolo, morirá cuando lo suelte. Por lo tanto, la única forma de mantenerlo sin actividades vinculantes es iniciarlo con startService(). No hay conflicto con los ciclos de vida porque solo se aplica a cómo se INICIÓ el servicio. Entonces, una vez que se inicia con startService(), sigue el proceso del ciclo de vida. Así que puede vincular y desvincular todo lo que desee y solo morirá cuando llame a stopService() o stopSelf()

+4

¿cómo puedo enlazar a un servicio que se inició con startService()? – user123321

+3

@musselwhizzle: esta pregunta es extremadamente antigua. Si tiene una pregunta, comience un nuevo hilo de pregunta. Pero no hay diferencia en el método en el que se vincula a un servicio que ya se está ejecutando. – Falmarri

+1

También debe tener en cuenta que para tener un servicio completamente eliminado del ciclo de vida de una actividad, inicie el servicio pasando el contexto de la aplicación. Esto significa que el servicio está vinculado al ciclo de vida de la aplicación en lugar de la actividad. Además, mira en START_STICKY. El inicio de la devolución pegajoso junto con el contexto de la aplicación permite que su servicio se ejecute eliminado del ciclo de vida de la aplicación y reiniciarse en caso de que falle antes de completar su propósito. – superuserdo

8

Si inicia un servicio utilizando startService(), entonces debe detenerlo usando stopService().

Existen dos motivos por los que el sistema puede ejecutar un servicio. Si alguien llama a Context.startService(), el sistema recuperará el servicio (creándolo y llamando a su método onCreate() si es necesario) y luego llamará a su método onStartCommand (Intent, int, int) con los argumentos suministrados por el cliente. El servicio continuará en este punto hasta que se llame a Context.stopService() o stopSelf(). Tenga en cuenta que las llamadas múltiples a Context.startService() no anidan (aunque dan lugar a múltiples llamadas correspondientes a onStartCommand()), así que no importa cuántas veces se inicie, un servicio se detendrá una vez Context.stopService() o stopSelf() se llama; sin embargo, los servicios pueden usar su método stopSelf (int) para garantizar que el servicio no se detenga hasta que los intentos iniciales hayan sido procesados.

Usted puede enlazar con el servicio ya que muchos ServiceConnection como desee con bindService(), pero preste atención a la bandera que ha pasado a ella. Si pasa 0, entonces si llama a stopService() el servicio se detendrá (no sé exactamente qué le sucede a ServiceConnection). De lo contrario, si desea que su servicio continúe vivo hasta que ServiceConnection esté enlazado a él, entonces use BIND_AUTO_CREATE.

Esto es de stopService():

Solicitar que un servicio de aplicación dada puede detener. Si el servicio no se está ejecutando, no sucede nada. De lo contrario, se detiene. Tenga en cuenta que las llamadas a startService() no se cuentan; esto detiene el servicio sin importar cuántas veces se haya iniciado.

Tenga en cuenta que si un servicio detenido todavía tiene objetos ServiceConnection vinculados con el conjunto BIND_AUTO_CREATE, no se destruirá hasta que se eliminen todos estos enlaces. Consulte la documentación del Servicio para obtener más detalles sobre el ciclo de vida de un servicio.

Esta función lanzará SecurityException si no tiene permiso para detener el servicio dado.

espero que esto ayude ..

8

Sí, puede iniciar y vincular (una o más veces) el mismo servicio .

El siguiente diagrama de flujo muestra cómo se administra el ciclo de vida de un servicio.El contador de variables rastrea la cantidad de clientes enlazados: enter image description here

Buen ejemplo: aplicación de música. Explicación de Building a Media Browser Service tutorial oficial:

Un servicio que sólo está obligado (y no se ha iniciado) se destruye cuando todo de sus clientes Unbind. Si su actividad de IU se desconecta en este punto, , el servicio se destruye. Esto no es un problema si aún no has jugado música. Sin embargo, cuando se inicia la reproducción, el usuario probablemente espera continuar escuchando incluso después de cambiar de aplicación. No desea destruir el reproductor cuando desvincula la interfaz de usuario para trabajar con otra aplicación .

Por esta razón, necesita estar seguro de que el servicio se inicia cuando comienza a jugar llamando a startService(). Un servicio iniciado debe estar explícitamente detenido, esté o no enlazado. Esto garantiza que su reproductor continúe funcionando incluso si la actividad de UI de control se desvincula.

Para detener un servicio iniciado, llame a Context.stopService() o stopSelf(). El sistema se detiene y destruye el servicio lo antes posible. Sin embargo, si uno o más clientes aún están vinculados al servicio, la llamada para detener el servicio se retrasa hasta que todos sus clientes se desvinculan.

De Service ref:

un servicio puede ser a la vez comenzado y tienen conexiones enlazadas a ella. En un caso como este , el sistema mantendrá el servicio ejecutándose siempre que se haya iniciado o haya una o más conexiones con el indicador Context.BIND_AUTO_CREATE . Una vez que no se cumple ninguna de estas situaciones, el método onDestroy() del servicio se llama y el servicio es efectivamente terminado.