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
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.
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.
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.
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)