Ich möchte eine Anwendung, die im Hintergrund ausgeführt wird und weiß, wann eine der integrierten Anwendungen (Messaging, Kontakte usw.) ausgeführt wird.
Meine Fragen sind also:
Wie soll ich meine Anwendung im Hintergrund ausführen?
Wie meine Hintergrundanwendung wissen kann, welche Anwendung derzeit im Vordergrund ausgeführt wird.
Antworten von Leuten mit Erfahrung wären sehr dankbar.
Antworten:
In Bezug auf "2. Wie meine Hintergrundanwendung wissen kann, welche Anwendung derzeit im Vordergrund ausgeführt wird."
Verwenden Sie die
getRunningAppProcesses()
Methode NICHT , da dies meiner Erfahrung nach alle Arten von Systemabfällen zurückgibt und Sie mehrere Ergebnisse erhalten, die habenRunningAppProcessInfo.IMPORTANCE_FOREGROUND
. Verwenden SiegetRunningTasks()
stattdessenDies ist der Code, den ich in meinem Dienst verwende, um die aktuelle Vordergrundanwendung zu identifizieren. Es ist wirklich einfach:
Das ist es, dann können Sie einfach auf Details der Vordergrund-App / Aktivität zugreifen:
Dies erfordert eine zusätzliche Erlaubnis im Aktivitätsmenifest und funktioniert einwandfrei.
quelle
getRunningTasks()
ist in API 21 (Lollipop) - developer.android.com/reference/android/app/…Ich musste auf die harte Tour die richtige Lösung finden. Der folgende Code ist Teil von Cyanogenmod7 (die Tablet-Optimierungen) und wird auf Android 2.3.3 / Lebkuchen getestet.
Methoden:
Dies beantwortet dieses Problem hoffentlich in vollem Umfang (:
quelle
mActivityManager.getRunningTasks(1).get(0).topActivity
?Versuchen Sie den folgenden Code:
Prozessname ist der Paketname der App, die im Vordergrund ausgeführt wird. Vergleichen Sie es mit dem Paketnamen Ihrer Anwendung. Wenn es dasselbe ist, wird Ihre Anwendung im Vordergrund ausgeführt.
Ich hoffe das beantwortet deine Frage.
quelle
Ab Lutscher wurde dies geändert. Den folgenden Code finden Sie, bevor dieser Benutzer zu Einstellungen -> Sicherheit -> (Zum letzten Bildlauf scrollen) gehen muss. Apps mit Nutzungszugriff -> Geben Sie die Berechtigungen für unsere App
quelle
Für Fälle, in denen wir von unserem eigenen Service / Hintergrund-Thread aus prüfen müssen, ob unsere App im Vordergrund steht oder nicht. So habe ich es implementiert und es funktioniert gut für mich:
Um nun anhand anderer Klassen zu überprüfen, ob die App im Vordergrund steht oder nicht, rufen Sie einfach Folgendes auf:
Update (wie von SHS hervorgehoben ):
Vergessen Sie nicht, sich für die Rückrufe in der
onCreate
Methode Ihrer Anwendungsklasse zu registrieren .quelle
Um die Vordergrundanwendung zu bestimmen, können Sie zur Erkennung der Vordergrundanwendung https://github.com/ricvalerio/foregroundappchecker verwenden . Abhängig von der Android-Version des Geräts werden unterschiedliche Methoden verwendet.
Für den Service stellt das Repo auch den Code bereit, den Sie dafür benötigen. Lassen Sie Android Studio im Wesentlichen den Dienst für Sie erstellen und fügen Sie dann onCreate das Snippet hinzu, das den AppChecker verwendet. Sie müssen jedoch eine Erlaubnis anfordern.
quelle
Angesichts der Tatsache, dass dies
getRunningTasks()
veraltet undgetRunningAppProcesses()
nicht zuverlässig ist, habe ich beschlossen, zwei in StackOverflow erwähnte Ansätze zu kombinieren:quelle
Der ActivityManager Klasse ist das geeignete Tool, um festzustellen, welche Prozesse ausgeführt werden.
Um im Hintergrund ausgeführt zu werden, möchten Sie normalerweise einen Dienst verwenden .
quelle
Das hat bei mir funktioniert. Es wird jedoch nur der Name des Hauptmenüs angegeben. Wenn der Benutzer den Bildschirm Einstellungen -> Bluetooth -> Gerätename geöffnet hat, nennt RunningAppProcessInfo ihn nur als Einstellungen. Nicht in der Lage, weiter zu bohren
quelle
Mach so etwas:
quelle
In Lutscher und höher:
Zum Hauptfest hinzufügen:
Und mach so etwas:
quelle
So überprüfe ich, ob meine App im Vordergrund steht. Hinweis Ich verwende AsyncTask, wie in der offiziellen Android- Dokumentation vorgeschlagen. "
`
und führen Sie AsyncTask wie folgt aus.
new CheckIfForeground().execute();
quelle
Ich habe zwei Lösungen in einer Methode kombiniert und es funktioniert für mich für API 24 und für API 21. Andere habe ich nicht getestet.
Der Code in Kotlin:
und im Manifest
quelle