Aus dem Android-Dokument hier http://developer.android.com/reference/android/app/Activity.html geht hervor , dass "Aktivität tritt in den Vordergrund" aufgerufen onPause()
wird und "Aktivität ist nicht mehr sichtbar" aufgerufen wird onStop()
.
Ist "Aktivität tritt nicht in den Vordergrund" nicht dasselbe wie "Aktivität ist nicht mehr sichtbar"? Können Sie mir bitte sagen, was der Unterschied zwischen ihnen ist?
paused
Aktivität vollständig aktiv (sie verwaltet alle Status- und Mitgliedsinformationen und bleibt mit dem Fenstermanager verbunden). Einestopped
Aktivität behält auch alle Status- und Mitgliedsinformationen bei, ist jedoch nicht mehr mit dem verbundenwindow manager
.Antworten:
Nein, wenn eine Aktivität in den Vordergrund tritt, bedeutet dies nicht unbedingt, dass die andere Aktivität vollständig unsichtbar ist. Betrachten Sie den folgenden Fall:
Hier sehen wir beide Aktivitäten gleichzeitig. Die erste Aktivität mit den Feldern wird durch eine andere Aktivität verdeckt, und der Benutzer kann nicht mehr mit ihr interagieren. Es ist jedoch immer noch mit allen daraus resultierenden Konsequenzen sichtbar.
Es bleibt die Frage, welche Aktivität als vollständig undurchsichtig angesehen wird und den gesamten Bildschirm abdeckt und welche nicht. Diese Entscheidung basiert auf dem Fenster, das die Aktivität enthält. Wenn das Fenster ein Flag
windowIsFloating
oder hatwindowIsTranslucent
, wird davon ausgegangen, dass die Aktivität das zugrunde liegende Material nicht unsichtbar macht, andernfalls wird und wirdonStop()
es aufgerufen. Den entsprechenden Code finden Sie incom.android.server.am.ActivityRecord
:quelle
onPause()
und zu entscheidenonStop()
. Ist es 100%? Wenn nur ein Pixel aus der vorherigen Aktivität sichtbar ist, ist es immer nochonPause()
?onPause()
wird überhaupt nicht aufgerufen, wenn ein Dialog angezeigt wird.onPause()
wird nur aufgerufen, wenn ich die Home- Taste drücke . Wie ist das möglich?Wenn Sie immer noch einen Teil davon sehen können (
Activity
der Vordergrund nimmt entweder nicht den gesamten Bildschirm ein oder ist etwas transparent),onPause()
wird aufgerufen. Wenn Sie keinen Teil davon sehen können,onStop()
wird aufgerufen.Ein Dialog ** zum Beispiel deckt möglicherweise nicht den gesamten vorherigen ab
Activity
, und dies wäre eine ZeitonPause()
, um aufgerufen zu werden.** Ich beziehe mich hier nicht auf einen Android-Dialog, sondern auf eine konzeptionelle Idee von etwas, das auftaucht und nur einen Teil des Benutzerbildschirms verdeckt. Dieser Hinweis wurde hinzugefügt, um dies anhand eines Kommentars von @GMsoF unten zu verdeutlichen
quelle
Dialog
, wie in der Android-Klasse. Was ich jedoch vorhatte, ist etwas, das das erste teilweise verdecktActivity
, um die Idee zu veranschaulichen, dass alle neuenActivity
nicht das vorherige vollständig verdecken müssen.Im Vordergrund zu stehen bedeutet, dass die Aktivität einen Eingabefokus hat. Beispielsweise kann eine Aktivität sichtbar sein, aber teilweise durch einen Dialog mit Fokus verdeckt werden. In diesem Fall
onPause()
wird aufgerufen, aber nichtonStop()
. Wenn der Dialog ausgeblendet wird, wird dieonResume()
Methode der Aktivität aufgerufen (aber nichtonStart()
).quelle
onPause()
Wird aufgerufen, wenn das Gerät in den Ruhezustand wechselt oder wenn ein Dialogfeld angezeigt wird" . Wie dieser Thread jedoch deutlich macht, bedeutet ein Dialog nicht unbedingt , dass eine Aktivität angehalten wird (obwohl dies beispielsweise für eine Aktivität gilt, die als Dialog angezeigt wird ).In der Praxis sollte man den Unterschied zwischen "onPause ()" und "onPause () + onStop ()" berücksichtigen.
Immer wenn eine neue Aktivität auftritt und einen Teil des Bildschirms einnimmt. Ihre zuvor ausgeführte Aktivität ist also bis zu einem gewissen Grad noch sichtbar. In diesem Fall wird die zuvor ausgeführte Aktivität nicht in den Back Stack verschoben. Hier wird also nur die Methode onPause () aufgerufen .
Auf der anderen Seite, wenn eine neue Aktivität auftritt und den Vollbildmodus einnimmt, sodass Ihre zuvor ausgeführte Aktivität verschwindet. In diesem Fall wird Ihre zuvor ausgeführte Aktivität in den Backstack verschoben. Hier werden onPause () + onStop () aufgerufen.
Zu Zusammenfassungen-
onPause () - Der Bildschirm wird teilweise von anderen neuen Aktivitäten abgedeckt. Die Aktivität wird nicht in den Backstack verschoben.
onPause () + onStop () - Der Bildschirm wird vollständig von anderen neuen Aktivitäten abgedeckt. Die Aktivität wird in den Backstack verschoben.
Erfahren Sie mehr über Back Stack .
quelle
In kurzen Worten:
onStop()
der Lebenszyklusmethode der vorherigen Aktivität wird aufgerufen, wenn eine andere Aktivität angezeigt wird. Wenn Sie Dialog oben in der Aktivität haben, wird dortonPause()
aufgerufen.Hinweis : Aktivitäten sind diejenigen Komponenten, die Ihren gesamten Bildschirm ausfüllen.
Hinweis : Dialoge sind keine Aktivität, da sie den Bildschirm nicht vollständig ausfüllen.
quelle
Ich hatte viele Probleme mit den Methoden onPause und onStop und werde daher drei Szenarien löschen, auf die ich gestoßen bin:
1. Wenn Sie auf die Schaltfläche für die letzte App klicken, wird keine Lebenszyklusmethode aufgerufen, sondern onWindowFocusChanged (boolean hasFocus) mit dem Wert hasFocus als falsch bestanden. In der Android-Version vor 5 wurde die onPause-Methode beim Drücken der letzten App-Schaltfläche aufgerufen.
2. Wenn über Ihrer Aktivität eine Popup-ähnliche Aktivität angezeigt wird , wie von Malcolm erwähnt , wird die Schaltfläche onPause aufgerufen. Wenn eine neue Aktivität aufgerufen wird, die den gesamten Bildschirm einnimmt, wird onStop für die vorherige Aktivität aufgerufen. Der Android- Berechtigungsdialog bewirkt auch, dass Ihre Aktivität onPause aufruft.
3.Wenn der Bildschirm für Ihre Aktivität eine Zeitüberschreitung aufweist, wird onPause aufgerufen. Wenn Sie den Bildschirm nach einiger Zeit nicht öffnen, wird onStop aufgerufen.
Auch eine wichtige Sache, die vom Ateiob erwähnt wird und die Antwort vervollständigt
Ich hoffe es hilft.
quelle
Wenn eine neue AKTIVITÄT beginnt, wird die vorherige Aktivität unter
onPause
keinen Umständen trotzig aufgerufen.tatsächlich wird es zwei Umstände geben:
1- Ein Teil der vorherigen Aktivität ist sichtbar oder die neue Aktivität ist transparent: Nur
onPause
wird aufgerufen.2- Die vorherige Aktivität wird vollständig durch eine neue Aktivität abgedeckt: beides
onPause
undonStop
wird aufgerufen---- Gut, um einige Notizen zu machen:
HINWEIS 1: Wenn ein Dialogfeld über einer Aktivität gestartet wird, wird KEINE von
onPause
oderonStop
aufgerufen.HINWEIS 2: Wenn es sich um eine Aktivität handelt, deren Thema auf einen Dialog festgelegt ist, entspricht das Verhalten einer normalen Aktivität.
HINWEIS 3: Anscheinend ein Systemdialog wie ein Berechtigungsdialog, da Marshmallow dies verursacht
onPause
.quelle
Ja, ich versuche zu verstehen und ich kann dies unten erklären:
Es gibt 2 Aktivitäten: AktivitätA & AktivitätB
Hier ist Aktivität B. Folgen Sie meinem Kommentar im Code
Ich hoffe das ist klar
quelle