2010-11-02 20 views
10

Una actividad puede usar el marco AsyncTask o Handler para el trabajo en segundo plano. Ambos continuarán funcionando incluso después de que el usuario se haya alejado de la actividad que los inició y se haya invocado el onDestroy para la actividad. En otras palabras, una actividad es completamente capaz de hacer un trabajo de fondo incluso después de que se haya apagado su GUI.¿Por qué utilizar el servicio para tareas en segundo plano?

En este escenario, el uso del servicio para el trabajo en segundo plano parece una redundancia. ¿Qué aporta el servicio a la mesa que una actividad no puede hacer? Gracias.

Respuesta

8

¿Qué es un servicio?

más confusión acerca de la clase de servicio en realidad gira en torno a lo que no es:

  • un servicio no es un proceso independiente. El objeto de servicio en sí no implica que se esté ejecutando en su propio proceso; a menos que se especifique lo contrario, se ejecuta en el mismo proceso que la aplicación de la que forma parte.
  • Un servicio no es un hilo. No es un medio para hacer el trabajo fuera del hilo principal (para evitar errores de la aplicación no responde).

así un servicio en sí es realmente muy simple, que proporciona dos características principales:

  • Una instalación para la aplicación para indicar al sistema de algo que quiere estar haciendo en el fondo (incluso cuando el usuario no está interactuando directamente con la aplicación). Esto corresponde a las llamadas a Context.startService(), que solicitan al sistema programar el trabajo para el servicio, que se ejecutará hasta que el servicio u otra persona lo detenga explícitamente.
  • Un recurso para una aplicación a expone parte de su funcionalidad a otras aplicaciones. Esto corresponde a las llamadas a Context.bindService(), que permite establecer una conexión de larga duración con el servicio para interactuar con él.

Read the rest of the documentation for more info

Así que una instancia de un servicio sería algo que desea que suceda a intervalos definidos por su cuenta sin tener que iniciar una actividad o cualquier otra cosa de "puesta en marcha" la misma. Por ejemplo, SMSBackup es solo un servicio que se ejecuta en segundo plano, sondeando cada X minutos sus mensajes SMS y los copia en una etiqueta de gmail, como un servicio de "respaldo".

+0

La exposición de la funcionalidad no visual a otras aplicaciones es un uso legítimo del Servicio. Esa no es la pregunta aquí. Sin embargo, el trabajo de fondo programado es un buen caso de uso que quizás se haga mejor desde un Servicio. – Raj

+0

¿@BryanDenny significa que tengo que iniciar un nuevo thrad dentro de mi clase de servicio para ejecutar una operación de red o base de datos? ¿derecho? puede ser como este 'de Tema = new Thread() { @ Override public void run() {try { while (true) {// funcionamiento de la red } } catch (InterruptedException e) {e .printStackTrace(); } } }; thread.start(); 'o utiliza AsyncTask? – AlexSanchez

+0

@BryanDenny [aquí está mi pregunta] (http://stackoverflow.com/q/14760507/1067450). algo de ayuda es bienvenida. – AlexSanchez

0

Cuando la IU mostrada por actividad va al fondo (presionando el botón de inicio), no se garantiza que la actividad exista durante mucho tiempo, el marco puede decidir detenerla.

+0

Supongo que tiene sentido que un servicio para el que stopService (y consecuentemente onDestroy) no ha sido llamado tenga una probabilidad mucho menor de ser asesinado que una actividad para la que se haya llamado a onDestroy. – Raj

0

AsyncTask le permite realizar fácilmente actualizaciones de UI y también separar claramente el hilo de la interfaz de usuario y la lógica del hilo de trabajo. Sin embargo, otras aplicaciones no podrán acceder a su AsyncTask. En ese caso, necesitas los servicios.

0

@BraynDenny respuesta es lo suficientemente bueno, me gustaría explicar en otra perspectiva.

En primer lugar se entendió mal el significado de tareas en segundo plano, definición de servicio dice servicio se ejecuta continuamente en segundo plano, incluso si la aplicación no está en primer plano, aquí el fondo término no significa hilo separado, significa que se ejecuta el servicio cuando se cerrar la aplicación a diferencia de actividad, también servicio se ejecuta en el hilo principal de forma predeterminada, si quieres un uso servicio asíncrono intentService

una actividad es totalmente capaz de hacer el trabajo de fondo, incluso después de su interfaz gráfica de usuario ha sido apagado .

Lo que dices es absolutamente incorrecto. Actividad, Servicio son componentes de Android, pero AsyncTasks o los hilos no son componentes cuando matas a una actividad que el AsyncTask en la actividad también se mató ya que se crea la instancia AsyncTask dentro de la clase de actividad, pero cuando se inicia la descarga de una archivo usando servicio de primer plano no se elimina incluso cuando cierra la aplicación, al igual que las aplicaciones de música en Android, incluso si cierra la aplicación la música todavía se reproduce en segundo plano, mostrando una notificación de primer plano

Hay tres diferentes tipos de servicios, para saber más sobre ellos, consulte este enlace https://developer.android.com/guide/components/services.html#CreatingBoundService

Cuestiones relacionadas