Activity生命週期詳解

 
 

學習並掌握Activity生命週期,對從事Android開發(或者打算日後從事這方面的開發工作)的朋友來講,是至關重要的。本文將用圖解和實例的方式,向大家詳細講解Activity生命週期的有關知識。
Activity有三個狀態:
1.當它在屏幕前臺時(位於當前任務堆棧的頂部),它是激活或運行狀態。它就是響應用戶操作的Activity。
2.當它上面有另外一個Activity,使它失去了焦點但仍然對用戶可見時(如圖),它處於暫停狀態。在它之上的Activity沒有完全覆蓋屏幕,或者是透明的,被暫停的Activity仍然對用戶可見,並且是存活狀態(它保留着所有的狀態和成員信息並保持和窗口管理器的連接)。如果系統處於內存不足時會殺死這個Activity。

\

3.當它完全被另一個Activity覆蓋時則處於停止狀態。它仍然保留所有的狀態和成員信息。然而對用戶是不可見的,所以它的窗口將被隱藏,如果其它地方需要內存,則系統經常會殺死這個Activity。
當Activity從一種狀態轉變到另一種狀態時,會調用以下保護方法來通知這種變化:
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()

這七個方法定義了Activity的完整生命週期。實現這些方法可以幫助我們監視其中的三個嵌套生命週期循環:
Activity的完整生命週期自第一次調用onCreate()開始,直至調用onDestroy()爲止。Activity在onCreate()中設置所有“全局”狀態以完成初始化,而在onDestroy()中釋放所有系統資源。例如,如果Activity有一個線程在後臺運行從網絡下載數據,它會在onCreate()創建線程,而在 onDestroy()銷燬線程。

Activity的可視生命週期自onStart()調用開始直到相應的onStop()調用結束。在此期間,用戶可以在屏幕上看到Activity,儘管它也許並不是位於前臺或者也不與用戶進行交互。在這兩個方法之間,我們可以保留用來向用戶顯示這個Activity所需的資源。例如,當用戶不再看見我們顯示的內容時,我們可以在onStart()中註冊一個BroadcastReceiver來監控會影響UI的變化,而在onStop()中來注消。onStart() 和 onStop() 方法可以隨着應用程序是否爲用戶可見而被多次調用。

Activity的前臺生命週期自onResume()調用起,至相應的onPause()調用爲止。在此期間,Activity位於前臺最上面並與用戶進行交互。Activity會經常在暫停和恢復之間進行狀態轉換——例如當設備轉入休眠狀態或者有新的Activity啓動時,將調用onPause() 方法。當Activity獲得結果或者接收到新的Intent時會調用onResume() 方法。


說了一大堆的理論,下面一起動手來開發一個小實例,幫助大家快速理解。不妨試着動手去敲代碼,然後自己監控控制檯上的日誌記錄。
先貼出Activity部分的代碼:
最先是一個MainActivity,這個也是軟件啓動時默認打開的。

package cn.itcast.life;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
private static final String TAG = "MainActivity";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(TAG, "onCreate()");

Button button = (Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, OtherActivity.class);
startActivity(intent);
}
});

Button threebutton = (Button) this.findViewById(R.id.threebutton);
threebutton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ThreeActivity.class);
startActivity(intent);
}
});
}

@Override
protected void onDestroy() {
Log.i(TAG, "onDestroy()");
super.onDestroy();
}

@Override
protected void onPause() {
Log.i(TAG, "onPause()");
super.onPause();
}

@Override
protected void onRestart() {
Log.i(TAG, "onRestart()");
super.onRestart();
}

@Override
protected void onResume() {
Log.i(TAG, "onResume()");
super.onResume();
}

@Override
protected void onStart() {
Log.i(TAG, "onStart()");
super.onStart();
}

@Override
protected void onStop() {
Log.i(TAG, "onStop()");
super.onStop();
}

}
MainActivity所匹配的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:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打開OtherActivity"
android:id="@+id/button"
/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打開ThreeActivity"
android:id="@+id/threebutton"
/>
</LinearLayout>


下面將是一個新的Activity,爲了驗證“onstop”方法,我們要用這個OtherActivity將前面的MainActivity覆蓋掉。

package cn.itcast.life;

import android.app.Activity;
import android.os.Bundle;

public class OtherActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
}

}

<?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="這是OtherActivity"
/>
</LinearLayout>

還有一個Activity,是用於測試onpause方法的。使用半透明或者提示框的形式,覆蓋掉前面的MainActivity

package cn.itcast.life;

import android.app.Activity;
import android.os.Bundle;

public class ThreeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.three);
}
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="第三個Activity"
/>
</LinearLayout>

下面是項目清單文件,注意使用android:theme="@android:style/Theme.Dialog"來設置activity 的樣式風格--彈出框

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.itcast.life"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
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=".OtherActivity" android:theme="@android:style/Theme.Dialog"/>
<activity android:name=".ThreeActivity"/>
</application>
<uses-sdk android:minSdkVersion="8" />

</manifest>

在模擬器中部署該應用,觀察控制檯中的日誌顯示,看這些生命週期的執行順序,拭目以待吧。。。。。。
參照那張圖片,“當系統內存不足...”的這種情況,我暫時就不去模擬操作了。
補充:
Activity的 onSaveInstanceState() 和 onRestoreInstanceState()並不是生命週期方法,它們不同於 onCreate()、onPause()等生命週期方法,它們並不一定會被觸發。當應用遇到意外情況(如:內存不足、用戶直接按Home鍵)由系統銷燬一個Activity時,onSaveInstanceState()纔會被調用。但是當用戶主動去銷燬一個Activity時,例如在應用中按返回鍵,onSaveInstanceState()就不會被調用。因爲在這種情況下,用戶的行爲決定了不需要保存Activity的狀態。通常onSaveInstanceState()只適合用於保存一些臨時性的狀態,而onPause()適合用於數據的持久化保存。
提示:在小例子“Android音樂播放器”中,就使用到了該方法。典型的應用場景:比如用戶正在聽音樂,在這首歌的1:32秒鐘時候,突然來電話了(發生意外,音樂播放器的Activity會被電話的Activity覆蓋掉),此時音樂會暫停,用戶正常的接聽電話。等用戶接完電話後,音樂播放器會記住當時的記錄是1:32,可以自動去繼續播放..

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章