Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Activiy生命周期注意點

Activiy生命周期注意點

編輯:關於Android編程

1.onPause()

(1)當半透明Activity阻擋您的Activity時,系統會調用 onPause() 並且Activity會在“暫停”狀態下等待 。 如果用戶在Activity仍然處於暫停狀態時返回Activity,則系統會調用 onResume()。

(2)當系統為您的Activity調用 onPause() 時,它從技術角度看意味著您的Activity仍然處於部分可見狀態,但往往說明用戶即將離開Activity並且它很快就要進入“停止”狀態。您通常應使用 onPause() 回調:

1>停止動畫或其他可能消耗 CPU 的進行之中的操作。

2>提交未保存的更改,但僅當用戶離開時希望永久性保存此類更改(比如電子郵件草稿)。

3>釋放系統資源,比如廣播接收器、傳感器手柄(比如 GPS) 或當您的Activity暫停且用戶不需要它們時仍然可能影響電池壽命的任何其他資源。

例如,如果您的應用使用 Camera, onPause() 方法是釋放它的好位置。

@Override

public void onPause() {

super.onPause(); // Always call thesuperclass method first

// Releasethe Camera because we don't need it when paused

// andother activities might need to use it.

if(mCamera != null) {

mCamera.release()

mCamera = null;

}

}

 

(3)一般情況下,您不得使用 onPause() 永久性存儲用戶更改(比如輸入表格的個人信息)。 只有在您確定用戶希望自動保存這些更改的情況(比如,電子郵件草稿)下,才能在 onPause()中永久性存儲用戶更改。但您應避免在 onPause() 期間執行 CPU 密集型工作,比如向數據庫寫入信息,因為這會拖慢向下一Activity過渡的過程(您應改為在 onStop()期間執行高負載關機操作。

(4)當您的Activity暫停時,Activity 實例將駐留在內存中並且在Activity繼續時被再次調用。您無需重新初始化在執行任何導致進入“OnResume()”狀態的回調方法期間創建的組件。

2.onResume()

每當您的Activity進入前台時系統便會調用此方法,包括它初次創建之時。同樣地,您應實現onResume() 初始化您在 onPause() 期間釋放的組件並且執行每當Activity進入“繼續”狀態時必須進行的任何其他初始化操作(比如開始動畫和初始化只在Activity具有用戶焦點時使用的組件)。onResume() 的以下示例對應於以上的 onPause() 示例,因此它初始化Activity暫停時釋放的照相機。

@Override

publicvoid onResume() {

super.onResume(); // Always call the superclass method first

// Get the Camera instance as the activityachieves full user focus

if (mCamera == null) {

initializeCamera(); // Local method tohandle camera init

}

}

 

3.onStop() 和 onRestart()

(1)正確停止和重新開始Activity是Activity生命周期中的重要過程,其可確保您的用戶知曉應用始終保持Activity狀態並且不會丟失進度。有幾種Activity停止和重新開始的關鍵場景:

1>用戶打開“最近應用”窗口並從您的應用切換到另一個應用。當前位於前台的您的應用中的Activity將停止。 如果用戶從主屏幕啟動器圖標或“最近應用”窗口返回到您的應用,Activity會重新開始。

2>用戶在您的應用中執行開始新Activity的操作。當第二個Activity創建好後,當前Activity便停止。 如果用戶之後按了返回按鈕,第一個Activity會重新開始。

3>用戶在其手機上使用您的應用的同時接聽來電。

(2)因為系統在停止時會將您的 Activity 實例保留在系統內存中,您根本無需實onStop() 和 onRestart()或甚至onStart() 方法。對於大多數相對簡單的Activity而言, Activity將停止並重新開始,並且您可能只需使用 onPause() 暫停正在進行的操作,

並從系統資源斷開連接。

(3)用戶離開Activity時,系統會調用 onStop() 停止Activity。 如果用戶在Activity停止時返回,系統會調用 onRestart() ,緊接著調用 onStart() 和 onResume() 。 注意:無論什麼場景導致Activity停止,系統始終會在調用 onStop() 之前調用onPause()。

(4)onStop()

當您的Activity收到 onStop() 方法的調用時,它不再可見,並且應釋放幾乎所有用戶不使用時不需要的資源。一旦您的Activity停止,如果需要恢復系統內存,系統可能會銷毀該實例。在極端情況下,系統可能會僅終止應用進程,而不會調用Activity的最終 onDestroy() 回調,因此您使用 onStop() 釋放可能洩露內存的資源非常重要。盡管 onPause() 方法在 onStop()之前調用,您應使用 onStop() 執行更大、占用更多 CPU 的關閉操作,比如向數據庫寫入信息。

例如,此處是將草稿筆記內容保存在永久存儲中的 onStop() 的實現:

@Override

protectedvoid onStop() {

super.onStop(); // Always call the superclass method first

// Save the note's current draft, becausethe activity is stopping

// and we want to be sure the current noteprogress isn't lost.

ContentValues values = new ContentValues();

values.put(NotePad.Notes.COLUMN_NAME_NOTE,getCurrentNoteText());

values.put(NotePad.Notes.COLUMN_NAME_TITLE,getCurrentNoteTitle());

getContentResolver().update(

mUri, // The URI for the note to update.

values,// The map of column names and new values to apply to them.

null, // No SELECT criteria are used.

null // No WHERE columns are used.

);

}

 

當您的Activity停止時, Activity 對象將駐留在內存中並在Activity繼續時被再次調用。 您無需重新初始化在任何導致進入“繼續”狀態的回調方法過程中創建的組件。 系統還會在布局中跟蹤每個 View 的當前狀態,如果用戶在 EditText 小工具中輸入文本,該內容會保留,因此您無需保存即可恢復它。

4.onStart() / onRestart()

當您的Activity從停止狀態返回前台時,它會接收對 onRestart() 的調用。系統還會在每次您的Activity變為可見時調用 onStart() 方法(無論是正重新開始還是初次創建)。但是,只會在Activity從停止狀態繼續時調用 onRestart() 方法,因此您可以使用它執行只有在Activity之前停止但未銷毀的情況下可能必須執行的特殊恢復工作。應用需要使用 onRestart() 恢復Activity狀態的情況並不常見,因此沒有適用於一般應用群體的任何方法指導原則。但是,因為您的 onStop() 方法應基本清理所有Activity的資源,您將需要在Activity重新開始時重新實例化它們。但是,您還需要在您的Activity初次創建時重新實例化它們(沒有Activity的現有實例)。出於此原因,您應經常使用 onStart() 回調方法作為 onStop() 方法的對應部分,因為系統會在它創建您的Activity以及從停止狀態重新開始Activity時調用 onStart() 。

例如,因為用戶可能在回到它之前已離開應用很長時間, onStart() 方法是確認所需系統功能已啟動的理想選擇:

@Override

protectedvoid onStop() {

super.onStop(); // Always call the superclass method first

// Save the note's current draft, becausethe activity is stopping

// and we want to be sure the current noteprogress isn't lost.

ContentValues values = new ContentValues();

values.put(NotePad.Notes.COLUMN_NAME_NOTE,getCurrentNoteText());

values.put(NotePad.Notes.COLUMN_NAME_TITLE,getCurrentNoteTitle());

getContentResolver().update(

mUri, // The URI for the note to update.

values,// The map of column names and new values to apply to them.

null, // No SELECT criteria are used.

null // No WHERE columns are used.

);

}

 

當系統銷毀您的Activity時,它會調用您的 Activity 的 onDestroy() 方法。因為您通常應已使用 onStop() 釋放大多數您的資源,到您接收對 onDestroy() 的調用時,大多數應用無需做太多操作。此方法是您清理可導致內存洩露的資源的最後一種方法,因

此您應確保其他線程被銷毀且其他長期運行的操作(比如方法跟蹤)也會停止。

5.Recreating an Activity

如果Activity當前被停止或長期未使用,或者前台Activity需要更多資源以致系統必須關閉後台進程恢復內存,系統也可能會銷毀Activity。

當您的Activity因用戶按了返回或Activity自行完成而被銷毀時,系統的 Activity 實例概念將永久消失,因為行為指示不再需要Activity。 但是,如果系統因系統局限性(而非正常應用行為)而銷毀Activity,盡管 Activity 實際實例已不在,系統會記住其存在,這樣,如果用戶導航回實例,系統會使用描述Activity被銷毀時狀態的一組已保存數據創建Activity的新實例。 系統用於恢復先前狀態的已保存數據被稱為“實例狀態”,並且是 Bundle 對象中存儲的鍵值對集合。注意:每次用戶旋轉屏幕時,您的Activity將被銷毀並重新創建。 當屏幕方向變化時,系統會銷毀並重新創建前台Activity,因為屏幕配置已更改並且您的Activity可能需要加載備用資源(比如布局)。為了 Android 系統恢復Activity中視圖的狀態,每個視圖必須具有 android:id 屬性提供的唯一 ID。

要保存有關Activity狀態的其他數據,您必須替代 onSaveInstanceState() 回調方法。當用戶要離開Activity並在Activity意外銷毀時向其傳遞將保存的 Bundle 對象時,系統會調用此方法。如果系統必須稍後重新創建Activity實例,它會將相同的 Bundle 對象同時傳遞給 onRestoreInstanceState() 和 onCreate() 方法。當系統開始停止您的Activity時,它會 調onSaveInstanceState(),因此,您可以指定您希望在 Activity 實例必須重新創建時保存的額外狀態數據。如果Activity被銷毀且必須重新創建相同的實例,系統將在中定義的狀態數據同時傳遞給 onCreate() 方法和onRestoreInstanceState() 方法。

(1) 保存Activity狀態

當您的Activity開始停止時,系統會調用 onSaveInstanceState() 以便您的Activity可以保存帶有鍵值對集合的狀態信息。此方法的默認實現保存有關Activity視圖層次的狀態信息,例如 EditText 小工具中的文本或ListView 的滾動位置。要保存Activity的更多狀態信息,您必須實現 onSaveInstanceState() 並將鍵值對添加至 Bundle 對象。 例如:

static final String STATE_SCORE ="playerScore";

static final String STATE_LEVEL ="playerLevel";

...

@Override

public voidonSaveInstanceState(Bundle savedInstanceState) {

// Save the user's current game state

savedInstanceState.putInt(STATE_SCORE, mCurrentScore);

savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

// Always call the superclass so it can save the view hierarchy state

super.onSaveInstanceState(savedInstanceState);

}

 

注意:始終調用onSaveInstanceState() 的超類實現,以便默認實現可以保存視圖層次的狀態。

(2) 恢復Activity狀態

當您的Activity在先前銷毀之後重新創建時,您可以從系統向Activity傳遞的 Bundle 恢復已保存的狀態。onCreate() 和onRestoreInstanceState() 回調方法均接收包含實例狀態信息的相同 Bundle。因為無論系統正在創建Activity的新實例還是重新創建先前的實例,都會調用 onCreate() 方法,因此您必須在嘗試讀取它之前檢查狀態 Bundle 是否為 null。 如果為 null,則系統將創建Activity的新實例,而不是恢復已銷毀的先前實例。

例如,此處顯示您如何可以在onCreate() 中恢復一些狀態數據:

@Override

protected void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState); // Always call the superclass first

// Check whether we're recreating a previously destroyed instance

if (savedInstanceState != null) {

// Restore value of members from savedstate

mCurrentScore =savedInstanceState.getInt(STATE_SCORE);

mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

} else {

// Probably initialize members withdefault values for a new instance

}

...

}

 

您可以選擇實現系統在onStart() 方法之後調用的onRestoreInstanceState() ,而不是在onCreate() 期間恢復狀態。 系統只在存在要恢復的已保存狀態時調用 onRestoreInstanceState() ,因此您無需檢查 Bundle 是否為 null:

public voidonRestoreInstanceState(Bundle savedInstanceState) {

// Always call the superclass so it can restore the view hierarchy

super.onRestoreInstanceState(savedInstanceState);



// Restore state members from saved instance

mCurrentScore = savedInstanceState.getInt(STATE_SCORE);

mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);

}

 

注意:始終調用onSaveInstanceState() 的超類實現,以便默認實現可以恢復視圖層次的狀態。

(3)onSaveInstanceState:

1>在Activity被覆蓋或退居後台之後,系統資源不足將其殺死,此方法會被調用;

2>在用戶改變屏幕方向時,此方法會被調用;

3>在當前Activity跳轉到其他Activity或者按Home鍵回到主屏,自身退居後台時,此方法會被調用。

第一種情況我們無法保證什麼時候發生,系統根據資源緊張程度去調度;第二種是屏幕翻轉方向時,系統先銷毀當前的Activity,然後再重建一個新的,調用此方法時,我們可以保存一些臨時數據;第三種情況系統調用此方法是為了保存當前窗口各個View組件的狀態onSaveInstanceState的調用順序是在onPause之前後(Android3.0之前是在onPause之前,之後是在onPause之後)。

(4)onRestoreInstanceState:

1>在Activity被覆蓋或退居後台之後,系統資源不足將其殺死,然後用戶又回到了此Activity,此方法會被調用;

2>在用戶改變屏幕方向時,重建的過程中,此方法會被調用。我們可以重寫此方法,以便可以恢復一些臨時數據。
onRestoreInstanceState的調用順序是在onStart之後。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved