IntentService sera tué après j'ai arrêter ma demande
Je me réfère à android considérations de conception: AsyncTask vs Service (IntentService?)
En fonction de la discussion, AsyncTask ne convient pas, car il est étroitement lié" à votre Activité
Donc, je lance un Thread
(je suppose que l'AsyncTask et du Fil appartiennent à la même catégorie), ont une infinité de course boucle et fait les essais suivants.
- Je quitter ma demande, en gardant en appuyant sur la touche programmable retour, jusqu'à ce que j'ai vu l'écran d'accueil. Fil est toujours en cours d'exécution.
- Je tuer ma demande, en allant à Gérer les applications -> App -> Forcer l'arrêt. Thread est arrêté.
Donc, je m'attendre après je change de Thread
à Service
, mon Service
gardera en vie, même après que j'ai quitter ou tuer mon application.
Intent intent = new Intent(this, SyncWithCloudService.class);
startService(intent);
public class SyncWithCloudService extends IntentService {
public SyncWithCloudService() {
super("SyncWithCloudService");
}
@Override
protected void onHandleIntent(Intent intent) {
int i = 0;
while (true) {
Log.i("CHEOK", "Service i is " + (i++));
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Log.i("CHEOK", "", ex);
}
}
}
}
//Doesn't matter whether I use "android:process" or not.
<service
android:name="com.xxx.xml.SyncWithCloudService"
android:process=".my_process" >
</service>
Cependant, mon constat est que,
- Je quitter ma demande, en gardant en appuyant sur la touche programmable retour, jusqu'à ce que j'ai vu l'écran d'accueil. Le Service est encore en cours d'exécution.
- Je tuer ma demande, en allant à Gérer les applications -> App -> Forcer l'arrêt. Le Service est arrêté.
Il semble que le comportement de Service
et Thread
sont les mêmes. Alors, pourquoi je devrais utiliser Service
au lieu de Thread
? Est-il quelque chose que j'avais oublié? Je pensais que mon Service
supposons que pour continuer à fonctionner, même après que j'ai tuer mon application?
OriginalL'auteur Cheok Yan Cheng | 2012-06-28
Vous devez vous connecter pour publier un commentaire.
Nope. Service s'arrête en cours d'exécution lorsque vous tuez votre application. Lorsque vous tuez votre demande tous les composants sont tués (activités, services, etc.).
En général, le comportement de Fil et le Service sont similaires. Toutefois, Si vous commencez à un Thread d'une Activité et ensuite l'arrêt de l'activité (c'est à dire: à la fermeture de votre application), éventuellement Android remarquerez que votre processus n'a pas de composants actifs (car Android ne reconnaît pas votre Thread comme une composante active) et il vient de tuer un processus, détruisant ainsi le fil.
Toutefois, si vous avez un Service en cours d'exécution, puis Android remarquerez que vous avez un service de courir et de ne pas le tuer si facilement. Cependant, il est toujours possible que Android va tuer votre processus de service si elle n'est pas "en cours d'utilisation".
Oui, votre fils se déroulera pendant une certaine période de temps jusqu'à ce que Android décide de tuer le processus. Il ne le fait pas tout de suite, il ne le si et quand elle se sent comme elle. Vous n'avez aucun contrôle sur le moment où le processus sera tué.
OK. Merci. Je vais tester à fonctionner pendant plusieurs heures et de voir comment il fonctionne. Pour le service, est Android "garantie" ne pas tuer? Comme j'ai une boucle de l'infini à l'intérieur (Pour les tests).
Non, comme je l'ai dit avant, Android va aussi tuer votre Service, si il pense qu'il n'est pas nécessaire, ou si d'autres applications ont besoin de la mémoire. Cependant, il va tuer des processus qui n'ont pas de services en cours d'exécution avant de tuer les processus qui n'ont au fonctionnement des services.
OriginalL'auteur
En fait, il existe différents types de services que vous pouvez mettre en œuvre. Utiliser un
Service
au lieu deIntentService
. Il vous avez besoin de regarderSTART_STICKY
,START_NOT_STICKY
etSTART_REDELIVER_INTENT
vous pouvez garder votre service en cours d'exécution en arrière-plan, même si votre activité meurt. Android servicesOriginalL'auteur
Vous utilisez
startService()
. LeService
sera exécuté jusqu'à ce que le code est fait, ou jusqu'à ce que Android décide qu'il doit être tué. De regarder sur liée services. Sur votreActivity.onDestroy()
vous devriez appelerunbindService()
.OriginalL'auteur
Dans votre IntentService vous pouvez remplacer onStartCommand() pour retourner START_REDELIVER_INTENT
Alors si tué, votre service sera redémarré automatiquement par le système après un certain temps avec la même Intention.
Veillez à appeler la super mise en œuvre sur onStartCommand() comme ceci:
OriginalL'auteur
Vous pouvez invoquer setIntentRedelivery(vrai) dans le constructeur de la
IntentService
OriginalL'auteur