Android Service S'Arrête Quand L'Application Est Fermée
Je suis en train de créer un service à partir de mon principal Android activité comme suit:
final Context context = base.getApplicationContext();
final Intent intent = new Intent(context, MyService.class);
startService(intent);
Quand je ferme la page d'activité, effectuez un balayage à partir de la récente liste des applications, le service s'arrête et redémarre après un certain temps. Je ne peux pas l'utilisation persistante des services, avec des notifications en raison de mes obligations pour l'application. Comment puis-je faire le service, PAS de redémarrage ou de l'arrêt et juste continuer à courir sur l'app sortie?
- double possible de Le processus du service est tué après l'application est supprimée de l'application du bac
- Le problème que je me pose, c'est que le service obtient redémarré lorsque l'activité de la ferme. Je suis à la recherche d'un moyen de garder ce service à tout moment (sans redémarrage de l'activité terminée).
- Je pense qu'on ne peut atteindre que. Sur de faibles ressources, votre service est d'être tué. Le mieux que nous pouvions espérer un redémarrage. Et sur 4.4+, balayez vers la tuer ne sera même pas redémarrer le service. Veuillez lire ce thread
- Réfléchissez bien sur si vous en avez vraiment besoin de votre service en cours d'exécution littéralement tout le temps: c'est mauvais pour la puissance et la consommation de mémoire.
Vous devez vous connecter pour publier un commentaire.
Je suis dans la même situation, jusqu'à présent, je l'ai appris quand l'application est fermée, le service fermé aussi parce qu'ils sont dans un thread, le service devrait être sur un autre thread afin de fot-il pas être fermé, regardez-vous et regardez en gardant le service vivant avec alarm manager ici un exemple http://www.vogella.com/articles/AndroidServices/article.html de cette façon, votre service ne sera pas indiqué dans la notification.
enfin, après toutes les recherches que j'ai fait, je suis en train de réaliser que le meilleur choix pour un long service en cours d'exécution est
startForeground()
, parce que c'est fait pour ça et le système de traite avec votre service de bien.notificationManager.notify(intent.getIntExtra("notification_Id", 0), builder.build());
dois-je utiliserstartForeground(intent.getIntExtra("notification_Id, 0), builder.build());
? Je suis en utilisant NotificationCompat.ConstructeurCette peut vous aider. Je me trompe peut-être mais il me semble que cela est lié avec le retour des
START_STICKY
dans votreonStartCommand()
méthode. Vous pouvez éviter le service d'être appelé à nouveau en retournantSTART_NOT_STICKY
à la place.vous rendre ce service dans votre Mainifest
ensuite, votre service doit s'exécuter sur d'autres processus nommé ServiceProcess
si vous voulez que votre service ne meurent jamais :
onStartCommand() retour START_STICKY
onDestroy() -> startself
créer un Daemon service
jin -> créer un Natif Démon processus, vous pouvez trouver certains projets open-source sur github
startForeground() , il existe un moyen de startForeground sans Notification ,google
Le Principal problème dans l'impossibilité de démarrer le service lors de l'application fermée,système d'exploitation android(Dans Certains OS) va tuer le service de l'Optimisation des Ressources, Si vous n'êtes pas en mesure de redémarrer le service, appeler une alarme mangeoire pour démarrer le reciver comme ça,Ici, c'est l'ensemble du code,Ce code va garder vivante ur de service.
Manifeste est,
Principale Activité de début de l'alarme de manger de cette façon,
cela appel reciver et reciver est,
Et ce Alaram reciver appelle une fois lors de l'application android est ouvert, et lorsque l'application est fermée.AINSI, le service est comme ça,
Services sont assez compliqué parfois.
Lorsque vous démarrez un service à partir d'une activité (ou de vos), le service est essentiellement le même processus.
citant les notes du développeur
Donc, ce que cela signifie, si l'utilisateur effectue l'application à l'écart de la récente tâches il va le supprimer de votre processus(cela comprend toutes vos activités, etc).
Maintenant, permet de prendre trois scénarios.
Première où le service n'a pas un premier plan de notification.
Dans ce cas le processus est tué sur votre service.
Deuxième où le service a un premier plan de notification
Dans ce cas, le service n'est pas tué et il n'est ni le processus
Troisième scénario
Si le service n'est pas un premier plan de notification, il peut encore continuer à fonctionner si l'application est fermée. Nous pouvons le faire en rendant le service exécuté dans un processus différent.
(Cependant, j'ai entendu certaines personnes disent qu'il peut ne pas fonctionner. à gauche de vous pour l'essayer vous-même)
vous pouvez créer un service dans un processus séparé en incluant l'attribut ci-dessous
dans votre manifeste.
android:process=":yourService"
ou
android:process="yourService" nom du processus doit commencer par des minuscules.
citant notes du développeur
c'est ce que j'ai compris, si quelqu'un est un expert, s'il vous plaît ne me corriger si je me trompe 🙂
essayer cela, elle permet de conserver le service en cours d'exécution en arrière-plan.
BackServices.class
dans votre MainActivity
onCreate
tomber cette ligne de codeMaintenant le service va continuer à s'exécuter en arrière-plan.
Meilleure solution est d'utiliser la synchronisation de l'Adaptateur dans android pour démarrer le service. Créer une Synchronisation Adaptateur et appel de service de démarrage de leur.. à l'intérieur de onPerformSync méthode. pour créer de synchronisation de Compte, veuillez consulter ce lien https://developer.android.com/training/sync-adapters/index.html
Pourquoi SyncAdapter? Réponse: Parce que plus tôt vous avez utilisé pour démarrer le service à l'aide de votre Application de contexte. donc à chaque fois que votre app processus de se faire tuer (Quand u le supprimer dans le gestionnaire des tâches ou des OS de la tuer à cause d'un manque de ressources ), à ce moment, votre service sera également supprimé. SyncAdapter ne fonctionne pas dans l'application thread.. donc si u appel à l'intérieur.. service ne sera plus enlevé.. à moins que u écrire du code pour l'enlever.
En utilisant le même processus pour le service et l'activité et START_STICKY ou START_REDELIVER_INTENT dans le service est le seul moyen d'être en mesure de redémarrer le service lors du redémarrage de l'application, ce qui se produit lorsque l'utilisateur ferme l'application, par exemple, mais aussi lorsque le système décide de le fermer pour des raisons d'optimisations. Vous ne POUVEZ PAS avoir un service qui va fonctionner en permanence sans aucune interruption. C'est par la conception, les smartphones ne sont pas fait pour fonctionner en continu des processus pour une longue période de temps. Cela est dû au fait que la durée de vie est la priorité la plus élevée. Vous devez concevoir votre service afin qu'il gère d'être arrêté à tout moment.
Vous devez ajouter ce code dans votre classe de Service pour qu'elle traite le cas où votre processus est tué
À partir d'Android O, vous ne pouvez pas utiliser les services pour l'exécution longue opérations d'arrière-plan pour cette raison, https://developer.android.com/about/versions/oreo/background . Jobservice sera la meilleure option avec Jobscheduler mise en œuvre.
Pourquoi ne pas utiliser un IntentService?
IntentService ouvre un nouveau Thread à part le Thread principal et il y travaille, de cette façon, la fermeture de l'application habitude effet il
Être informé que IntentService exécute le onHandleIntent() et quand c'est fait, le service ferme, voir si elle correspond à vos besoins.
http://developer.android.com/reference/android/app/IntentService.html
Le déclarer dans votre manifeste. Donner un nom personnalisé à votre processus et que le processus isolé et exportés .
De l'exécution d'une intention de services sera plus facile. Service dans la création d'un thread dans la demande, mais il est toujours dans l'application.
De substituer méthode onDestroy dans votre première activité visible comme après splash, vous avez la page d'accueil et tout en réorientant contre les éclaboussures de la page d'accueil vous avez déjà fini splash. mettez donc détruire en page d'accueil. et arrêter de service à la méthode.