Activity的生命周期
看一个图先:
这是官网的Activity生命周期结构图,从这个图中可以看出Activity的生命周期函数挺多的,其实他的生命周期和以往我们看到的其他组件的生命周期一样,都是从创建到销毁的过程,只不过之间多加了几个生命周期函数,将他的生命周期细化了。
首先看到的事onCreate()函数,顾名思义这个函数在Activity开始创建时调用,可以在其中定义一些初始化操作。接下来是onStart()方法,这个方法在Activity开始被执行时调用,它紧随onCreate()方法之后调用,接着是onResume()方法,这个方法对我们来说算是比较陌生的,这个方法是在该Activity或得用户输入焦点时被调用,这个或得用户输入焦点有点不好理解,如果我们用过Android手机或者其他系统的手机时,经常会看到有些窗口虽然能看到但无法对他进行操作,这时的Activity就没有或得用户焦点。当这个方法调用后Activity开始真正的运行了,在Activity正在运行时用户激活了另一个Activity,这时将调用第一个Activity的onPause()方法,可以理解为第一个Activity被暂停了,这个时候如果系统的内存不够用(手机内存不够用的情况经常发生),第一个Activity的进程可能被杀死(何时被杀死是由系统决定的,不需要我们参入),当下次我们再运行第一个Activity时就需要重新创建这个Activity,那就又需要调用onCreate()方法。如果在这个Activity没有被杀死的情况下,我们重新调用第一个Activity,就会直接调用它的onResume()方法后开始运行。如果第一个Activity很久都没有得到再次运行机会,就会调用onStop()被停止,这时如果Activity又或得用户输入焦点,就会调用onRestart()方法,重新开始执行这个Activity,或者被系统杀死,否则调用onDestroy()方法销毁Activity。这整个过程看起来有点绕,其实在实际开发中我们很少会用到所有的生命周期函数,但我们要弄清它的原理,在使用时知道所以然就行了。
下面来看一个实例(实例只列出一些重要的文件内容,具体的创建步骤可以参考之前的文章,实例源码参考mars老师的android视频教程):
第一个Activity的布局文件(main.xml):
<?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/myButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/first_button" /> </LinearLayout>
第二个Activity的布局文件(Second.xml):
<?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="wrap_content" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" ></TextView> <Button android:id="@+id/secondButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/second_button" /> </LinearLayout>
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="mars.activity05" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".FirstActivity" 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=".SecondActivity" android:label="SecondActivity" android:theme="@android:style/Theme.Dialog"/> </application> <uses-sdk android:minSdkVersion="4" /> </manifest>
FirstActivity.java:
package mars.activity05; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class FirstActivity extends Activity { /** Called when the activity is first created. */ private Button myButton; @Override public void onCreate(Bundle savedInstanceState) { System.out.println("FirstActivity ---> onCreate "); super.onCreate(savedInstanceState); setContentView(R.layout.main); myButton = (Button) findViewById(R.id.myButton); myButton.setOnClickListener(new ButtonListener()); } @Override protected void onDestroy() { // TODO Auto-generated method stub System.out.println("FirstAcvity --->onDestory"); super.onDestroy(); } @Override protected void onPause() { // TODO Auto-generated method stub System.out.println("FirstAcvity --->onPause"); super.onPause(); } @Override protected void onRestart() { // TODO Auto-generated method stub System.out.println("FirstAcvity --->onRestart"); super.onRestart(); } @Override protected void onResume() { // TODO Auto-generated method stub System.out.println("FirstAcvity --->onResume"); super.onResume(); } @Override protected void onStart() { // TODO Auto-generated method stub System.out.println("FirstAcvity --->onStart"); super.onStart(); } @Override protected void onStop() { // TODO Auto-generated method stub System.out.println("FirstAcvity --->onStop"); super.onStop(); } class ButtonListener implements OnClickListener { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setClass(FirstActivity.this, SecondActivity.class); FirstActivity.this.startActivity(intent); } } }
SecondActivity.java:
package mars.activity05; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class SecondActivity extends Activity{ private Button secondButton; @Override protected void onCreate(Bundle savedInstanceState) { System.out.println("SecondActivity--->onCreate"); // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.second); secondButton = (Button)findViewById(R.id.secondButton); secondButton.setOnClickListener(new ButtonListener()); } @Override protected void onDestroy() { // TODO Auto-generated method stub System.out.println("SecondActivity--->onDestory"); super.onDestroy(); } @Override protected void onPause() { // TODO Auto-generated method stub System.out.println("SecondActivity--->onPause"); super.onPause(); } @Override protected void onRestart() { // TODO Auto-generated method stub System.out.println("SecondActivity--->onRestart"); super.onRestart(); } @Override protected void onResume() { // TODO Auto-generated method stub System.out.println("SecondActivity--->onResume"); super.onResume(); } @Override protected void onStart() { // TODO Auto-generated method stub System.out.println("SecondActivity--->onStart"); super.onStart(); } @Override protected void onStop() { // TODO Auto-generated method stub System.out.println("SecondActivity--->onStop"); super.onStop(); } class ButtonListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setClass(SecondActivity.this, FirstActivity.class); SecondActivity.this.startActivity(intent); } } }