web-dev-qa-db-fra.com

Arrêter le service lors de la destruction de l'application

Je suis confus en ce moment à propos du concept de service de l'exécution et de l'arrêt:

ce que je veux faire:

  • Démarrer le service de localisation au tout début de l'application.

  • Continuez à recevoir les mises à jour de votre position et store leur préférence partagée

  • Arrêtez le service dans onDestroy of scope scope!

Jusqu'ici, j'ai cherché et étudié, nous ne pouvons faire les choses suivantes avec le service (corrigez-moi si je me trompe):

  • Arrêtez le service automatiquement en le liant à des activités/fragments/vues associés, lorsque tous les services détruits se dissocient automatiquement afin que nous puissions appeler la méthode stopself dans unbind

  • renvoyez START_NOT_STICKY dans onStartCommand pour dire au système d'exploitation, ne le recréez pas et créez un service local d'intention. Après l'achèvement de certains travaux, il se détruira lui-même.

  • Arrêter le service manuellement, en déclarant son intention dans une sorte de portée statique et en l'arrêtant le service sur onActivityDestroyed de la classe d'application [Je ne suis pas sûr de ce qui va se passer? , peut-être que le service détruira chaque fois qu'une activité sera détruite? ou il sera détruit uniquement lorsque l'application globale sera détruite?]

De toute façon, je suis un peu confus et battu, j'ai essayé d'ajuster mon Location service avec les détails donnés pendant 2 jours

8
Zulqurnain Jutt

Tout d’abord, lancez le "LocationService" au démarrage de votre application:

public class MyApp extends Application {

    private static final String TAG = "MyApp";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "App started up");
        startService(new Intent(this, MyLocationService.class));
    }
}

Deuxièmement: Comme vous l'avez dit, le service devrait mieux fonctionner avec l'indicateur "START_NOT_STICKY" 

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_NOT_STICKY;
    }

Trid:

Une fois que le système aura tué votre application, le service sera automatiquement tué, donc aucun problème.

Il n'y a pas de méthode onDestroy() sur l'objet Application, le seul événement similaire est onTerminated() et il n'est pas lancé sur les périphériques de production.

à la fin

Ajouté dans l'API niveau 1 void onTerminate () Cette méthode est destinée à être utilisée dans environnements de processus émulés. Il ne sera jamais fait appel à une production Appareil Android, où les processus sont supprimés simplement en les tuant; non le code utilisateur (y compris ce rappel) est exécuté en même temps.

Plus d'informations: https://developer.Android.com/reference/Android/app/Application.html#onTerminate ()

Au fait, si vous voulez que MyLocationService envoie des mises à jour de l'emplacement à votre application (lorsqu'elle est ouverte), vous devriez envisager d'utiliser Otto ou EventBus (je vous recommande ce dernier en raison de la simplicité d'utilisation). Vous pouvez même configurer @Suscriber pour recevoir les mises à jour d'anciens emplacements récupérés si vous le souhaitez.

2
zapotec

Si vous démarrez votre service à l'aide de START_NOT_STICKY, votre application supprimera votre service une fois que votre application entière sera fermée en arrière-plan, c'est-à-dire que vous aurez nettoyé votre application à partir de l'écran d'accueil.

Ici, START_NOT_STICKY indique que vous n'avez pas besoin de recréer le service au cas où il aurait été tué.

Si ce n'est pas le cas, vous devez le tuer manuellement. 

Comme

Intent lintent = new Intent(context, LocationService.class);
context.stopService(lintent);

Vous pouvez utiliser ce code au moment où votre application tue.

C'est tout. Vous êtes bon pour aller avec cela.

2
AndroidHacker

Le moyen le plus simple est tout d’abord de démarrer IntentService avec AlarmManager après un certain temps de répétition (10 minutes), puis dans onHandleIntent (), obtenez Emplacement et enregistrez la préférence.

Pas besoin d'être lié à votre activité, IntentService s'arrête automatiquement après avoir été enregistré dans les préférences.

0
pavan kvch

Je vais essayer d’expliquer le plus simplement possible:) Il existe deux types de service IntentService et ServiceIntentService lorsqu’il est démarré, il se tue une fois traité. le contenu de celle-ci onHandleIntent methodas pour Service et celle-ci ne se terminera pas tant que vous ne lui aurez pas donné la commande, même si vous la démarrez à l'aide du contexte d'une activité. Il s’arrêtera également lorsque l’application est arrêtée dans des cas extrêmes (par système (Paramètres/application/VotreApp/application arrêt OR un blocage d’application)

0
thunder413