Z dokumentu na temat Androida tutaj http://developer.android.com/reference/android/app/Activity.html , powiedział, że „Aktywność jest na pierwszym planie” onPause()
, a „Aktywność nie jest już widoczna” onStop()
.
Czy „Aktywność pojawia się na pierwszym planie” nie jest tym samym, co „Aktywność nie jest już widoczna”? Czy możesz mi powiedzieć, jaka jest różnica między nimi?
paused
działanie jest całkowicie żywe (zachowuje wszystkie informacje o stanie i członkach oraz pozostaje połączone z menedżerem okien).stopped
Aktywność zachowuje również wszelkie informacje o stanie i członek, ale nie jest już przywiązany dowindow manager
.Odpowiedzi:
Nie, jeśli jakaś aktywność pojawia się na pierwszym planie, nie musi to oznaczać, że druga aktywność jest całkowicie niewidoczna. Rozważ następujący przypadek:
Tutaj widzimy obie czynności w tym samym czasie. Pierwsze działanie z polami jest zasłonięte przez inne działanie i użytkownik nie może już z nim wchodzić. Jednak jest nadal widoczny ze wszystkimi wynikającymi z tego konsekwencjami.
Pozostaje pytanie, które działanie jest uważane za całkowicie nieprzezroczyste i obejmujące cały ekran, a które nie. Ta decyzja jest podejmowana na podstawie okna zawierającego czynność. Jeśli okno ma flagę
windowIsFloating
lubwindowIsTranslucent
, wówczas uważa się, że działanie nie sprawia, że element bazowy jest niewidoczny, w przeciwnym razie ma i spowoduje wywołanieonStop()
. Odpowiedni kod można znaleźć wcom.android.server.am.ActivityRecord
:źródło
onPause()
aonStop()
. Czy to w 100%? Jeśli widoczny jest tylko jeden piksel z poprzedniej czynności, czy nadalonPause()
?onPause()
nie jest w ogóle wywoływane po wyświetleniu okna dialogowego.onPause()
jest wywoływana tylko wtedy, gdy naciskam przycisk home . Jak to jest możliwe?Jeśli nadal możesz zobaczyć jakąkolwiek jego część (
Activity
pojawiająca się na pierwszym planie albo nie zajmuje całego ekranu, albo jest nieco przezroczysta),onPause()
zostanie wywołany. Jeśli nie możesz zobaczyć żadnej jego części,onStop()
zostanie wezwany.Na przykład okno dialogowe ** może nie obejmować całego poprzedniego
Activity
i byłby to czas naonPause()
wywołanie.** Nie mam tu na myśli okna dialogowego systemu Android, a raczej konceptualnego pomysłu na coś, co wyskakuje i zasłania tylko część ekranu użytkownika. Ta notatka została dodana w celu wyjaśnienia na podstawie komentarza @GMsoF poniżej
źródło
Dialog
, jak w klasie Androida. Jednak to, do czego zmierzałem, jest czymś, co częściowo przesłania pierwsze,Activity
co ilustruje ideę, że wszystkie noweActivity
nie muszą całkowicie zakrywać poprzedniego.Bycie na pierwszym planie oznacza, że działanie jest ukierunkowane na wkład. Na przykład działanie może być widoczne, ale częściowo zasłonięte przez okno dialogowe, na którym jest fokus. W takim przypadku
onPause()
zostanie wywołany, ale nieonStop()
. Kiedy okno dialogowe zniknie,onResume()
zostanie wywołana metoda działania (ale nieonStart()
).źródło
onPause()
jest wywoływany, gdy urządzenie zasypia lub pojawia się okno dialogowe” . Tak jak wyjaśnia ten wątek , dialog niekoniecznie oznacza, że czynność jest wstrzymana (chociaż byłoby to, powiedzmy, działanie pokazane jako okno dialogowe ).Praktycznie należy wziąć pod uwagę różnicę między „onPause ()” a „onPause () + onStop ()”.
Ilekroć pojawi się jakaś nowa aktywność i zajmie jakąś część ekranu. Więc Twoja wcześniejsza aktywność jest nadal do pewnego stopnia widoczna. W takim przypadku poprzednio uruchomione działanie nie jest wypychane do stosu wstecznego. Tak więc tutaj wywoływana jest tylko metoda onPause () .
Z drugiej strony, jeśli pojawi się nowa aktywność i zajmie ona cały ekran, tak że poprzednio uruchomiona aktywność zniknie. W takim przypadku Twoja poprzednio uruchomiona aktywność zostanie przeniesiona do Back Stack. Tutaj wywoływane są onPause () + onStop ().
Do streszczeń
onPause () - Ekran jest częściowo pokryty inną nową aktywnością. Aktywność nie jest przenoszona do stosu wstecznego.
onPause () + onStop () - Ekran jest w pełni pokryty inną nową aktywnością. Aktywność zostaje przeniesiona do stosu wstecznego.
Dowiedz się więcej o - Back Stack .
źródło
Krótko mówiąc:
onStop()
Metoda cyklu życia poprzedniej czynności jest wywoływana, gdy pokazywana jest inna czynność. Kiedy masz Dialog na szczycie aktywności,onPause()
jest wywoływany.Uwaga : Działania to te elementy, które wypełniają cały ekran.
Uwaga : dialogi nie są działaniami, ponieważ nie wypełniają całkowicie ekranu.
źródło
Napotkałem wiele problemów z metodami onPause i onStop i dlatego wyczyszczę trzy scenariusze, które napotkałem:
1. Po kliknięciu przycisku ostatniej aplikacji nie jest wywoływana żadna metoda cyklu życia, ale wywoływana jest metoda onWindowFocusChanged (boolean hasFocus) z wartością hasFocus przeszedł jako fałsz. W wersji Androida wcześniejszej niż 5, wywoływano metodę onPause po naciśnięciu przycisku ostatniej aplikacji.
2. Gdy pojawi się wyskakujące działanie podobne do działania, jak wspomniał Malcolm , zostanie wywołany przycisk onPause. W przypadku wywołania nowej czynności, która zajmuje cały ekran, przy poprzedniej czynności wywoływana jest funkcja onStop. Okno dialogowe uprawnień systemu Android powoduje również wywołanie funkcji onPause.
3.Jeśli ekran przekroczy limit czasu aktywności, zostanie wywołane onPause. Po pewnym czasie, jeśli nie otworzysz ekranu, zostanie wywołane onStop.
Również jedna ważna rzecz wymieniona przez ateiob, która uzupełnia odpowiedź
Mam nadzieję, że to pomoże.
źródło
za każdym razem, gdy rozpocznie się nowa AKTYWNOŚĆ, poprzednia czynność
onPause
zostanie wyzywająco wywołana w każdych okolicznościach.w rzeczywistości będą dwie okoliczności:
1- część poprzedniej czynności jest widoczna lub nowa aktywność jest przejrzysta: tylko
onPause
zostanie wywołana.2 - poprzednia aktywność jest całkowicie objęta nową aktywnością: zarówno
onPause
ionStop
będzie nazywana---- Dobrze jest podać kilka uwag:
UWAGA 1: jeśli okno dialogowe rozpocznie się nad działaniem, ŻADNE z
onPause
lubonStop
nie zostanie wywołane.UWAGA 2: jeśli jest to działanie, którego motywem przewodnim jest okno dialogowe, zachowanie będzie takie jak normalne działanie.
UWAGA 3: najwyraźniej okno dialogowe systemu, takie jak okno dialogowe uprawnień, ponieważ spowoduje to marshmallow
onPause
.źródło
Tak, staram się zrozumieć i mogę to wyjaśnić poniżej:
Istnieją 2 działania: Aktywność A i Aktywność B.
Oto aktywność B. Postępuj zgodnie z moim komentarzem w kodzie
Mam nadzieję, że to jasne
źródło