2011-12-02 19 views
8

estoy un poco confundido acerca de cómo funcionan los servicios, sobre todo estas dos cosas:Android: ¿cómo es posible que un servicio siga funcionando después de que la Actividad se haya cerrado?

De http://developer.android.com/guide/topics/fundamentals/services.html:

Un servicio es "comenzó" cuando un componente de aplicación (tal como una actividad) se inicia mediante una llamada Comienza el servicio(). Una vez iniciado, un servicio puede ejecutarse en segundo plano indefinidamente, incluso si el componente que lo inició se destruye.

y:

Precaución: Un servicio se ejecuta en el hilo principal de su alojamiento proceso de servicio no crea su propio hilo y no se ejecuta en un proceso separado (a menos que se especifique lo contrario) .

Mis preguntas:

  1. ¿Cómo es posible para un servicio que fue iniciado por StartService() sobrevivir, si el hilo principal actividad se cierra? ¿O solo esos servicios sobreviven al cierre principal de la actividad, que están en un hilo separado?

  2. ¿Cómo puedo iniciar un servicio en un hilo separado? El documento dev en http://developer.android.com/guide/topics/fundamentals/services.html#ExtendingService solo muestra un ejemplo de cómo generar un hilo cuando se crea el servicio ... no cómo generar el servicio en sí mismo en un nuevo hilo ...
    EDITAR: Se usa android:process= en manifest.xml para iniciarlo en un hilo separado? (Si se empieza en un nuevo proceso, entonces tiene que ser en un hilo separado ..)

+0

¿Podría aceptar la respuesta? Gracias –

+0

@Kiran lo acepto, si mi segunda pregunta es respondida también. Ver mi edición sobre una adivinación de cómo resolverlo. – sydd

+0

Normalmente genera hilos para distribuir la carga. Pero el propósito de un Servicio en sí es realizar algunas operaciones pesadas sin interferir con la Actividad. Responda a esta pregunta: "¿Puedes comenzar una actividad en un hilo separado?". Con toda probabilidad, la misma respuesta se aplica también a un Servicio –

Respuesta

6

Para citar que ,:

Precaución: Un servicio se ejecuta en el hilo principal de su alojamiento proceso de servicio no crea su propio hilo y no se ejecuta en un proceso separado (a menos usted especifica lo contrario).

Cuando la actividad principal se cierra, no significa necesariamente que el proceso de alojamiento finalice. De acuerdo con la documentación, el servicio continúa funcionando porque el proceso está activo.

Comprobar this

El sistema Android intentará mantener el proceso de alojamiento de un servicio existido siempre y cuando el servicio se ha iniciado o tiene clientes ligados a ella. Cuando se ejecuta bajo en la memoria y la necesidad de matar a los procesos existentes, la prioridad de un proceso que aloja el servicio será la más alta

Así que sólo cuando se ejecuta bajo de recursos y es requerida para matar procesos por ahí, su proceso de sería asesinado Más. el proceso continúa así también su servicio.

+0

Gracias, esto responde perfectamente a mi primera pregunta. – sydd

4
  1. Un servicio puede sobrevivir comenzó el cierre de una actividad que comienza exactamente de la misma manera que una actividad puede sobrevivir el cierre de otra actividad que comienza con startActivity(). Las actividades y los servicios son solo dos componentes separados de su proceso de solicitud. Una vez iniciado, cada uno existe independientemente del otro. (Las cosas son un poco diferentes con los servicios encuadernados — el sistema cerrará un servicio encuadernado cuando ya no quede nada vinculado).

  2. No puede iniciar un servicio en un hilo separado, como tampoco puede iniciar una actividad en un hilo de no evento. Solo puede solicitar al sistema que inicie el servicio (a través del startService() o bindToService()). El sistema siempre inicia el servicio en el hilo del evento.

+0

y ¿qué ocurre si especifico android: process = ": remote" para mi servicio en manifest.xml? ¿Todavía estará en el mismo hilo? – sydd

+0

@sydd: si especifica un nombre de proceso así, se ejecutará en una secuencia separada porque estará en un proceso separado. Sin embargo, el servicio seguirá ejecutándose en la cadena de eventos de ese otro proceso, por lo que aún necesita escribir el servicio en consecuencia (colocando el trabajo que consume mucho tiempo en un hilo de trabajo). –

+0

@Todd ¿Estás seguro de que se ejecutará en el hilo del evento? si hago un servicio con su propio 'android: process', y pongo' wait (5000) 'dentro del método' handleMessage() 'de su messenger, no bloqueará el subproceso de UI. Pero si elimino la declaración 'android: process', el comando wait bloquea el subproceso UI. – sydd

Cuestiones relacionadas