有关Android Activity生命周期详解

来源:互联网 发布:淘宝最好的推广方法 编辑:程序博客网 时间:2024/06/02 01:27

1. 生命周期图

        官方有提供 Activity的 生命周期图,如下:



从上图可以清晰的看到 Activity 生命周期中涉及到的主要 方法包括: onCreate(),onStart(),onResume(),onPause(),onStop,onDestory()。 除了这一个还有 onRestart()。
前面的六个方法是相互对应的,比如onCreate 和 onDestory。
其中彩色标示的是几个常态:启动,运行,关闭,杀掉进程。
 
2.测试代码

        光看看,永远都是抽象的。对于程序员,可用的代码才是具体的。为了验证上面的周期图和具体是如何转换的,我写了一个测试程序。程序只有两个Activity,他们之间相互切换。在这个过程中涉及到LogCat (android.util.log),测试结果主要是在这里查看的,我用的编程工具是 eclipse。具体代码如下:


 LifecycleActivity1.java   

package org.wpg.android.lifecycle;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;

public class LifecycleActivity1 extends Activity {
    /** Called when the activity is first created. */
    private static final String TAG = "LifecycleActivity1"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        //打开的时候调用
 Log.i(TAG, "Activity1 onCreate called!"); 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main);  
    }  
    @Override 
    protected void onStart() { 
        //打开的时候调用
 Log.i(TAG, "Activity1 onStart called!"); 
        super.onStart(); 
    }  
 
    @Override 
    protected void onRestart() { 
        Log.i(TAG, "Activity1 onRestart called!");  
        super.onRestart(); 
    }  
    @Override 
    protected void onResume() { 
        //打开的时候调用
 Log.i(TAG, "Activity1 onResume called!"); //在关闭屏幕开启的时候会调用
 super.onResume(); 
    }  
    @Override 
    protected void onPause() { 
        Log.i(TAG, "Activity1 onPause called!");  //当关闭屏幕是调用
 super.onPause(); 
    }  
    @Override 
    protected void onStop() { 
        Log.i(TAG, "Activity1 onStop called!");  
        super.onStop(); 
    }  
    @Override 
    protected void onDestroy() { 
        Log.i(TAG, "Activity1 onDestroy called!");  
        super.onDestroy(); 
    }  
    /**当点击屏幕时,进入Activity2*/ 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) {
         Intent intent = new Intent(this, LifecycleActivity2.class); 
         startActivity(intent);  
        return super.onCreateOptionsMenu(menu);
    }
}
 
LifecycleActivity2.java
 
package org.wpg.android.lifecycle;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
public class LifecycleActivity2 extends Activity {
    /** Called when the activity is first created. */
    private static final String TAG = "LifecycleActivity2"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        Log.i(TAG, "Activity2 onCreate called!");  
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main);  
    }  
    @Override 
    protected void onStart() { 
        Log.i(TAG, "Activity2 onStart called!");  
        super.onStart(); 
    }  
    @Override 
    protected void onRestart() { 
        Log.i(TAG, "Activity2 onRestart called!");  
        super.onRestart(); 
    }  
    @Override 
    protected void onResume() { 
        Log.i(TAG, "Activity2 onResume called!");  
        super.onResume(); 
    }  
    @Override 
    protected void onPause() { 
        Log.i(TAG, "Activity2 onPause called!");  
        super.onPause(); 
    }  
    @Override 
    protected void onStop() { 
        Log.i(TAG, "Activity2 onStop called!");  
        super.onStop(); 
    }  
    @Override 
    protected void onDestroy() { 
        Log.i(TAG, "Activity2 onDestroy called!");  
        super.onDestroy(); 
    }  
    /**当点击屏幕时,进入Activity2*/ 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) {
        Intent intent = new Intent(this, LifecycleActivity1.class); 
        startActivity(intent);  
        return super.onCreateOptionsMenu(menu);
    } 
}

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.wpg.android.lifecycle"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="10" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app1" >
        <activity
            android:name=".LifecycleActivity1"
            android:label="@string/app1" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
         <activity
            android:name=".LifecycleActivity2"
            android:label="@string/app2" >
        </activity>
    </application>
</manifest>

代码简单讲解:


代码非常简单,就是写了两个 activity ,覆盖了父类的几个和生命周期有关的方法,和一个主配置文件。
public boolean onCreateOptionsMenu(Menu menu) {
        Intent intent = new Intent(this, LifecycleActivity1.class); 
        startActivity(intent);  
        return super.onCreateOptionsMenu(menu);
    } 
 这个代码主要是实现,在点击手机的菜单键的时候实现 activity的切换。


3.分析


    具体的测试过程以及结果如下:
   a.打开应用:onCreate-》onStart-》 onResume ,在开始的时候这三个方法都会调用。
   b.从第一个activity切换到第二个:先会 onPause第一个,然后onCreate-》onStart-》 onResume,最后在onStop 
   c.从第二个切换到第一个:内容与上一步相同
   d.按手机的回退(back)键:先onPause 第一个,然后 onRestart-》 onStart-》 onResume ,然后onStop-》 onDestroy  第二个 
   e.按 home 键:会调用 onPause 和 onStop 
   f.再安home 键 重新选择程序进入:onRestart-》onStart-》onResume 
   g.最终退出:onPause-》 onStop》onDestroy  
   ** e~f 不论当前状态时第一个activity 或者第二个 运行的结果都是一样的。
 
   打开应用是显示的日志如下:

04-07 12:09:12.510: I/LifecycleActivity1(12228): Activity1 onCreate called!
04-07 12:09:12.540: I/LifecycleActivity1(12228): Activity1 onStart called!
04-07 12:09:12.540: I/LifecycleActivity1(12228): Activity1 onResume called!
     从第一个activity切换到第二个:

04-07 12:12:48.800: I/LifecycleActivity1(12228): Activity1 onPause called!
04-07 12:12:48.820: I/LifecycleActivity2(12228): Activity2 onCreate called!
04-07 12:12:48.830: I/LifecycleActivity2(12228): Activity2 onStart called!
04-07 12:12:48.830: I/LifecycleActivity2(12228): Activity2 onResume called!
04-07 12:12:49.060: I/LifecycleActivity1(12228): Activity1 onStop called!
  从第二个切换到第一个:

04-07 12:14:03.020: I/LifecycleActivity2(12228): Activity2 onPause called!
04-07 12:14:03.040: I/LifecycleActivity1(12228): Activity1 onCreate called!
04-07 12:14:03.050: I/LifecycleActivity1(12228): Activity1 onStart called!
04-07 12:14:03.050: I/LifecycleActivity1(12228): Activity1 onResume called!
04-07 12:14:03.290: I/LifecycleActivity2(12228): Activity2 onStop called!
  按手机的回退(back)键:

04-07 12:14:56.740: I/LifecycleActivity1(12228): Activity1 onPause called!
04-07 12:14:56.780: I/LifecycleActivity2(12228): Activity2 onRestart called!
04-07 12:14:56.780: I/LifecycleActivity2(12228): Activity2 onStart called!
04-07 12:14:56.790: I/LifecycleActivity2(12228): Activity2 onResume called!
04-07 12:14:57.030: I/LifecycleActivity1(12228): Activity1 onStop called!
04-07 12:14:57.030: I/LifecycleActivity1(12228): Activity1 onDestroy called!
  按 home 键:

04-07 12:16:12.730: I/LifecycleActivity2(12228): Activity2 onPause called!
04-07 12:16:12.950: I/LifecycleActivity2(12228): Activity2 onStop called!
  再安home 键 重新选择程序进入:

04-07 12:17:25.870: I/LifecycleActivity2(12228): Activity2 onRestart called!
04-07 12:17:25.870: I/LifecycleActivity2(12228): Activity2 onStart called!
04-07 12:17:25.870: I/LifecycleActivity2(12228): Activity2 onResume called!
  最终退出:

04-07 12:20:45.170: I/LifecycleActivity1(12228): Activity1 onPause called!
04-07 12:20:45.380: I/LifecycleActivity1(12228): Activity1 onStop called!
04-07 12:20:45.380: I/LifecycleActivity1(12228): Activity1 onDestroy called!
  关闭显示器和打开显示器也会调用相应的方法:
      onPause 和 OnResume
 
结论:


     明白了生命周期中的各个方法的执行时机,其实就相当于明白了它的生命周期。在实际开发中可以根据自己的需要,在对应 的方法里面添加相应的内容,关于这方面的技巧就由大家自己摸索,不在这里多说了。

原创粉丝点击