Cykl życia aktywności Androida-po co te wszystkie metody?

Jaki jest cykl życia aktywności Androida? Dlaczego tak wiele podobnych metod brzmi (onCreate(), onStart(), onResume()) wywoływane podczas inicjalizacji, a tak wiele innych (onPause(), onStop(), onDestroy()) dzwonili na koniec?

Kiedy te metody są wywoływane i jak należy je właściwie stosować?
Author: Peter Mortensen, 2011-12-15

8 answers

Zobacz też cykl życia aktywności (u programistów Androida).

Tutaj wpisz opis obrazka

OnCreate():

Wywołane, gdy aktywność jest tworzona po raz pierwszy. To jest miejsce, gdzie powinieneś zrobić wszystkie normalne ustawienia statyczne: tworzenie widoków, wiązanie danych z listami, itd. Ta metoda zapewnia również pakiet zawierający aktywność jest wcześniej zamrożona, jeśli taka była. Zawsze podążane przez onStart().

OnRestart():

Wywołane Po zatrzymaniu Twojej aktywności, przed jej rozpoczęciem jeszcze raz. Zawsze następuje OnStart ()

OnStart():

Wywołane, gdy aktywność staje się widoczna dla użytkownika. Następnie onResume (), jeśli działanie wychodzi na pierwszy plan, lub onStop (), jeśli staje się Ukryty.

OnResume():

Wywołane, gdy aktywność rozpocznie interakcję z użytkownikiem. W tym wskaż swoją aktywność na górze stosu aktywności, z użytkownikiem wejście do niego. Zawsze następuje onpause ().

OnPause ():

Wywoływane jako część cyklu życia aktywności, gdy aktywność jest w tle, ale nie został (jeszcze) zabity. Odpowiednik onresume (). Gdy działanie B zostanie uruchomione przed działaniem A, to wywołanie zwrotne zostanie wywołane Na A. B nie zostanie utworzony dopóki nie powróci funkcja onPause (), więc pamiętaj, aby nie zrób tu coś długiego.

OnStop():

Wywołane, gdy nie jesteś już widoczny dla użytkownika. Będziesz następny otrzymać albo onRestart (), onDestroy (), albo nic, w zależności od późniejsza aktywność użytkownika.

Zauważ, że ta metoda nigdy nie może być wywołana, w sytuacjach niskiej pamięci gdy system nie ma wystarczającej ilości pamięci, aby utrzymać aktywność proces uruchomiony po jego metodzie onPause () jest dzwoniłem.

OnDestroy():

Ostatnie połączenie, które otrzymujesz, zanim twoja aktywność zostanie zniszczona. To może się zdarzyć, ponieważ czynność się kończy (ktoś zwany finish() na nim, lub ponieważ system tymczasowo niszczy to wystąpienie działania, aby zaoszczędzić miejsce. Możesz rozróżnić> te dwa scenariusze za pomocą metody isFinishing ().

Gdy aktywność ładuje się po raz pierwszy zdarzenia są wywoływane jako poniżej:

onCreate()
onStart()
onResume()

Kiedy klikniesz przycisk telefonu aktywność przechodzi do tła i poniższe zdarzenia są wywoływane:

onPause()
onStop()

Zakończ dialer telefonu , a poniższe zdarzenia zostaną wywołane:

onRestart()
onStart()
onResume()

Po kliknięciu przycisku wstecz lub próbie Zakończ () zdarzenia są wywoływane jak poniżej:

onPause()
onStop()
onDestroy()

Stany Aktywności

System Operacyjny Android wykorzystuje kolejkę priorytetów, aby pomóc w zarządzaniu czynności uruchomione na urządzeniu. W zależności od stanu, w którym znajduje się dana aktywność na Androidzie, zostanie przypisany pewien priorytet w systemie operacyjnym. Ten system priorytetów pomaga Androidowi zidentyfikować działania, które nie są już używane, umożliwiając systemowi operacyjnemu odzyskiwanie pamięci i zasobów. Poniższy diagram ilustruje Stany, przez które może przejść dana aktywność w trakcie jej życia:

Stany te można podzielić na trzy główne grupy w następujący sposób:

Active or Running - działania są uważane za aktywne lub działające, jeśli znajdują się na pierwszym planie, znanym również jako górna część stosu aktywności. Jest to uważane za najwyższy priorytet aktywności w stosie aktywności na Androidzie i jako takie zostanie zabite przez system operacyjny tylko w ekstremalnych sytuacjach, na przykład, jeśli aktywność spróbuje użyć więcej pamięci niż jest dostępna na urządzeniu, ponieważ może to spowodować, że interfejs przestanie odpowiadać.

Paused - gdy urządzenie przechodzi w stan uśpienia lub aktywność jest nadal widoczna, ale częściowo ukryte przez nową, niepełną lub przezroczystą aktywność, aktywność jest uważana za wstrzymaną. Wstrzymane działania są nadal żywe, to znaczy zachowują wszystkie informacje o stanie i członkach i pozostają dołączone do menedżera okien. Jest to uważane za drugą aktywność o najwyższym priorytecie w stosie aktywności Androida i jako takie zostanie zabite tylko przez system operacyjny, jeśli zabicie tej aktywności spełni wymagania dotyczące zasobów potrzebne do utrzymania stabilnej aktywności aktywnej / uruchomionej oraz / align = "left" /

Zatrzymane - działania, które są całkowicie zasłonięte przez inną aktywność, są uważane za zatrzymane lub w tle. Zatrzymane działania nadal starają się zachować informacje o państwie i członkach tak długo, jak to możliwe, ale zatrzymane działania są uważane za najniższy priorytet z trzech stanów i jako takie OS najpierw zabije działania w tym stanie, aby spełnić wymagania dotyczące zasobów działań o wyższym priorytecie.

*Przykładowa aktywność do zrozumieć cykl życia* *

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
    String tag = "LifeCycleEvents";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       Log.d(tag, "In the onCreate() event");
    }
    public void onStart()
    {
       super.onStart();
       Log.d(tag, "In the onStart() event");
    }
    public void onRestart()
    {
       super.onRestart();
       Log.d(tag, "In the onRestart() event");
    }
    public void onResume()
    {
       super.onResume();
       Log.d(tag, "In the onResume() event");
    }
    public void onPause()
    {
       super.onPause();
       Log.d(tag, "In the onPause() event");
    }
    public void onStop()
    {
       super.onStop();
       Log.d(tag, "In the onStop() event");
    }
    public void onDestroy()
    {
       super.onDestroy();
       Log.d(tag, "In the onDestroy() event");
    }
}
 700
Author: Yaqub Ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-11 18:07:33

Całe zamieszanie jest spowodowane, ponieważ Google wybrał nieintuitywne nazwy zamiast czegoś w następujący sposób:

onCreateAndPrepareToDisplay()   [instead of onCreate() ]
onPrepareToDisplay()            [instead of onRestart() ]
onVisible()                     [instead of onStart() ]
onBeginInteraction()            [instead of onResume() ]
onPauseInteraction()            [instead of onPause() ]
onInvisible()                   [instead of onStop]
onDestroy()                     [no change] 

Diagram aktywności można interpretować jako:

Tutaj wpisz opis obrazka

 145
Author: Nilesh Pawar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-10 23:22:28

Aktywność ma sześć Stanów

  • Stworzony
  • rozpoczęte
  • Paused
  • zatrzymany
  • zniszczone

Cykl życia aktywności ma siedem metod

  • onCreate()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onRestart()
  • onDestroy()

cykl życia aktywności

Sytuacje

  • Po otwarciu aplikacji

    onCreate() --> onStart() -->  onResume()
    
  • Po naciśnięciu przycisku Wstecz i wyjściu z aplikacji

    onPaused() -- > onStop() --> onDestory()
    
  • Po naciśnięciu przycisku home

    onPaused() --> onStop()
    
  • Po naciśnięciu przycisku home, gdy ponownie otwórz aplikację z listy ostatnich zadań lub kliknij ikonę

    onRestart() --> onStart() --> onResume()
    
  • Po otwarciu aplikacji inna aplikacja z paska powiadomień lub otwórz Ustawienia

    onPaused() --> onStop()
    
  • Przycisk Wstecz naciśnięty z innej aplikacji lub ustawień, a następnie użyty, może zobaczyć naszą aplikację

    onRestart() --> onStart() --> onResume()
    
  • Kiedy dowolne okno dialogowe otwiera się na ekranie

    onPause()
    
  • Po zamknięciu okna dialogowego lub przycisku wstecz z okna dialogowego

    onResume()
    
  • Każdy telefon dzwoni i użytkownik w aplikacji

    onPause() --> onResume() 
    
  • Kiedy użytkownik nacisnął przycisk odpowiedzi telefonu

    onPause()
    
  • Po zakończeniu połączenia

    onResume()
    
  • Kiedy ekran telefonu jest wyłączony

    onPaused() --> onStop()
    
  • Kiedy ekran jest włączony z powrotem

    onRestart() --> onStart() --> onResume()
    
 137
Author: Arun Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-24 19:12:19

CYKL ŻYCIA ANDROIDA

Istnieje siedem metod, które zarządzają cyklem życia Androida zastosowanie:


Odpowiedz na jakie są te wszystkie metody za:

Weźmy prosty scenariusz, w którym wiedząc, w jakiej kolejności te metody są nazywane pomoże nam wyjaśnić, dlaczego są one używane.

  • Załóżmy, że używasz aplikacji kalkulatora. Trzy metody są wywoływane w sukcesja, aby uruchomić aplikację.

onCreate() - - - > onStart() - - - > onResume()

  • Kiedy używam aplikacji Kalkulator, nagle pojawia się połączenie. Aktywność kalkulatora idzie do tło i inna aktywność mówią. Radzenie sobie z wywołaniem wychodzi na pierwszy plan, a teraz dwie metody są powołani kolejno.

onPause() - - - > onStop()

  • teraz powiedz, że dokończę rozmowę przez telefon, Kalkulator aktywność wychodzi na pierwszy plan z tła, więc trzy metody są powoływani kolejno.

onRestart() - - - > onStart() - - - > onResume()

  • na koniec powiedzmy, że ukończyłem wszystkie zadania w aplikacji Kalkulator i chcesz zamknąć aplikację. Kolejne dwie metody są wywoływane kolejno.

onStop() - - - > onDestroy()


Istnieją cztery stany, które mogą istnieć:

  • Stan Początkowy
  • Stan Biegu
  • Paused State
  • zatrzymany stan

Stan początkowy:

Tworzenie nowego procesu Linuksa, przydzielanie nowej pamięci dla nowych obiektów interfejsu użytkownika i ustawianie całego ekranu. Więc większość pracy jest tu zaangażowana.

Stan BIEGU:

Jest to aktywność (stan), która jest obecnie na ekranie. Sam ten stan obsługuje takie rzeczy, jak pisanie na ekranie i dotykanie i klikanie przycisków.

Stan wstrzymany dotyczy:

Gdy działanie nie znajduje się na pierwszym planie, a zamiast tego jest w tle, wtedy działanie jest uważane za wstrzymane.

Stan zatrzymania:

Zatrzymana aktywność może być kupiona na pierwszym planie tylko przez ponowne jej uruchomienie, a także może zostać zniszczona w dowolnym momencie.

Menedżer aktywności obsługuje wszystkie te stany w taki sposób, że doświadczenie użytkownika i wydajność są zawsze najlepsze nawet w scenariuszach gdzie nowe działanie jest dodawane do istniejących działań

 18
Author: Devrath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-23 07:37:24

Podoba mi się to pytanie i odpowiedzi na nie, ale jak na razie nie ma zasięgu rzadziej używanych wywołań zwrotnych, takich jak onPostCreate() lub onPostResume(). Steve Pomeroy spróbował diagramu zawierającego te i jak odnoszą się one do cyklu życia Androida Fragment, w https://github.com/xxv/android-lifecycle . poprawiłem duży diagram Steve ' a, aby zawierał tylko część aktywności i sformatowałem go dla rozmiaru jednej strony litery Wydruk. Zamieściłem go jako tekst PDF na https://github.com/code-read/android-lifecycle/blob/master/AndroidActivityLifecycle1.pdf a poniżej jego zdjęcie:

Cykl Życia Aktywności Na Androidzie

 10
Author: CODE-REaD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-10 16:29:24

Ze strony programistów Androida,

OnPause ():

Wywołane, gdy system ma rozpocząć wznawianie poprzedniej aktywności. Jest to zwykle używane do zatwierdzania niezapisanych zmian w trwałych danych, zatrzymaj animacje i inne rzeczy, które mogą zużywać procesor itp. Implementacja tej metody musi być bardzo szybka, ponieważ następny aktywność nie zostanie wznowiona, dopóki ta metoda nie powróci. Następnie onResume (), jeśli aktywność powróci z powrotem do przodu, lub onStop (), jeśli staje się niewidoczna dla użytkownika.

OnStop ():

Wywołane, gdy aktywność nie jest już widoczna dla użytkownika, ponieważ kolejna aktywność została wznowiona i obejmuje tę. To może się albo dlatego, że rozpoczyna się nowa działalność, istniejąca zostanie postawiony przed tym, albo ten zostanie zniszczony. Po którym następuje albo onRestart (), jeśli ta aktywność wraca do interakcji z użytkownikiem, lub onDestroy (), jeśli to aktywność zanika.

Teraz przypuśćmy, że są trzy działania i przechodzisz z A do B, wtedy onPause of a będzie wywoływana teraz z B do C, wtedy onPause of B i onStop of a będzie wywoływana.

Wstrzymana aktywność otrzymuje wznowienie, a zatrzymana zostaje ponownie uruchomiona.

Kiedy wywołasz this.finish(), zostanie wywołany onpause-onStop-onDestroy. Najważniejsze do zapamiętania to: wstrzymane działania zostają zatrzymane, a zatrzymana aktywność zostaje zniszczona, gdy Android wymaga pamięci dla innych szef.

Mam nadzieję, że to wystarczająco jasne.
 7
Author: Masiar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-22 22:21:32

W tym samym roku, w ramach cyklu life cycle, w ramach cyklu life cycle, w ramach cyklu life cycle, w ramach cyklu life cycle, w ramach cyklu life cycle zostanie dodana dodatkowa sekcja KILLABLE i następny zestaw metod.]}

Źródło: developer.android.com

Tutaj wpisz opis obrazka

Zwróć uwagę na kolumnę" Killable " w powyższej tabeli -- dla tych metod, które są oznaczone jako killable, po tym jak metoda ta zwróci proces hostujący aktywność może zostać zabity przez system w dowolnym momencie bez kolejna linia kodu jest wykonywana.

Z tego powodu, należy użyć metody onPause() do zapisu wszelkich trwałych danych (takich jak zmiany użytkownika)do magazynu. Ponadto metoda onSaveInstanceState(Bundle) jest wywoływana przed umieszczeniem aktywności w takim stanie tła, co pozwala zapisać dowolny dynamiczny stan wystąpienia w aktywności do podanego Bundle, który zostanie później odebrany w onCreate(Bundle), Jeśli aktywność musi zostać ponownie utworzona.

Należy pamiętać, że ważne jest, aby zapisać trwałe DANE w onPause() zamiast onSaveInstanceState(Bundle) Ponieważ ten ostatni nie jest częścią wywołań zwrotnych cyklu życia, więc nie będzie wywoływany w każdej sytuacji, jak opisano w jego dokumentacji.

Chciałbym dodać jeszcze kilka metod. Nie są one wymienione jako metody cyklu życia, ale będą wywoływane podczas cyklu życia w zależności od pewnych warunków. W zależności od wymagań, być może będziesz musiał wdrożyć te metody w swojej aplikacji do właściwej obsługi Państwa.

onPostCreate(Bundle savedInstanceState)

Wywołane podczas uruchamiania aktywności jest kompletna (po wywołaniu onStart() i onRestoreInstanceState(Bundle)).

onPostResume()

Wywołane po zakończeniu wznowienia aktywności (po wywołaniu onResume()).

onSaveInstanceState(Bundle outState)

Wywołane w celu pobrania stanu dla instancji z aktywności przed zabiciem, tak aby stan mógł zostać przywrócony w onCreate(Bundle) lub onRestoreInstanceState(Bundle) (Pakiet wypełniony tą metodą zostanie przekazany do obu).

onRestoreInstanceState(Bundle savedInstanceState)

Metoda ta jest wywoływana po onStart(), gdy aktywność jest ponownie zainicjalizowana z wcześniej zapisanego stanu, podanego tutaj w savedInstanceState.

Mój kod aplikacji wykorzystujący wszystkie te metody:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private EditText txtUserName;
    private EditText txtPassword;
    Button  loginButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Ravi","Main OnCreate");
        txtUserName=(EditText) findViewById(R.id.username);
        txtPassword=(EditText) findViewById(R.id.password);
        loginButton =  (Button)  findViewById(R.id.login);
        loginButton.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        Log.d("Ravi", "Login processing initiated");
        Intent intent = new Intent(this,LoginActivity.class);
        Bundle bundle = new Bundle();
        bundle.putString("userName",txtUserName.getText().toString());
        bundle.putString("password",txtPassword.getText().toString());
        intent.putExtras(bundle);
        startActivityForResult(intent,1);
       // IntentFilter
    }
    public void onActivityResult(int requestCode, int resultCode, Intent resIntent){
        Log.d("Ravi back result:", "start");
        String result = resIntent.getStringExtra("result");
        Log.d("Ravi back result:", result);
        TextView txtView = (TextView)findViewById(R.id.txtView);
        txtView.setText(result);

        Intent sendIntent = new Intent();
        //sendIntent.setPackage("com.whatsapp");
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.putExtra(Intent.EXTRA_TEXT, "Message...");
        sendIntent.setType("text/plain");
        startActivity(sendIntent);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("Ravi","Main Start");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d("Ravi","Main ReStart");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("Ravi","Main Pause");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("Ravi","Main Resume");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("Ravi","Main Stop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Ravi","Main OnDestroy");
    }

    @Override
    public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onPostCreate(savedInstanceState, persistentState);
        Log.d("Ravi","Main onPostCreate");
    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
        Log.d("Ravi","Main PostResume");
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }
}

Aktywność Logowania:

public class LoginActivity extends AppCompatActivity {

    private TextView txtView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        txtView = (TextView) findViewById(R.id.Result);
        Log.d("Ravi","Login OnCreate");
        Bundle bundle = getIntent().getExtras();
        txtView.setText(bundle.getString("userName")+":"+bundle.getString("password"));
        //Intent  intent = new Intent(this,MainActivity.class);
        Intent  intent = new Intent();
        intent.putExtra("result","Success");
        setResult(1,intent);
       // finish();
    }
}

Wyjście: (przed pauzą)

D/Ravi: Main OnCreate
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume

Wyjście: (po wznowieniu z pauzy)

D/Ravi: Main ReStart
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume

Zauważ, że onPostResume() jest wywoływana, mimo że nie jest cytowana jako metoda cyklu życia.

 1
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-11 16:46:08

Zacznij od podstaw mam wiele samouczków związanych z komponentami life cycle aware .. uczysz się cyklu życia jak twoje pytanie być https://www.youtube.com/watch?v=e-ews5dRMwI

 0
Author: Vishal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-27 11:10:45