Ne Android Service exécuté à partir d'un thread séparé au lieu de l'INTERFACE utilisateur?
Je suis actuellement en utilisant un alarmmanager pour démarrer un service pour l'affichage de lieu de http. Le problème, c'est lorsque le gestionnaire de démarrage et d'exécuter les services, l'interface semble s'arrêter pour un moment. je voudrais vous demander si le thread de service est séparé de la thread de l'interface utilisateur?
- Vous probabily devrait se pencher sur la AsyncTask
- Réponse tardive :découvrez cet exemple code2concept.blogspot.dans/2015/02/...
- IntentService serait sans doute mieux dans ce cas que d'un Service.
Vous devez vous connecter pour publier un commentaire.
Copié À Partir D'Android Docs :
Présentation des Services de
Utilisation
IntentService
si vous ne voulez pas jouer avec la gestion des threads sur votre propre. Ou utiliserAsyncTasks
.Pour clarifier: Le thread principal de l'application n'est pas toujours le thread d'INTERFACE utilisateur.
Par exemple: Si une activité est à l'arrêt, le onStop() est appelée, d'où le thread d'INTERFACE utilisateur est pris à l'écart de cette activité et a déménagé à une autre activité au sein de la même ou une autre application.
Cependant, cela ne signifie pas que cette application n'est plus actif. En outre, si il y a (commencé) service en cours d'exécution en arrière-plan, elle peut se poursuivre pendant un certain temps, jusqu'à ce qu'elle se termine ou le système d'exploitation Android prend fin en raison du manque de ressources.
Qui dirige ce service pendant cette période? Qui déclenche la onStop() ou le onDestroy()? C'est le application du thread principal le faire.
Le thread d'INTERFACE utilisateur est une sorte de Singleton. Il peut être utilisé par une seule activité visible à la fois. L'application du thread principal est joint/joint pour le thread d'INTERFACE utilisateur ou d'une autre, on l'obtient. Toutefois, cela ne signifie pas que l'application n'a pas un thread principal de sa propre.
Ce comportement vient de la Linux\Unix fondation du Système Android. Ce que la plupart des développeurs ne sont pas conscients de: L'application est un "utilisateur" dans le Linux\système d'exploitation Unix.
Chaque fois qu'une application est invoquée, il est semblable à un utilisateur ouvrant une session dans le système. Dans l'application, l'id d'utilisateur est l'unique id de l'application, alors qu'aucun mot de passe n'est requis. Le nouveau connecté "utilisateur" (c'est à dire de l'application Android) est un processus et des ressources comme une instance de la Machine Virtuelle Java. Le processus est dédié à cet utilisateur et les ressources, y compris les fichiers système de quota, les descripteurs de fichier et les gestionnaires de lui permettre de communiquer avec le système d'exploitation.
L'application android du thread principal est la racine de fil qui est créé à partir du processus de l'OS Android de mains au cours de cette demande. Tout les nouveaux threads créés dans cette application va toujours revenir au thread principal.
L'une des ressources du système principal de l'application thread peut accéder à, est le thread de l'INTERFACE utilisateur. Donc, l'application pouvez demander le thread principal, toutefois, la demande peut être refusé ou accordé). Un exemple: Dans le cas où le processus de demande excède il est permis d'allocation de mémoire de la taille, de l'OS Android peut décider de refuser l'accès au thread de l'INTERFACE utilisateur et même de destruction de la demande et de mettre fin au processus.
Il est possible de définir plus que sur les processus d'une application (processus Unix fourche) par définition dans l'AndroidManifest.xml. Cependant, gardez à l'esprit, que les ressources affectées à chaque processus sera différent, c'est à dire chaque processus a sa propre machine virtuelle, donc des objets maintenue dans les différents processus ne seront pas en mesure de partager des informations via le même segment de la JVM.
À partir de l'android developer:
Qu'est ce qu'un Service?
Plus de confusion à propos de la classe de Service fait tourne autour de ce qu'il n'est pas:
Un Service n'est pas un processus distinct. Le Service de l'objet lui-même n'implique pas qu'il s'exécute dans son propre processus; à moins d'indication contraire, il s'exécute dans le même processus que l'application, il est une partie de.
Un Service n'est pas un thread. Il n'est pas un moyen de faire travailler le thread principal (pour éviter que l'Application ne Répond Pas des erreurs).
Ainsi, un Service lui-même est en fait très simple, en fournissant deux caractéristiques principales:
D'une installation de l'application pour indiquer au système à propos de quelque chose qu'il veut faire dans l'arrière-plan (même lorsque l'utilisateur n'est pas directement en interaction avec l'application). Cela correspond à des appels d'Contexte.startService(), qui demande au système d'horaire de travail pour le service, pour être exécuté jusqu'à ce que le service ou quelqu'un d'autre explicitement l'arrêter.
Une installation pour une application à exposer quelques unes de ses fonctionnalités à d'autres applications. Cela correspond à des appels d'Contexte.bindService(), qui permet de longue date, d'une connexion pour le service dans le but d'interagir avec elle.
Lorsqu'un composant de Service est en fait créé, pour ces raisons, tout ce que le système n'est instancier le composant et appeler sa onCreate() et d'autres rappels sur le thread principal. C'est le Service pour mettre en œuvre ces avec le comportement approprié, comme la création d'un thread secondaire dans laquelle il fait son travail.
Noter que parce que le Service lui-même est si simple, vous pouvez faire de votre interaction avec d'aussi simple ou complexe que vous le souhaitez: à partir de la traiter comme un objet Java qui vous rendre directement les appels de méthode sur (comme illustré par les Services Locaux de l'Échantillon), à fournir une pleine remoteable interface à l'aide de AIDL.