2013-07-05 6 views
1

J'ai une question sur IntentService dans Android. Je définis mon propre service comme ci-dessous:Android Intent Service implémentant SensorEventListener

public class ABC étend IntentService implémente SensorEventListener {

@Override (d'intention Intent) de onHandleIntent protected void {}

@Override public void onSensorChanged (événement SensorEvent) {} }

Maintenant, si je démarre le service à partir d'une autre activité, onHandleIntent() est appelé. La documentation indique qu'il lance un thread de travail pour traiter la demande. Cependant, lorsque la méthode onSensorChanged() est invoquée, quel thread exécutera le code défini dans la méthode onSensorChanged(). Sera-ce le fil de travail ou le fil d'application principal ???

Répondre

3

Par le IntentService source code, les services IntentServices s'arrêtent lorsqu'ils n'ont plus de messages (appel stopSelf). Donc si vous voulez un long fonctionnement Service (ce que je suppose serait approprié pour votre SensorEventListener), alors vous devriez utiliser un Service régulier.

+0

Oui, je comprends cela. Ce que j'essaie de comprendre, c'est comment IntentService répond à la demande dans deux cas. onHandleIntent() et onSensorChanged(). onHandleIntent() lance un thread de travail et s'arrête tout seul à la fin. Qu'en est-il de onSensorChanged() ??? Quel thread est réellement appelé pour gérer cette requête? – pree

+0

@pree - une fois que le thread de travail a terminé la gestion de tous les messages, ** il arrête l'ensemble du service IntentService **, ce qui signifie qu'il n'y a rien à recevoir pour les événements modifiés par le capteur. Si vous utilisiez un 'Service' régulier (qui ne serait pas arrêté), alors onSensorChanged()', comme toutes les méthodes d'un 'Service', serait appelé sur le thread principal. – ianhanniballake

+0

Oui, j'ai compris. Il sera invoqué sur le thread principal. De plus, j'ai fait une petite expérience et j'ai appelé la méthode onHandleInvoked() en utilisant startService(). Il s'est arrêté après avoir terminé la demande. Puis j'ai touché le capteur pour invoquer la méthode onSensorChanged() et il a été invoqué sur le thread principal. Comment? Si l'ensemble du service s'est arrêté après avoir terminé la première demande, comment se fait-il qu'il ait pu détecter les changements de capteur ??? – pree