it-swarm.com.de

Android - Service, IntentService, JobIntentService - sie werden angehalten, wenn die App beendet wird

Ich habe hier in StackOverflow und im Web zu vielen gleichen Fragen gelesen, kann aber nicht so etwas konfigurieren wie "Dienst ohne Ende" oder Ausführen, selbst wenn die App von der Task entfernt wird (erzwungene Erzwingung). Ich frage mich nur, wie Dienste wie Viber oder WhatsUp funktionieren, denn wenn wir diese Anwendung erzwingen, können wir immer noch Nachrichten empfangen, wenn uns jemand schreibt (also läuft der Dienst noch). Ich kenne Vordergrunddienst, aber es ist keine Lösung, weil Benutzer die Benachrichtigung nicht sehen möchten. Also hier was ich versucht habe. : Dieser Code wird in Diensten ausgeführt, um Änderungen in Echtzeit zu erkennen, und er wollte nur, dass dies in jedem Zustand der App aktiv bleibt: Vordergrund, Hintergrund, Entfernt usw.

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

                    }

Ich verwende diesen Dienst, um Echtzeitdaten aus der Firestore-Datenbank zu erhalten, wenn sich in der Sammlung des Benutzers etwas ändert.

Die Möglichkeiten, die ich versuche, sind: 

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

Alles oben funktioniert einwandfrei, wenn sich die App im Vordergrund oder im Hintergrund befindet. Die Dienste werden jedoch beendet, wenn die Anwendung erzwungen wird (wenn sie von der Task entfernt wird).

Ich habe versucht, diese Änderungen im Manifest vorzunehmen: 

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

In der Anwendungshierarchie: 

Android:persistent="true"

In IntentService onHandleIntent: 

setIntentRedelivery(true)

Im Einsatz bei StartCommand: 

return START_STICKY

Es wurde versucht, den Dienst neu zu starten, wenn das System ihn zerstört oder beendet: 

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

Aber nichts funktioniert OK ... Was ist die beste Lösung, um dies zu erreichen? Der Zweck ist also, etwas im Hintergrund auszuführen und Firestore Changes (oder etwas anderes) zuzuhören, auch wenn die App gestoppt oder von Aufgaben wie Viber usw. entfernt wurde. Vielleicht verwenden sie den Vordergrunddienst ohne Benachrichtigungssymbol? Aber ich glaube nicht, dass Android diese Art von Vordergrunddienst (ohne Benachrichtigung) zulässt.

Ich habe einige Artikel über WorkManager gelesen und wie Google sagt: 

Hinweis: WorkManager ist für Aufgaben gedacht, für die die Garantie besteht, dass Das System führt sie auch dann aus, wenn die App beendet wird, z. B. das Hochladen der App Daten an einen Server. Es ist nicht für In-Process-Hintergrundarbeit gedacht das kann sicher beendet werden, wenn der App-Prozess wegfällt; zum In solchen Situationen empfehlen wir die Verwendung von ThreadPools.

Aber ich kann nicht herausfinden, wie es genau funktioniert oder wie ich es für meine Zwecke benutze

Vielen Dank

6
EAK TEAM

Sie können die FCM-Push-Benachrichtigung verwenden, um das Gerät zu aktivieren, wenn Ihre App nicht aktiv ist/den Vordergrund ausführt. Wenn die App Push-Benachrichtigungen erhält, können Sie den Dienst starten, um die erforderlichen Aufgaben auszuführen. Möglicherweise können Sie den Dienst möglicherweise nicht starten, wenn sich die App im Hintergrund befindet. Dafür müssen Sie den Dienst möglicherweise als Vordergrunddienst ausführen. 

3
Ramesh Yankati

WorkManager ist jetzt die beste Lösung für Hintergrundwissen. Weil das Betriebssystem von Android jetzt einschränkender ist, was es erlaubt, über einen längeren Zeitraum im Hintergrund zu laufen. Aus der offiziellen Dokumentation ... wählt WorkManager eine geeignete Methode zum Planen einer Hintergrundaufgabe aus - abhängig von der Geräte-API-Ebene und den enthaltenen Abhängigkeiten verwendet WorkManager möglicherweise JobScheduler, Firebase JobDispatcher oder AlarmManager.

Android-Entwickler-Website ist ein guter Ort, um mit dem Lernen von WorkManager https://developer.Android.com/topic/libraries/architecture/workmanager/basics zu beginnen.

Für eine periodische Task, die fortlaufend mit einer Verzögerung zwischen den Dateien ausgeführt wird, können Sie eine PeriodicWorkRequest erstellen und in der WorkManager-Instanz . https://developer.Android.com/topic/libraries/architecture/workmanager/basics einreihen #wiederkehrend

Ein anderer älterer Weg ist nur der AlarmManager. Auf diese Weise müssen Sie nicht ständig einen Dienst im Hintergrund ausführen. Sie können einen sich wiederholenden Alarm einstellen und wenn er ausgelöst wird, können Sie einen Dienst starten und tun, was Sie benötigen.

1

In der Dokumentation des Android-Doze-Modus wird der Einsatz von FirebaseJobDispatcher festgelegt, der auch im Doze-Modus funktioniert. Dies funktioniert jedoch nur einmal alle 15 Minuten. Sie können WorkManager von Android Architecture-Komponenten verwenden, die FirebaseJobDispatcher, AlarmManager und JobScheduler auf entsprechenden unterstützten API-Ebenen verwenden können

0
swanand keskar

Sie haben erwähnt, dass Sie mit einer App vertraut sind, die das tut, was Sie brauchen. Überprüfen Sie die Manifestdatei der App mit https://play.google.com/store/apps/details?id=sk.styk.martin.apkanalyzer (oder eine ähnliche App) oder eine App umgestalten. Grüße.

0
displayName