¿El servicio Android se ejecuta desde un hilo separado en lugar de la interfaz de usuario?

Actualmente estoy utilizando un alarmmanager para iniciar un servicio de publicación de ubicación en http. El problema es cuando el gerente comienza y ejecuta los servicios, el ui parece detenerse por un tiempo. Me gustaría preguntar si el hilo de servicio se separa del hilo ui?

Copiado de Documentos de Android:

Precaución: Un servicio se ejecuta en el subproceso principal de su proceso de alojamiento: el servicio no crea su propio subproceso y no se ejecuta en un proceso separado (a menos que se especifique lo contrario). Esto significa que, si su servicio va a hacer cualquier trabajo intensivo de la CPU o las operaciones de bloqueo (como la reproducción de MP3 o la creación de redes), debe crear un nuevo hilo en el servicio para hacer ese trabajo. Al utilizar un hilo independiente, reducirá el riesgo de errores de la aplicación no responde (ANR) y el subproceso principal de la aplicación puede permanecer dedicado a la interacción del usuario con sus actividades.

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

Utilice IntentService si no desea luchar con la gestión de los hilos por su cuenta. O utilice AsyncTasks.

Para aclarar: El subproceso principal de la aplicación no siempre es el subproceso de la interfaz de usuario. Por ejemplo: Si se detiene una actividad, se invoca onStop (), por lo que el subproceso de interfaz de usuario se quita de esa actividad y se mueve a otra actividad dentro de la misma o una aplicación diferente.

Sin embargo , no significa que esta aplicación ya no está activa. Además, si hay un servicio (iniciado) que se ejecuta en segundo plano, puede continuar durante un tiempo, hasta que termina o el sistema operativo Android lo termina debido a la falta de recursos.

¿Quién dirige este servicio durante ese tiempo? ¿Quién dispara el onStop () o el onDestroy ()? Es el hilo principal de la aplicación haciendo eso.

El hilo de interfaz de usuario es una clase de Singleton. Puede ser utilizado por una sola actividad visible a la vez. Ya sea el subproceso principal de la aplicación se une / se adjunta al subproceso UI u otro lo obtiene. Sin embargo esto no significa que la aplicación no tiene un hilo principal propio.

Este comportamiento proviene de la base Linux \ Unix del sistema Android. Lo que la mayoría de los desarrolladores no son conscientes de: La aplicación es un "usuario" dentro del sistema operativo Linux \ Unix.

Cada vez que se invoca una aplicación, es similar a un usuario que inicia sesión en el sistema. En el caso de la aplicación, el ID de usuario es el identificador de aplicación exclusivo, mientras que no se requiere ninguna contraseña. El nuevo "usuario" registrado (es decir, la aplicación Android) obtiene un proceso y recursos como una instancia de la Máquina Virtual Java. El proceso está dedicado a este usuario y los recursos, incluyendo la cuota del sistema de archivos, descriptores de archivos y manejadores, le permiten comunicarse con el sistema operativo.

El hilo principal de la aplicación de Android es el hilo raíz que se crea a partir del proceso que el sistema operativo Android entrega a esa aplicación. Cualquier nuevo subproceso creado en esta aplicación siempre volverá al subproceso principal.

Uno de los recursos del sistema a los que el subproceso principal de la aplicación puede acceder, es el subproceso de la interfaz de usuario. Por lo tanto la aplicación puede solicitar el hilo principal, sin embargo, la solicitud puede ser rechazada (o concedida). Un ejemplo: en caso de que el proceso de aplicación exceda el tamaño permitido de asignación de memoria, el sistema operativo Android puede decidir rechazar el acceso al subproceso de interfaz de usuario e incluso destruir la aplicación y finalizar el proceso.

Es posible definir más que el proceso de una aplicación (bifurcación de proceso Unix) a través de la definición en el AndroidManifest.xml. Sin embargo, tenga en cuenta que los recursos asignados a cada proceso serán diferentes, es decir, cada proceso tendrá su propia VM, por lo tanto los objetos mantenidos en los diferentes procesos no podrán compartir información a través del mismo montón JVM.

Del desarrollador android:

¿Qué es un Servicio?

La mayoría de la confusión acerca de la clase de servicio en realidad gira en torno a lo que no es:

Un servicio no es un proceso separado. El objeto Service en sí no implica que se ejecute 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 por sí mismo para hacer el trabajo fuera del hilo principal (para evitar la aplicación no responde errores). Por lo tanto, un servicio en sí es realmente muy simple, ofreciendo dos características principales:

Un recurso para que la aplicación le diga al sistema algo que quiere hacer en segundo plano (incluso cuando el usuario no está interactuando directamente con la aplicación). Esto corresponde a las llamadas a Context.startService (), que piden al sistema programar el trabajo para el servicio, para que se ejecute hasta que el servicio o alguien explícitamente detenerlo. Una instalación para una aplicación para exponer parte de su funcionalidad a otras aplicaciones. Esto corresponde a las llamadas a Context.bindService (), lo que permite una conexión de larga data para el servicio para interactuar con él. Cuando se crea realmente un componente de servicio, por cualquiera de estas razones, todo lo que realmente hace el sistema es instanciar el componente y llamar a su onCreate () y cualquier otra devolución de llamada apropiada en el subproceso principal. Corresponde al Servicio implementar estos con el comportamiento apropiado, como la creación de un hilo secundario en el que realiza su trabajo.

Tenga en cuenta que debido a que el servicio en sí es tan simple, puede hacer que su interacción con él sea tan simple o complicado como desee: desde tratarlo como un objeto Java local al que realice llamadas de método directo (como se ilustra en Local Service Sample) Una interfaz remota completa usando AIDL.

  • Detención de un subproceso dentro de un servicio
  • ¿Cómo usar SQLite de Servicios en Android?
  • Llamar stopSelf () en servicio mientras el subproceso está en ejecución
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.