activity "生命周期"详解

来源:互联网 发布:yum 安装mysql 5.6 编辑:程序博客网 时间:2024/06/05 14:06

activity作为android的四大组件之一,它拥有无可替代的地位。我们要了解Activity就不能不了解它的生命周期,然而刚开始时我们都只会去关注经典的生命周期。好了,下面就让我们一起再来学习android的生命周期,让我们一起了解不常关注的android“生命周期”:

整个工程包含了两个activity,其中ActivityLifeCycle.java演示了经典的activity生命周期,而ALCMoreComplex.java演示了其它不同轨迹的生命周期。

首先,贴工程结构图和代码:

代码:

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/learmMore" android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:text="我要了解更多关于生命周期的问题..." />
</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="cxy.sh" android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="4" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".ActivityLifeCycle" 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="ALCMoreComplex" ><!-- android:launchMode="singleTop" --></activity>
</application>
</manifest>

ActivityLifeCycle.java

public class ActivityLifeCycle extends Activity {
private static String TAG = "LifeCycle" ;
    @Override   
    //完全生命周期开始时被调用,用于初始化Activity
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.i(TAG, "(1) onCreate()");
        Button btn = (Button) findViewById(R.id.learmMore);
        btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Intent intent = new Intent(ActivityLifeCycle.this,ALCMoreComplex.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
//three seconds later we launch the activity again.
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
startActivity(intent);
}

}, 3000);
}
});
    } 
    @Override  
    //可视生命周期开始时被调用,对用户界面进行必要的更改 
    public void onStart() {
        super.onStart();
        Log.i(TAG, "(2) onStart()");
    }
   
    @Override  //在活动生命周期开始时被调用,恢复被onPause()停止的用于界面更新的资源
     public void onResume() {
         super.onResume();
         Log.i(TAG, "(4) onResume()");
     }
     @Override  //在重新进入可视生命周期前被调用,载入界面所需要的更改信息
     public void onRestart() {
         super.onRestart();
         Log.i(TAG, "(6) onRestart()");
     }
  
     @Override  //在活动生命周期结束时被调用,用来保存持久的数据或释放占用的资源
     public void onPause() {
         super.onPause();
         Log.i(TAG, "(7) onPause()");
     }
     
@Override //在可视生命周期结束时被调用,一般用来保存持久的数据或释放占用的资源
public void onStop() {
    super.onStop();
     Log.i(TAG, "(8) onStop()");
 }
 
 @Override //在完全生命周期结束时被调用,释放资源,包括线程、数据连接等
 public void onDestroy() {
     super.onDestroy();
     Log.i(TAG, "(9) onDestroy()");
 }
}

ALCMoreComplex.java

public class ALCMoreComplex extends Activity {

private static String TAG = "ALCMoreComplex" ;
    @Override   
    //完全生命周期开始时被调用,用于初始化Activity
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.i(TAG, "onCreate()");
    }
    
    @Override  
    //可视生命周期开始时被调用,对用户界面进行必要的更改 
    public void onStart() {
        super.onStart();
        Log.i(TAG, "onStart()");
    }
    
    @Override  
    //在onStart()后被调用,用于恢复onSaveInstanceState()保存的用户界面信息
     public void onRestoreInstanceState(Bundle savedInstanceState) {
         super.onRestoreInstanceState(savedInstanceState);
         Log.i(TAG, "onRestoreInstanceState()");
     }
   
    @Override  //在活动生命周期开始时被调用,恢复被onPause()停止的用于界面更新的资源
     public void onResume() {
         super.onResume();
         Log.i(TAG, "onResume()");
     }
    
     @Override  // 在onResume()后被调用,保存界面信息
      public void onSaveInstanceState(Bundle savedInstanceState) { 
         super.onSaveInstanceState(savedInstanceState);
         Log.i(TAG, "onSaveInstanceState()");
     }
     
     @Override  //在重新进入可视生命周期前被调用,载入界面所需要的更改信息
     public void onRestart() {
         super.onRestart();
         Log.i(TAG, "onRestart()");
     }
  
     @Override  //在活动生命周期结束时被调用,用来保存持久的数据或释放占用的资源
     public void onPause() {
         super.onPause();
         Log.i(TAG, "onPause()");
     }
     
@Override //在可视生命周期结束时被调用,一般用来保存持久的数据或释放占用的资源
public void onStop() {
    super.onStop();
     Log.i(TAG, "onStop()");
 }
 
 @Override //在完全生命周期结束时被调用,释放资源,包括线程、数据连接等
 public void onDestroy() {
     super.onDestroy();
     Log.i(TAG, "onDestroy()");
 }


@Override   //活动配置改变时系统自动调用
public void onConfigurationChanged(Configuration newConfig) {
Log.i(TAG, "onConfigurationChanged()");
super.onConfigurationChanged(newConfig);
}


@Override  
//当启动模式为“singleTop”或调用startActivity(intent)时使用了FLAG_ACTIVITY_SINGLE_TOP标志
protected void onNewIntent(Intent intent) {
Log.i(TAG, "onNewIntent--->this is a different launch mode !");
super.onNewIntent(intent);
}


@Override
protected void onPostCreate(Bundle savedInstanceState) {
Log.i(TAG, "onPostCreate-->this is called " +
"after onStart or onRestoreInstanceState have been called !");
super.onPostCreate(savedInstanceState);
}


@Override
protected void onPostResume() {
super.onPostResume();
Log.i(TAG, "onPostResume-->this is called after onResume have been called !");
}


@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.i(TAG, "活动的焦点发生了改变,"+(hasFocus?"我现在拥有焦点!":"我现在失去了焦点"));
}  
}

下面一一验证activity生命周期(查看logcat输出日志):

1、经典的activity生命周期

一条道走到黑,直接、干脆、利索,然而activity的生命中遇到了你,让它的生命变得更加绚丽。

2、onPostCreate和onPostResume

虽然这两个片段常常被我们给忽略了,但是他们也是一段经历,且看他们何时发生:

onPostCreate()不是我们想象中的情况——发生在onCreate之后,而是onStart后。

3、onWindowFocusChanged——只要activity的焦点发生变化,我一定会知道

看我是在何时失去焦点的,在这里打印的是ALCMoreComplex.A和ALCMoreComplex.B的日志信息。

4、配置信息变化--onConfigurationChanged

如果想要搭讪上我,请先搞定configChanges先生。先在AndroidManifest的ALCMoreComplex节点处添加android:configChanges="orientation"

上面兑现了我的承诺(横竖屏切换是发生),注意:高版本中可能加入screenSize。

5、onSaveInstanceState 和 onRestoreInstanceState

首先,注释掉ActivityLifeCycle的以下代码:

new Handler().postDelayed(new Runnable(){
@Override
public void run() {
startActivity(intent);
}

}, 3000);

运行工程到ALCMoreComplex界面——>按下power键——>解锁

可以看到onSaveInstanceState 在onPause方法前面执行,为什么没有onRestoreInstanceState?

接着我们把刚才的configChanges先生除名,运行到刚才的界面,翻转以下试试:

onRestoreInstanceState这位隐士终于被揪出来了,且来看看它的自我介绍-——this method is called after onStart() when the activity is being re-initialized from a previously saved state(我在onStart方法后面被调用,并且是在拿保存的状态重新初始化时才轮到我来做事)。

6、onNewIntent

在继续之前呢,还是先恢复5修改的代码,然后将android:launchMode="singleTop“添加到AndroidManifest.xml的ALCMoreComplex节点下,运行程序

activity生命周期就先搞到这里了,以后有补充的再写上来,同时也希望各位多多指教......