Mit Hintergrund meine ich, dass keine der Aktivitäten der Anwendung derzeit für den Benutzer sichtbar sind?
Antworten
Zu viele Anzeigen?Ich empfehle, diese Seite durchzulesen: http://developer.Android.com/reference/Android/app/Activity.html
Kurz gesagt, Ihre Aktivität ist nicht mehr sichtbar, nachdem onStop()
aufgerufen wurde.
Da es noch nicht erwähnt wurde, schlage ich den Lesern vor, Folgendes zu erkunden ProcessLifecycleOwner erhältlich über Komponenten der Android-Architektur
Meiner Meinung nach führen viele Antworten eine große Menge an Code ein und bringen eine Menge Komplexität und Unlesbarkeit mit sich.
Wenn Menschen in SO fragen, wie sie zwischen einem Service
y un Activity
rate ich in der Regel zur Verwendung der LocalBroadcastManager .
Warum?
Nun, indem ich die Dokumente zitiere:
Sie wissen, dass die Daten, die Sie übertragen, Ihre App nicht verlassen, und müssen sich keine Sorgen machen, dass private Daten nach außen dringen.
Es ist nicht möglich, dass andere Anwendungen diese Übertragungen an Ihre Anwendung senden, so dass Sie sich keine Sorgen machen müssen, dass sie Sicherheitslücken ausnutzen können.
Dies ist effizienter als das Senden eines globalen Rundrufs durch das System.
Das steht nicht in den Unterlagen:
- Es benötigt keine externen Bibliotheken
- Der Code ist minimal
- Es ist schnell zu implementieren und zu verstehen
- Keine benutzerdefinierten selbst-implementierten Rückrufe / Ultra-Singleton / Intra-Prozess Muster, was auch immer...
- Keine starken Referenzen en
Activity
,Application
, ...
Beschreibung
Sie möchten also überprüfen, ob eine der Activity
steht derzeit im Vordergrund. Normalerweise tun Sie das in einer Service
oder Ihr Application
Klasse.
Dies bedeutet, dass Ihr Activity
Objekte werden zum Absender eines Signals (ich bin an / ich bin aus). Ihr Service
wird hingegen zum Receiver
.
Es gibt zwei Momente, in denen Ihr Activity
sagt Ihnen, ob es in den Vordergrund oder in den Hintergrund geht (ja, nur zwei... nicht 6).
Wenn die Activity
in den Vordergrund tritt, wird die onResume()
Methode ausgelöst wird (auch aufgerufen nach onCreate()
).
Wenn die Activity
geht nach hinten, onPause()
genannt wird.
Dies sind die Momente, in denen Ihr Activity
sollte das Signal an Ihre Service
um seinen Zustand zu beschreiben.
Im Falle von mehreren Activity
erinnern Sie sich an den an Activity
geht zuerst in den Hintergrund, dann kommt ein anderer in den Vordergrund.
Die Situation wäre also wie folgt:*
Activity1 -- send --> Signal:OFF
Activity2 -- send --> Signal:ON
En Service
/ Application
wird einfach weiter auf diese Signale achten und entsprechend handeln.
Code (TLDR)
Ihr Service
muss eine BroadcastReceiver
um nach Signalen zu lauschen.
this.localBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// received data if Activity is on / off
}
}
public static final IntentFilter SIGNAL_FILTER = new IntentFilter("com.you.yourapp.MY_SIGNAL")
Registrieren Sie die Receiver
en Service::onCreate()
@Override
protected void onCreate() {
LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(this.localBroadcastReceiver, SIGNAL_FILTER);
}
Deregistrieren Sie es in Service::onDestroy()
@Override
protected void onDestroy() {
// I'm dead, no need to listen to anything anymore.
LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(this.localBroadcastReceiver);
}
Jetzt ist Ihr Activity
müssen ihren Zustand mitteilen.
En Activity::onResume()
Intent intent = new Intent();
intent.setAction(SomeActivity.SIGNAL_FILTER); // put ON boolean in intent
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
En Activity::onPause()
Intent intent = new Intent();
intent.setAction(SomeActivity.SIGNAL_FILTER); // put OFF boolean in intent
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
Eine sehr, sehr häufige Situation
Entwickler: Ich möchte Daten von meinem
Service
und aktualisieren Sie dieActivity
. Wie prüfe ich, ob dieActivity
im Vordergrund steht?
In der Regel ist es nicht notwendig zu prüfen, ob die Activity
im Vordergrund steht oder nicht. Senden Sie die Daten einfach über LocalBroadcastManager
von Ihrem Service
. Wenn die Activity
eingeschaltet ist, dann wird es reagieren und handeln.
Für diese sehr häufige Situation ist die Service
wird der Absender, und die Activity
implementiert die BroadcastReceiver
.
Also, erstellen Sie eine Receiver
in Ihrem Activity
. Registrieren Sie es in onResume()
und heben Sie die Registrierung in onPause()
. Es besteht keine Notwendigkeit, die anderen Lebenszyklusmethoden anzuwenden .
Definieren Sie die Receiver
Verhalten in onReceive()
(ListView aktualisieren, dies tun, das tun, ...).
Auf diese Weise wird die Activity
hört nur zu, wenn es im Vordergrund ist, und es passiert nichts, wenn es im Hintergrund ist oder zerstört wird.
Im Falle von mehreren Activity
je nach dem Activity
eingeschaltet ist, antworten (wenn sie auch die Receiver
).
Wenn alle im Hintergrund sind, antwortet niemand und das Signal geht einfach verloren.
Senden Sie die Daten aus dem Service
vía Intent
(siehe Code oben) durch Angabe der Signal-ID.
- Außer bei Multi-Window-Unterstützung . Es könnte knifflig sein (bitte testen Sie es bei Bedarf)...
fun isAppInForeground(): Boolean {
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager ?: return false
val appProcesses = activityManager.runningAppProcesses ?: return false
val packageName = packageName
for (appProcess in appProcesses) {
if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName == packageName) {
return true
}
}
return false
}