web-dev-qa-db-fra.com

Android - Service, IntentService, JobIntentService - ils sont arrêtés si l'application est tuée

J'ai lu beaucoup de questions identiques ici dans StackOverflow et dans le Web, mais je ne peux pas configurer quelque chose comme "un service sans fin" ou une exécution même lorsque l'application est supprimée de la tâche (force de destruction). Je me demande simplement comment fonctionnent des services comme Viber ou WhatsUp, car lorsque nous forçons les applications à être supprimées, nous sommes toujours en mesure de recevoir des messages lorsque quelqu'un nous écrit (le service fonctionne donc toujours). Je connais le service de premier plan, mais ce n’est pas une solution, car les utilisateurs ne veulent pas voir la notification. Alors voici ce que j'ai essayé. : Ce code dans l'exécution de services internes pour détecter les modifications en temps réel, et je voulais juste que cela reste actif dans toutes les conditions de l'application: Avant-plan, Arrière-plan, Supprimé, etc.

firestoreDb!!.collection("example").document("example").collection("real_time_request")
                    .addSnapshotListener { documentSnapshot: QuerySnapshot?, _: FirebaseFirestoreException? ->

                    }

J'utilise un service comme celui-ci pour obtenir des données en temps réel de la base de données Firestore lorsqu'un élément est modifié dans la collection de l'utilisateur.

Les moyens que j'essaie de services sont: 

FirestoreListeners : IntentService("Firestore Listeners")
FirestoreListeners : Service
FirestoreListeners : JobIntentService

Tout ce qui est présenté ci-dessus fonctionne correctement lorsque l'application est au premier plan ou à l'arrière-plan, mais les services sont supprimés après la fermeture forcée de l'application (une fois retirés de la tâche).

J'ai essayé d'apporter ces modifications au manifeste: 

Android:stopWithTask="false"
Android:directBootAware="true"
Android:process=":remote"

Dans la hiérarchie des applications: 

Android:persistent="true"

Dans IntentService onHandleIntent: 

setIntentRedelivery(true)

En service onStartCommand: 

return START_STICKY

J'ai essayé de redémarrer le service si le système le détruisait ou le tuait: 

override fun onTaskRemoved(rootIntent: Intent) {
        val restartServiceIntent = Intent(applicationContext, this::class.Java)
        restartServiceIntent.setPackage(packageName)
        val restartServicePendingIntent = PendingIntent.getService(applicationContext, 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT)
        val alarmService = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent)
        Log.e("Service Firestore ", "Task Removed")
        super.onTaskRemoved(rootIntent)
    }

Mais rien ne fonctionne correctement .. Quelle est la meilleure solution pour y parvenir? Donc, le but est que quelque chose soit exécuté en arrière-plan et à l'écoute des modifications Firestore (ou autre chose) même après la suppression ou la suppression de l'application, comme Viber, etc. Mais je ne pense pas qu'Android nous permette de faire ce genre de service de premier plan (sans notification)

J'ai lu des articles sur WorkManager et, comme le dit Google: 

Remarque: WorkManager est destiné aux tâches nécessitant la garantie que le système les exécutera même si l'application se ferme, comme pour télécharger l'application données sur un serveur. Il n'est pas destiné au travail de fond en cours cela peut être résilié en toute sécurité si le processus d'application disparaît; pour Dans de telles situations, nous vous recommandons d’utiliser ThreadPools.

Mais je ne peux pas comprendre comment c'est exactement le travail ou comment l'utiliser pour mes besoins

Merci

6
EAK TEAM

Vous pouvez utiliser la notification Push FCM pour réveiller l'appareil lorsque votre application n'est pas en cours d'exécution/au premier plan. Lorsque l'application reçoit des notifications Push, vous pouvez démarrer votre service pour effectuer la tâche requise. Là encore, il est possible que vous ne puissiez pas démarrer le service lorsque l'application est en arrière-plan. Pour cela, vous devrez peut-être exécuter le service en tant que service de premier plan. 

3
Ramesh Yankati

Dans la documentation du mode Android Doze, ils spécifient l'utilisation de FirebaseJobDispatcher qui fonctionnera même en mode Doze. mais cela ne fonctionnera qu'une fois toutes les 15 minutes . Vous pouvez utiliser les composants de WorkManager issus de l'architecture Android qui peuvent utiliser correctement FirebaseJobDispatcher, AlarmManager et JobScheduler aux niveaux d'API pris en charge correspondants

0
swanand keskar

Vous avez mentionné que vous connaissez une application qui répond à vos besoins. Vérifiez le fichier manifeste de l'application à l'aide de https://play.google.com/store/apps/details?id=sk.styk.martin.apkanalyzer (ou application similaire) ou refactor une application. Cordialement.

0
displayName