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

[Android基礎]Activity的生命周期

編輯:關於Android編程

今天面試被問及了一個問題:Activity A、Activity B,Activity A 被B覆蓋的時候,Activity生命周期中哪幾個方法被調用了?Activity A、Dialog B對話框覆蓋了Activity A,Activity生命周期中哪些方法被調用了?答案等下揭曉:

我們經常使用Activity,也知道Activity的生命周期中有onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart這些方法,那麼這些方法什麼時候會被調用呢?

首先我們來看下面經典的生命周期圖流程圖:

\

相信不少朋友看過這個流程圖,也基本了解了Activity的生命周期:

1,啟動一個Activity: 系統會調用 onCreate()--->onStart()--->onResume(),Activity進入運行狀態。

2,用戶退出當前Activity並關閉應用(如點擊返回按鈕):系統會調用 onPause()--->onStop()--->onDestroy(),

3,當前Activity被其他Activity覆蓋或點擊電源鍵:系統會調用 onPause()--->onStop();Activity進入停滯狀態

4,當前Activity跳轉到一個新的Activity界面或者點擊Home鍵:系統會調用 onPause()--->onStop();Activity進入停滯狀態

5,從上一個Activity返回到當前Activity:系統會調用 onRestart()--->onStart()--->onResume();當前Activity進入運行狀態。

6,橫豎屏切換:當前Activity 系統會調用 onPause()--->onStop()--->onDestroy(); 然後重新創建一個新的Activity:onCreate()--->onStart()--->onResume();

那麼今天面試中的問題:彈出對話框生命周期會是什麼情況呢?

7,彈出對話框(PopupWindow,Dialog):
此時系統並沒有將Activity從棧頂移除或是有另一個Activity覆蓋當前Activity的情況。所以系統並不會調用Activity中生命周期中的方法。

下面結合實例,來演示一下各個情況:

 

public class MainActivity extends Activity {

    private static final String TAG = MainActivity;
    private Button mBtnShowDialog;
    private Button mBtnShowPopWindow;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBtnShowDialog = (Button) findViewById(R.id.button);
        mBtnShowPopWindow = (Button) findViewById(R.id.btn_show_pop);
        mBtnShowDialog.setOnClickListener(listener);
        mBtnShowPopWindow.setOnClickListener(listener);
        Log.i(TAG, ==onCreate()==);
    }

    // 點擊事件
    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.button:
                    doShowDialog();
                    break;
                case R.id.btn_show_pop:
                    doShowPopWindow(v);
                    break;
            }
        }
    };

    // 顯示對話框
    public void doShowDialog(){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(對話框);
        builder.setMessage(對話框消息);
        builder.setPositiveButton(確定, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(MainActivity.this, CameraActivity.class);
                startActivity(intent);
            }
        });
        builder.show();
    }

    // 顯示彈窗
    public void doShowPopWindow(View v){
        PopupWindow window = new PopupWindow();
        View view = this.getLayoutInflater().inflate(R.layout.popup_window, null);
        window.setContentView(view);
        window.setWidth(100);
        window.setHeight(100);
        window.showAsDropDown(v);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        Log.i(TAG,==onWindowFocusChanged== + hasFocus);
    }

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

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

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

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

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

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

    // 此方法在被橫豎屏切換時會被調用,
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i(TAG,==onRestoreInstanceState==);
    }

    // 主要用來在Activity失去焦點,Activity不可顯示前保存一些狀態值,該方法在onStart方法之後在onStop方法之前被調用
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(TAG, ==onSaveInstanceState==);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.i(TAG, ==onConfigurationChanged==);
    }
}

 

參考其他資料:我添加了onWindowFocusChanged、onSaveInstanceState、onRestoreInstanceState、onConfigurationChanged方法;

 

1,onWindowFocusChanged方法:Called when the current Window of the activity gains or loses focus.當窗口獲取或者失去焦點的時候會被調用。

(1)在Activity被首次被創建,窗口獲取到焦點

\

(2)點擊Home鍵或者點擊鍵鎖屏

\

(3)再次顯示應用

\

還有當用戶退出當前Activity,當前Activity被其他Activity覆蓋的時候同樣也會被調用。(建議屏蔽該方法,以方便後面的測試)

2,onSaveInstanceState方法:Called to retrieve per-instance state from an activity before being killed so that the state can be restored inonCreate(Bundle) or onRestoreInstanceState(Bundle) 在Activity被系統Kill前保存一些狀態值,以便在onCreate或者onRestoreInstanceState方法使用。

3,onRestoreInstanceState方法:This method is called after onStart() when the activity is being re-initialized from a previously saved state, given here in savedInstanceState.當前Activity重新被初始化的時候調用。

4,onConfigurationChanged方法:Called by the system when the device configuration changes while your component is running.當設備的配置發生改變時會被調用。

 

 

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