Dieser Artikel analysiert den gesamten Lebenszyklus von Aktivitäten in der Android-Programmierung anhand von Beispielen. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:
Aktivitäten in Android haben ihre eigenen Lebenszyklen. Das Erlernen dieses Wissens kann uns helfen, einige der Fehler, auf die wir in Zukunft beim Schreiben von Programmen stoßen, besser zu verstehen. . Dieser Artikel ist sehr lang, ich hoffe, er nimmt nicht die Zeit aller in Anspruch~
Heute werde ich nicht zu viel über den Aktivitätsstapel berichten, sondern hauptsächlich über den Lebenszyklus der Aktivität selbst
Unterscheiden Sie mehrere Konzepte
1 Aktivität Die offizielle Erklärung lautet: „Eine Aktivität ist eine Anwendungskomponente, die einen Bildschirm bereitstellt, mit dem Benutzer interagieren können, um etwas zu tun, z. B. das Telefon anzurufen, ein Foto aufzunehmen oder zu senden.“ Jede Aktivität erhält ein Fenster, in dem sie ihre Benutzeroberfläche zeichnen kann. „Das heißt, jedes Fenster, das der Benutzer zur Interaktion verwendet, ist ein Vorgang, den der Benutzer gerade ausführt.“
2 Backstack Der Benutzer startet eine Aktivität A über den Anwendungsstarter, indem er das Programm berührt. Die gestartete Aktivität A wird an die Spitze des Stapels verschoben. Wenn die aktuelle Aktivität A eine neue Aktivität B startet , dann Wenn A die Funktion onStop aufruft, behält das System diese Aktivitätsinformationen bei. Wenn der Benutzer die Zurück-Taste drückt, führt der Back-Stack eine Pop-Operation aus und ruft A's onResume() auf wird später im Detail vorgestellt.
3 Aufgaben Wenn sich der Benutzer in einer Aktivität befindet: Aktivität A heißt „TaskOne-Anwendung“, drücken Sie die HOME-Taste und der Benutzer kehrt zu diesem Zeitpunkt zum Launcher zurück, wenn der Benutzer erneut eine neue Anwendung berührt. Eine neue Anwendung wird erstellt und ein Backstack stellt eine Aufgabe dar, die in denselben Stapel verschoben werden kann, was bedeutet, dass Ihr Programm eine damit verbundene Textnachrichtenaktivität bilden kann Das System vermittelt dem Benutzer das Gefühl, dass das Senden von Textnachrichten eine Funktion in Ihrem Programm ist.
Hinweis: Die oben genannten Verhaltensweisen sind die Standardeinstellungen des Systems. Es gibt zwei Möglichkeiten, das Verhalten der Aktivität zu ändern. Eine besteht darin, A hinzuzufügen, um B zu starten. In den Manifesteinstellungen von B wird das Verhalten geändert. Die andere besteht darin, die Aktivitätseinstellungen anzugeben, die in der Absicht gestartet werden sollen. Die Priorität der Absicht ist höher als die der Datei manifest.xml , und einige Modi existieren nicht gleichzeitig.
Der Lebenszyklus von Android umfasst onCreate, onStart, onResume, onPause, onStop und onDestroy Die Aufrufzeit jeder Methode wird unten vorgestellt.
onCreate() Die Aktivität kann in diesem Zustand nicht beendet werden.
Wird aufgerufen, wenn die Aktivität zum ersten Mal erstellt wird Ihr normaler statischer Aufbau: Ansichten erstellen, Daten an Listen binden usw. Diese Methode stellt Ihnen auch ein Bundle bereit, das den zuvor eingefrorenen Status der Aktivität enthält, falls vorhanden.
Immer gefolgt von onStart().
//Sie sollten es aufrufen, wenn die Aktivität zum ersten Mal erstellt wird. Führen Sie die gesamte statische Erstellung in dieser Methode durch, erstellen Sie Ansichten, binden Sie Daten an Listen (über die setContnetView-Methode) usw. Diese Methode stellt Ihnen auch ein Bundle bereit, das die enthält Der letzte Status der Aktivität in der onStart-Methode.
//Wird aufgerufen, wenn Ihre Aktivität gestoppt und vor dem Neustart aufgerufen wird
onResume()-Zeiten, in denen die Aktivität nicht beendet werden kann
Wird aufgerufen, wenn die Aktivität mit dem Benutzer interagiert. Zu diesem Zeitpunkt befindet sich Ihre Aktivität an der Spitze des Aktivitätsstapels und die Benutzereingaben gehen dorthin.
//Wird aufgerufen, wenn die Aktivität gestartet wird, um mit dem Benutzer zu interagieren. In diesem Moment befindet sich Ihre Aktivität an der Spitze des Aktivitätsstapels und wird immer dann aufgerufen, wenn das System mit der Fortsetzung einer vorherigen Aktivität beginnt Daten, Stoppanimationen und andere Dinge, die möglicherweise CPU verbrauchen usw. Implementierungen dieser Methode müssen sehr schnell erfolgen, da die nächste Aktivität erst wieder aufgenommen wird, wenn diese Methode zurückkehrt.
Gefolgt von entweder onResume(), wenn die Aktivität zurückkehrt nach vorne oder onStop(), wenn es für den Benutzer unsichtbar wird.
//Wenn das System im Begriff ist, neu zu starten Es wird aufgerufen, wenn die vorherige Aktivität (ich verstehe es nicht, mein Verständnis ist: it wird aufgerufen, wenn die aktuelle Aktivität eine neue Aktivität starten möchte). Eine typische Anwendung wird verwendet, um nicht gespeicherte Daten an die aktuellen Daten zu senden (d. h. nur Datenaktualisierungen speichern), Animationen und andere Vorgänge zu stoppen, die möglicherweise CPU verbrauchen. Die Implementierung dieser Methode muss schnell erfolgen, da die nächste Aktivität erst neu gestartet wird, wenn diese Methode zurückkehrt.
Wenn sich die Aktivität von hinten (der Übersetzungshintergrund ist nicht geeignet) nach vorne (der Zustand der Interaktion mit dem Benutzer) ändert, wird die onResume-Methode nach der onPause-Methode
aufgerufen
Wenn die Aktivität unsichtbar wird, wird die onStop-Methode nach onPause aufgerufen
onStop() Die Aktivität kann in mehreren Zuständen beendet werden
Wird aufgerufen, wenn die Aktivität für den Benutzer nicht mehr sichtbar ist, weil Eine andere Aktivität wurde wieder aufgenommen und deckt diese ab. Dies kann passieren, weil entweder eine neue Aktivität gestartet wird, eine bestehende vor diese verschoben wird oder diese 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.
//Wird aufgerufen, wenn die Aktivität für den Benutzer nicht mehr sichtbar ist, weil eine andere Aktivität neu gestartet und überschrieben wird die aktuelle Aktivität (auf dem Stapel). Wenn eine neue Aktivität gestartet wird, eine vorhandene Aktivität wieder in den Vordergrund tritt oder die aktuelle Aktivität zerstört wird. Wenn die Aktivität in den Vordergrund zurückkehren und mit dem Benutzer interagieren möchte, wird nach dieser Methode die onReatart-Methode aufgerufen. Wenn die aktuelle Aktivität abstürzt, wird nach dieser Methode die onDestroy-Methode aufgerufen
onDestroy ()-Zeiten. Die Aktivität kann in diesem Zustand beendet werden.
Der letzte Anruf, den Sie erhalten, bevor Ihre Aktivität zerstört wird. Dies kann entweder passieren, weil die Aktivität beendet wird (jemand nennt sie „finish()“), oder weil das System dies tut Diese Instanz der Aktivität vorübergehend zerstören, um Speicherplatz zu sparen. Sie können zwischen diesen beiden Szenarien mit der Methode „finish“ unterscheiden. Stattdessen wird die Aktivitätsinstanz zerstört onPause-Methode, um festzustellen, ob die Aktivität angehalten oder beendet wird.
Das Bild unten ist eine Lebenszyklusdemonstration der offiziellen Website
Okay, schauen wir uns ein Demonstrationsbeispiel an, das ich geschrieben habe:
MainFest.xml
Layoutdatei main.xml<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="uni.activity" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".ActivityDemoActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Activity01" android:label="@string/app_name"> </activity> </application> </manifest>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/Button_A" android:text="GO to activity 2" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/Button_A" android:text="GO to activity 2" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, ActivityDemoActivity!</string> <string name="app_name">ActivityDemo</string> <string name="activity01">this is activity 01</string> </resources>
/* * @author octobershiner * 2011 07 29 * SE.HIT * 演示完整的activity的声明周期,以及isFinish方法的调用 * 此activity为程序入口activity * */ package uni.activity; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class ActivityDemoActivity extends Activity { /** Called when the activity is first created. */ private static final String TAG = "demo"; private Button button_A; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button_A = (Button)this.findViewById(R.id.Button_A); button_A.setOnClickListener(new myButtonListener()); } private class myButtonListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setClass(ActivityDemoActivity.this, Activity01.class); ActivityDemoActivity.this.startActivity(intent); //感兴趣的朋友可以取消下面的代码注释,来测试finish方法的使用,会发现第一个activity会被强制终止 //ActivityDemoActivity.this.finish(); } }; protected void onStart(){ super.onStart(); Log.i(TAG, "The activityDemo state---->onStart"); } protected void onRestart(){ super.onRestart(); Log.i(TAG, "The activityDemo state---->onReatart"); } protected void onResume(){ super.onResume(); Log.i(TAG, "The activityDemo state---->onResume"); } protected void onPause(){ super.onPause(); //调用isFinishing方法,判断activity是否要销毁 Log.i(TAG, "The activityDemo state---->onPause"); if(isFinishing()){ Log.w(TAG, "The activityDemo will be destroyed!"); }else{ Log.w(TAG, "The activityDemo is just pausing!"); } } protected void onStop(){ super.onStop(); Log.i(TAG, "The activityDemo state---->onStop"); } protected void onDestroy(){ super.onDestroy(); Log.i(TAG, "The activityDemo state---->onDestroy"); } }
/* * @author octobershiner * 2011 07 29 * SE.HIT * 演示完整的activity的声明周期,以及isFinish方法的调用 * 此activity可由ActivityDemoActivity启动 * */ package uni.activity; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class Activity01 extends Activity{ private static final String TAG = "demo"; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity01); Log.d(TAG, "The activity01 state---->onStart"); } protected void onStart(){ super.onStart(); Log.d(TAG, "The activity01 state---->onStart"); } protected void onRestart(){ super.onRestart(); Log.d(TAG, "The activity01 state---->onReatart"); } protected void onResume(){ super.onResume(); Log.d(TAG, "The activity01 state---->onResume"); } protected void onPause(){ super.onPause(); Log.d(TAG, "The activity01 state---->onPause"); //调用isFinishing方法,判断activity是否要销毁 if(isFinishing()){ Log.w(TAG, "The activity01 will be destroyed!"); }else{ Log.w(TAG, "The activity01 is just pausing!"); } } protected void onStop(){ super.onStop(); Log.d(TAG, "The activity01 state---->onStop"); } protected void onDestroy(){ super.onDestroy(); Log.d(TAG, "The activity01 state---->onDestroy"); } }
Der Vorgang lautet: ActivityDemoActivity starten
Klicken Sie dann auf die Schaltfläche, um Aktivität01 aufzurufen
(Es ist ersichtlich, dass die Aktivität zuerst angehalten und nicht freigegeben wird. Es handelt sich tatsächlich um einen Push-Prozess für neue Aktivitäten. Wenn eine neue Aktivität gestartet wird, sollte sie auf „Erstellen“ und dann auf „Start“ sein. Ich habe geschrieben Aufmerksame Freunde sollten gesehen haben, dass die onStop-Methode aufgerufen wird, wenn die alte Aktivität nicht sichtbar ist.
Drücken Sie dann die Eingabetaste, um zu ActivityDemoActivity zurückzukehren
(Nach der Rückkehr Aktivität01 oben auf dem Stapel führt einen Stapel-Pop-Vorgang aus und die Anzeige wird zerstört)
Drücken Sie die Eingabetaste erneut, um zum Desktop zurückzukehren
Tatsächlich ist Dongxies Text etwas lang, aber er zeigt im Grunde den gesamten Lebenszyklus der Aktivität.
Ich hoffe, dass dieser Artikel für alle hilfreich ist, die sich mit der Android-Programmierung befassen.
Weitere Artikel zum Aktivitätslebenszyklus, wenn Android zwischen horizontalen und vertikalen Bildschirmen wechselt, finden Sie auf der chinesischen PHP-Website!