454 Stimmen

Lebenszyklus von Android-Aktivitäten - wozu dienen all diese Methoden?

Was ist der Lebenszyklus einer Android-Aktivität? Warum sind so viele ähnlich klingende Methoden ( onCreate() , onStart() , onResume() ), die während der Initialisierung aufgerufen werden, und so viele andere ( onPause() , onStop() , onDestroy() ) am Ende aufgerufen?

Wann werden diese Methoden aufgerufen, und wie sollten sie richtig eingesetzt werden?

21 Stimmen

Warum wurde diese Frage so oft hochgestuft? Warum wurde sie nicht geschlossen?

62 Stimmen

Warum wird eine Frage mit vielen positiven Bewertungen geschlossen? Stackoverflow hat eine schlechte Angewohnheit, das zu tun.

15 Stimmen

Dies ist eine Frage im Wiki-Stil, und ich denke, sie sollte auf der Website erlaubt sein.

9voto

Masiar Punkte 18610

Auf der Seite für Android-Entwickler,

onPause():

Wird aufgerufen, wenn das System kurz vor der Wiederaufnahme steht. Dies wird in der Regel verwendet, um ungespeicherte Änderungen an persistenten Daten zu bestätigen, Animationen und andere Dinge zu stoppen, die möglicherweise CPU verbrauchen, usw. Implementierungen dieser Methode müssen sehr schnell sein, da die nächste Aktivität nicht wieder aufgenommen wird, bevor diese Methode zurückkehrt. Gefolgt von entweder onResume(), wenn die Aktivität zurückkehrt onStop(), wenn sie für den Benutzer unsichtbar wird.

onStop():

Wird aufgerufen, wenn die Aktivität nicht mehr sichtbar ist für die eine andere Aktivität wiederaufgenommen wurde und diese überdeckt. Dies kann passieren, weil entweder eine neue Aktivität gestartet wird, eine bestehende Aktivität vor diese Aktivität geschoben wird oder diese Aktivität zerstört wird. Gefolgt von entweder onRestart(), wenn diese Aktivität zurückkommt, um mit dem Benutzer zu interagieren, oder onDestroy(), wenn diese Aktivität verschwindet.

Angenommen, es gibt drei Aktivitäten und Sie gehen von A nach B, dann wird onPause von A aufgerufen, jetzt von B nach C, dann wird onPause von B und onStop von A aufgerufen.

Die angehaltene Aktivität wird fortgesetzt und die gestoppte Aktivität wird neu gestartet.

Wenn Sie anrufen this.finish() wird onPause-onStop-onDestroy aufgerufen. Das Wichtigste ist: angehaltene Aktivitäten werden gestoppt und eine gestoppte Aktivität wird zerstört, wenn Android Speicher für andere Operationen benötigt.

Ich hoffe, das ist klar genug.

5voto

Steve Punkte 9577

Was ist der Lebenszyklus einer Android-Aktivität?

Im Android-Sdk-Framework hat jede Android-Aktivität (Fenster) Lebenszyklusmethoden. Das heißt, wenn der Benutzer in eine Anwendung eintritt, kann er die Activity sehen, die in der onCreate()-Lifecycle-Methode erstellt worden ist. Layouts in das Fenster in onCreate() Methode nur angebracht.

Die Aktivität (Fenster) hat folgende Lebenszyklusstatus:

Create - Activity is created. 
Start - Current activity gets started.
Resume - Current activity has been in resumed state.
Restart - Current activity has been in restarted.
Pause - Current activity has been in Paused state.
Stop - Current activity has been in stopped state.
destroy - Current activity has been in destroyed state.

Warum sind so viele ähnlich klingende Methoden (onCreate(), onStart(), onResume()) während der Initialisierung aufgerufen, und so viele andere (onPause(), onStop(), onDestroy()), die am Ende aufgerufen werden?

First time user enter into an application:

Beim Öffnen der Anwendung sehen wir ein Fenster (Aktivität). onCreate (erstellt) -> onStart (gestartet) -> onResume (Fortsetzungszustand) wird aufgerufen.

Close the application from background:

beim Schließen der Anwendung aus dem Backgroup

W

S

W

onCreate()

onStart() 

onResume()

W

onCreate()

onStart() 

onResume()

A

W

first_activity  : onPause()

second_activity : onCreate()

second_activity : onStart()

second_activity : onResume()

first_activity  : onStop()

W

second_activity : onPause()

first_activity  : onRestart()

first_activity  : onStart()

first_activity  : onResume()

second_activity : onStop()

second_activity : onDestroy()

O

W

onPause()

onStop()

A

onRestart()

onStart()

onResume()

H

W

onPause()

onStop()

U

onRestart()

onStart()

onResume()

U

W

onPause()

onStop()

I

onRestart()

onStart()

onResume()

I

N

P

W

onPause()

onStop()

W

onRestart()

onStart()

onResume()

P

W

R

W

onPause()

onStop()

W

onCreate()

onStart()

onResume()

3voto

Ravindra babu Punkte 45577

Hinzufügen einiger weiterer Informationen zu der hoch bewerteten Antwort (Hinzufügen eines zusätzlichen Abschnitts über KILLABLE und der nächsten Gruppe von Methoden, die im Lebenszyklus aufgerufen werden):

Fuente: entwickler.android.de

enter image description here

Beachten Sie die " Tötbar "Spalte in der obigen Tabelle - für die Methoden, die als beendbar markiert sind, kann der Prozess, der die Aktivität beherbergt, nach der Rückkehr der Methode jederzeit vom System beendet werden, ohne dass eine weitere Zeile seines Codes ausgeführt wird.

Aus diesem Grund sollten Sie die onPause() Methode, um dauerhafte Daten (z. B. Benutzeränderungen) in den Speicher zu schreiben. Darüber hinaus kann die Methode onSaveInstanceState(Bundle) wird aufgerufen, bevor die Aktivität in einen solchen Hintergrundzustand versetzt wird, so dass Sie jeden dynamischen Instanzzustand in Ihrer Aktivität in der angegebenen Bundle und wird später in onCreate(Bundle) wenn die Aktivität neu erstellt werden muss.

Beachten Sie, dass es wichtig ist, die persistenten Daten in onPause() anstelle von onSaveInstanceState(Bundle) weil letztere nicht Teil der Lebenszyklus-Callbacks ist und daher nicht in jeder Situation, wie in der Dokumentation beschrieben, aufgerufen wird.

Ich möchte noch einige weitere Methoden hinzufügen. Diese sind nicht als Lebenszyklusmethoden aufgeführt, werden aber während des Lebenszyklus in Abhängigkeit von bestimmten Bedingungen aufgerufen. Je nach Ihren Anforderungen müssen Sie diese Methoden möglicherweise in Ihrer Anwendung implementieren, um den Status ordnungsgemäß zu handhaben.

onPostCreate(Bundle savedInstanceState)

Wird aufgerufen, wenn der Start der Aktivität abgeschlossen ist (nach onStart() y onRestoreInstanceState(Bundle) aufgerufen wurden).

onPostResume()

Wird aufgerufen, wenn die Wiederaufnahme der Aktivität abgeschlossen ist (nach onResume() aufgerufen wurde).

onSaveInstanceState(Bundle outState)

Wird aufgerufen, um den Zustand pro Instanz von einer Aktivität abzurufen, bevor sie beendet wird, damit der Zustand in onCreate(Bundle) ou onRestoreInstanceState(Bundle) (das von dieser Methode befüllte Bundle wird an beide übergeben).

onRestoreInstanceState(Bundle savedInstanceState)

Diese Methode wird aufgerufen, nachdem onStart() wenn die Aktivität von einem zuvor gespeicherten Zustand aus neu initialisiert wird, hier angegeben in savedInstanceState .

Mein Anwendungscode verwendet alle diese Methoden:

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);
    }
}

Login-Aktivität:

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();
    }
}

Ausgabe: ( Vor der Pause)

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

Ausgabe: ( Nach Wiederaufnahme aus der Pause)

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

Beachten Sie, dass onPostResume() aufgerufen wird, obwohl sie nicht als Lebenszyklusmethode angegeben ist.

2voto

DragonFire Punkte 2748

I

S

On Activity Load (First Time)
————————————————————————————————————————————————
D/IndividualChatActivity: onCreate: 
D/IndividualChatActivity: onStart: 
D/IndividualChatActivity: onResume: 
D/IndividualChatActivity: onPostResume: 

Reload After BackPressed
————————————————————————————————————————————————
D/IndividualChatActivity: onCreate: 
D/IndividualChatActivity: onStart: 
D/IndividualChatActivity: onResume: 
D/IndividualChatActivity: onPostResume: 

OnMaximize(Circle Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onRestart: 
D/IndividualChatActivity: onStart: 
D/IndividualChatActivity: onResume: 
D/IndividualChatActivity: onPostResume: 

OnMaximize(Square Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onRestart: 
D/IndividualChatActivity: onStart: 
D/IndividualChatActivity: onResume: 
D/IndividualChatActivity: onPostResume: 

S

On BackPressed
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop: 
D/IndividualChatActivity: onDestroy: 

OnMinimize (Circle Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onPause: 
D/IndividualChatActivity: onStop: 

OnMinimize (Square Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onPause: 
D/IndividualChatActivity: onStop: 

Going To Another Activity
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop: 

Close The App
————————————————————————————————————————————————
D/IndividualChatActivity: onDestroy: 

I

o

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X