2
votes

Existe-t-il un moyen d'exécuter le service en continu?

Il y a quelques questions similaires à celle-ci sur Stack Overflow, mais aucune des solutions ne fonctionne pour moi

​​Le problème est avec seulement quelques appareils comme OnePlus et MI, le service est tué dès que l'utilisateur fait glisser l'application depuis une application récente.

J'ai lu que ces OEM utilisent des stratégies agressives pour tuer les services. Je veux juste savoir s'il existe un moyen de maintenir le service en marche ou de le démarrer dès qu'il est tué.

J'ai besoin d'exécuter un service qui donnera l'emplacement en continu (24/7) en arrière-plan (Ce l'application est réservée à des personnes spécifiques, ne vous inquiétez donc pas de l'autonomie de la batterie).

J'ai essayé:

  1. exécution du service de premier plan.

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

    Également en service la méthode onCreate a commencé avec la notification

    @Override
    public void onCreate() {
        Log.i("Service", "onCreate");
        startForeground(NOTIFICATION_ID, getnotification());
    }
    
  2. renvoyant START_STICKY dans onStartCommand

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundService(intent)
        } else {
                startService(intent)
        }
    
  3. relance le service dans onDestroy et onTaskRemoved mais ils ne sont pas appelés.

  4. liaison d'un service

  5. planifier le gestionnaire d'alarme et démarrer le service fréquemment, mais le Play Store avertira que notre application utilise le gestionnaire d'alarme trop fréquemment et que c'est une mauvaise pratique. Et il est maintenant possible d'utiliser workmanager pour planifier moins de 15 minutes et il n'est toujours pas garanti de démarrer après 15 minutes.

Y a-t-il donc un moyen de continuer à exécuter un service autre que les options ci-dessus?


11 commentaires

stackoverflow.com/questions/51289236/…


J'ai commencé avec la notification mais ça continue d'être tué.


stackoverflow.com/a/43719950/7666442


@NileshRathod a essayé cela aussi mais onDestroy n'est pas appelé.


Bonjour, essayez de renvoyer START_NOT_STICKY au lieu de START_STICKY dans la méthode onStartCommand de votre classe de serveur. start not sticky forcera à redémarrer le service après l'application kill


@Navin son opposé stackoverflow.com/a/33969065/6478047


https: // stackoverflow .com / questions / 53131441 / un-premier plan-se‌ rvice-obtient-tué-et-une-notification-obtient-‌ supprimé-quand-l'application-est-‌ glisser et https://stackoverflow.com/questions/53084293/android-kills-b‌ ackground-services -i‌ n-xiaomi-huawei-etc .


@ManoharReddy - Brother avez-vous trouvé la solution pour garder le service en vie 24/7. Si oui, aidez-moi.


@IrfanAkram ouvrez dontkillmyapp.com cliquez sur le fournisseur qui vous pose le plus de problèmes. En bas, il y aura "Solution pour les développeurs". Suivez les instructions et espérez le meilleur


Je l'ai parcouru mais il existe différentes solutions pour différents fournisseurs, il n'y a pas non plus de solution pour la plupart des fournisseurs. Je souhaite une solution générale concernant tous les vendeurs. Si vous connaissez une autre manière, alors s'il vous plaît. Ce serait d'une grande aide.


@IrfanAkram J'ai peur qu'il n'y ait pas de solution commune, essayez d'exclure votre application de l'optimisation de la batterie, cela semble aider peu de gens


3 Réponses :


1
votes

Voici quelques éléments qui n'ont guère aidé.

Dans AndroidManifest.xml, ajoutez la ligne android:enabled="true"

@Override
public void onTaskRemoved(Intent rootIntent) {
    initAlarm();
    super.onTaskRemoved(rootIntent);
}

   private void initAlarm() {
    AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, StartServiceReceiver.class);
    PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

    alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
            SystemClock.elapsedRealtime() +
                    2000, alarmIntent);

}

À l'intérieur service Ajoutez une alarme pour vous réveiller après 2 secondes.

<service
      android:name=".service.TrackingService"
      android:exported="false"
      android:enabled="true"
    />

Créez un récepteur StartServiceReceiver et dans celui-ci, redémarrez simplement le service.

Pour les appareils Mi, nous devons autoriser une autorisation à l'intérieur du paramètre pour permettre au service de démarrer en arrière-plan


1 commentaires

Comment démarrer ce service de premier plan lors du redémarrage de l'appareil



5
votes

Si vous passez par LE LIEN , vous trouverez:

Malheureusement, certains appareils implémentent la suppression de l'application à partir du menu récent comme un arrêt forcé. Stock Android ne fait pas cela. Lorsqu'une application est arrêtée de force, elle ne peut pas exécuter de tâches, recevoir des alarmes ou des émissions, etc. Donc, malheureusement, il est impossible pour nous de le résoudre - le problème réside dans le système d'exploitation et il n'y a pas de solution de contournement.

C'est un problème connu. Pour économiser la batterie, de nombreux fabricants forcent la fermeture de l'application, annulant ainsi toutes les tâches périodiques, les alarmes et les récepteurs de diffusion, etc. Les principaux fabricants sont OnePlus (vous avez la possibilité de toogle), Redmi, Vivo, Oppo, Huwaei.

Chacun de ces appareils possède des gestionnaires d'optimisation de type AutoStartManagers / AutoLaunch / StartManager. Ce qui empêche les activités d'arrière-plan de recommencer. Vous devrez demander manuellement à l'utilisateur de mettre votre application en liste blanche, afin que l'application puisse démarrer automatiquement son processus d'arrière-plan. Suivez CECI et CECI , pour plus d'informations.

Les méthodes à ajouter à la liste blanche pour les différents fabricants sont fournies dans cette réponse Stack Overflow . Même après l'ajout à la liste blanche, votre application peut ne pas fonctionner à cause du mode DOZE, pour cela vous devrez ignorer les otimisations de batterie

Également au cas où vous vous poseriez la question, des applications comme Gmail / Hangout / WhatsApp / Slack / LinkedIn etc. sont déjà sur la liste blanche par ces gestionnaires de démarrage automatique. Par conséquent, il n'y a aucun effet sur leurs processus d'arrière-plan. Vous recevez toujours des mises à jour et des notifications en temps opportun.


1 commentaires

dontkillmyapp.com contient les instructions les plus récentes pour chaque appareil individuel



0
votes

La bonne façon d'écouter la localisation en arrière-plan pour utiliser une API de localisation fusionnée à partir des services de jeu.

Regardez les exemples ici. https://github.com/googlesamples/android-play-location?files= 1

Ces API sont écoénergétiques, et je le recommande également.


1 commentaires

Veuillez décrire comment cela aide avec le sujet "Existe-t-il un moyen d'exécuter le service en continu?"