您的位置:首页 > 其它

activity "生命周期"详解

2012-11-04 17:56 411 查看
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生命周期就先搞到这里了,以后有补充的再写上来,同时也希望各位多多指教......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: