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

4、Android Activity的生命周期 Activity的生命周期

編輯:關於Android編程

\

1、完整生命周期

上圖是Android Activity的生命周期圖,其中Resumed、Paused、StZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcHBlZNe0zKzKx76yzKy1xKOs1eLI/bj217TMrM/CtcRBY3Rpdml0ebTm1NrKsbzkvc+zpKGjPC9wPgo8cD6jqDGjqVJlc3VtZWSjutTatMvXtMysyrGjrNPDu6e/ydLU0+tBY3Rpdml0eb340NC9u7ulo6xBY3Rpdml0edTa1+7HsLbLPC9wPgo8cD6jqDKjqVBhdXNlZKO61Nq0y9e0zKzKsaOsQWN0aXZpdHmxu8HtzeLSu7j2QWN0aXZpdHnV2rjHo6y0y0FjdGl2aXR5sru/yb3TytzTw7unyuTI69DFz6Kho8HtzeLSu7j2QWN0aXZpdHnAtLW91+7HsMPmo6yw6824w/e1xKOstauyorK7u+G4srjH1fu49sbBxLuhozwvcD4KPHA+o6gzo6lTdG9wcGVko7rU2rTL17TMrMqxo6xBY3Rpdml0ec3qyKuxu9L+stijrLK7v8m8+6GjsaPB9LWxx7DQxc+io6xBY3Rpdml0ebK71rTQ0MjOus60+sLroaM8L3A+CjxwPqOoNKOpQ3JlYXRlZNPrU3RhcnRlZKO6z7XNs7X308NvbkNyZWF0ZSgpuvPRuMvZtffTw29uU3RhcnQoKaOsyLu689G4y9nWtNDQb25SZXN1bWUoKaGjPC9wPgo8cD7S1MnPvs3Kx0FuZHJvaWS1xEFjdGl2aXR51fu49sn6w/zW3MbaoaM8L3A+CjxoMj4yoaLW90FjdGl2aXR5PC9oMj4KPHA+08O7p7/J0tTWuLaos8zQ8sb0tq+1xNb3vefD5qOstMvKsbG7yfnD986qobBsYXVuY2hlcrvybWFpbqGxQWN0aXZpdHm1xG9uQ3JlYXRlKCm3vbeosbu199PDo6yzyc6qs8zQ8rXEyOu/2rqvyv2ho7jDyOu/2kFjdGl2aXR5v8nS1NTaQW5kcm9pZE1hbmlmZXN0LnhtbNbQtqjS5db3QWN0aXZpdHmho7TLyrGjrNb3QWN0aXZpdHmx2NDryrnTw9LUz8Kx6sepyfnD96O6PC9wPgo8cD48cHJlIGNsYXNzPQ=="brush:java;">

3、一個新的Activity實例

系統首先調用新Activity的onCreate()方法,所以,我們必須實現onCreate()方法。如:聲明UI元素、定義成員變量、配置UI等。但是事情不宜太多,避免啟動程序太久而看不到界面。

TextView mTextView; // Member variable for text view in the layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml
file
    setContentView(R.layout.main_activity);

    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);

    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}
onCreate()執行完即調用onStart()和onResume()方法,Activity不會在Created或者Started狀態停留。


4、銷毀Activity

Activity的最後一個回調是onDestroy(),系統會執行這個方法做為你的Activity要從系統中完全刪除的信號。大多數APP不需實現此方法,因為局部類的references會隨著Activity的銷毀而銷毀。並且Activity應該在onPause()和onStop()方法中執行清楚Activity資源的操作。如果Activity在onCreate()時創建的後台線程,或者是其他有可能導致內存洩露的資源,你應該在onDestroy()時殺死它們。

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass

    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}
系統通常是在執行了onPause()與onStop()後在調用onDestroy(),除非在onCreate()中調用了finish()。例如,如果你的Activity只是做了一個臨時的邏輯跳轉功能,它使用用來決定跳轉到下一個Activity,這樣,你需要在onCreate()中調用finish()方法。系統就會直接調用onDestroy方法,其他生命周期就不會被執行。

5、暫停與恢復

當前Activity被其它可見組件阻塞,當前Activity部分可見,當前Activity進入Pause狀態。系統調用Activity中的onPause()方法,執行onResume()方法恢復。 當前Activity被其它組件完全阻塞,當前Activity完全不可見,則當前Activity進入Stop狀態。
當系統調用你的Activity中的onPause(),從技術上講,那意味著你的Activity仍然處於部分可見的狀態。通常在onPause()回調方法裡面做下面的事情。 (1)停止動畫或者其他正在運行的操作,減少CPU浪費 (2)提交沒有保存的改變,但僅僅是用戶離開時保存的內容,如郵件 (3)釋放系統資源,如broadcast receivers、sensors、GPS或者其他任何影響電量的資源。 (4)如果程序正在使用Camera,onPause()會是一個比較好的地方去釋放資源的操作。
@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first

    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}
通常,不應該使用onPause()來保存用戶改變的數據到永久存儲上,當你確認用戶期待那些改變能夠自動保存的時候,才可以把那些數據存儲到永久存儲。然而,應該避免在onPause()時執行CPU-intensive的工作,例如寫數據到DB,因為他會導致切換Activity變得緩慢。這些工作應該放到onStop()中去坐。 如果,Activity實際上要被Stop,那麼應減少在onPause中的工作量,提高流暢性。 恢復Activity 用戶從Pause狀態恢復時,調用onResume()方法。此時Activity處於最前台,包括第一次創建時,此時,應該在onResume中初始化那些你在onPause方法裡釋放掉的組件,並執行那些Activity每次進入Resumed state都需要的初始化動作。
@Override
public void onResume() {
    super.onResume();  // Always call the superclass method first

    // Get the Camera instance as the activity achieves full user focus
    if (mCamera == null) {
        initializeCamera(); // Local method to handle camera init
    }
}

6、停止與重啟Activity

恰當的停止與重啟Activity會使用戶感知程序的進行。下面一些場景涉及停止與重啟: (1)用戶打開最近使用的App的菜單並切換到另外一個App,此時,你的App是被停止的,用戶回到你的App,那麼你的Activity被重啟。 (2)用戶在App中啟動一個新的Activity的操作,當前Activity會在新Activity創建後stop,如果用戶點擊back按鈕,回到上一個Activity,重啟 (3)用戶使用App,接到來電時。 停止狀態UI不可見。系統在Activity停止時會在內存中保存了Activity實例,有時不需事先onStop(),onRestart()甚至onStart()方法,因為大多數的activity相對簡單,activity會自己停止與重啟。你只需要使用onPause來停止正在運行的動作,並斷開系統資源鏈接。 \ 上圖顯示:當用戶離開你的Activity,系統會調用onStop()來停止Activity,用戶返回時調用onRestart(),然後迅速調用onStart()與onResume(),無論什麼原因導致Activity停止,系統總會在onStop之前調用onPause 停止Activity 當你的Activity調用onStop方法,Activity不再可見,並且應該釋放那些不再需要的所有資源,一旦你的Activity停止了,系統會在不需要的這個activity時銷毀它的實例。在極端情況下,系統會直接殺死你的App進程,並且不執行Activity的onDestroy()回調函數,因此你需要在onStop()來釋放資源,否則內存洩露。盡管onPause方法在onStop之前調用,應應該使用onStop來執行CPU-intensive的shut-down操作。如寫數據到DB。 當Activity停止,其對象會保存在內存中,並且在Resume時重新調用,不需在恢復到Resumed state狀態前初始化那些被保存在內存中得組件,系統為我們保存了每一個在布局中的視圖的當前狀態。即使系統會在Activity stop時銷毀這個Activity,它仍然會保存View對象的狀態到一個Bundle中,並且在用戶返回這個Activity時恢復他們。

重新創建Activity:當Activity在屏幕被旋轉時,會被destroy與recreated。此時會加載一些alternative的資源,如layout。默認情況下,系統使用Bundle實例來保存每一個視圖對象中得信息。為了使Android系統能夠恢復Activity中的View狀態,每個View都必須有一個唯一的ID
為了確保額外更多的數據到saved instance state,在Activity的聲明周期裡面存在一個添加的回調函數,必須重寫onSaveInstanceState(),當用戶離開你的Activity時,系統會調用它。當系統調用這個函數時,系統會在你的Activity被一場Destroy時傳遞Bundle對象,這樣,你可以增加額外的信息到Bundle中,並保存在系統中。如果系統在Activity被Destroy之後想重新創建這個Activity實例時,之前的那個Bundle對象會被傳遞到Activity的onRestoreInstanceState()方法和onCreate()方法中。
\
保存Activity狀態:當Activity開始Stop時,系統會調用onSaveInstanceState(),因此你的Activity可以用鍵值對的集合來保存狀態信息,這個方法會默認保存Activity視圖的狀態信息,例如在EditText組件中得文本或者是ListView的滑動位置。為了給Activity保存額外的狀態信息,你必須實現onSaveInstanceState()並增加鍵值對到Bundle中。如:
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(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);
}

恢復Activity狀態:當你的Activity從Destroy中重建,你可以從系統傳遞給你的Activity的Bundle中恢復保存的狀態。onCreate()與onRestoreInstanceState()回調方法都接收到了同樣的Bundle,裡面包含同樣的實例狀態信息。因為onCreate()方法會在第一次創建新的Activity實例與重新創建之前被Destroy的實例時都被調用,你必須嘗試讀取Bundle對象之前檢查它是否為NULL,如果為NULL,系統第一次創建新Activity。否則是恢復被Destroy的Activity。
protected void onCreate(Bundle savedInstanceState) {
    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 saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}
我們可以選擇實現onRestoreInstanceState(),而不是在onCreate方法裡恢復數據。onRestoreInstanceState()方法會在onStart()方法之後執行,系統僅僅會在存在需要恢復的狀態信息時才會調用onRestoreInstanceState(),因此不需檢查Bundle是否為NULL。
public void onRestoreInstanceState(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);
}

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