Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中Activity源碼中是如何對對話框Dialog進行處理的

Android中Activity源碼中是如何對對話框Dialog進行處理的

編輯:關於Android編程

各位童鞋,對於Android而言,離開Activity,基本上就無從談起開發,那麼親們對於Activity的實現原理熟悉麼?反正我在沒有看源碼之前是不熟悉的,下面,咱們一起按照老規矩,一起來看一下Activity的源碼吧。這一篇文章主要講解的是Activity如何對對話框Dialog進行實現統一管理的。

首先我們看到的是這樣一個類:

 private static class ManagedDialog {
        Dialog mDialog;
        Bundle mArgs;
    }
    private SparseArray mManagedDialogs;

很明顯,ManagedDialog是Android中定義的一個管理Dialog的數據模型,裡面的成員變量很簡單,一個Dialog的變量,一個存儲Dialog的各種狀態的變量,Bundle的類型的mArgs。同時在Activity中,我們還可以看到這樣的一個變量,mManagedDialogs,大家把這個變量看成是一個HashMap的類型,當然之所以沒有采用HashMap的這種數據結構,文檔上說效率要高於HashMap。


接下來我們需要看的一個方法是restoreManagedDialogs,也就是說是恢復被管理的Dialog的狀態。

 private void restoreManagedDialogs(Bundle savedInstanceState) {
        final Bundle b = savedInstanceState.getBundle(SAVED_DIALOGS_TAG);
        if (b == null) {
            return;
        }
        final int[] ids = b.getIntArray(SAVED_DIALOG_IDS_KEY);
        final int numDialogs = ids.length;
        mManagedDialogs = new SparseArray(numDialogs);
        for (int i = 0; i < numDialogs; i++) {
            final Integer dialogId = ids[i];
            Bundle dialogState = b.getBundle(savedDialogKeyFor(dialogId));
            if (dialogState != null) {
                final ManagedDialog md = new ManagedDialog();
                md.mArgs = b.getBundle(savedDialogArgsKeyFor(dialogId));
                md.mDialog = createDialog(dialogId, dialogState, md.mArgs);
                if (md.mDialog != null) {
                    mManagedDialogs.put(dialogId, md);
                    onPrepareDialog(dialogId, md.mDialog, md.mArgs);
                    md.mDialog.onRestoreInstanceState(dialogState);
                }
            }
        }
    }
首先獲取Bundle的對象,獲取Bundle對象中存儲的Dialog的id的數組。創建SparseArray列表對象的集合。通過for循環迭代,通過存儲的數據,創建新的Dialog,進行恢復。

創建Dialog會回調到下面的方法體中來:

private Dialog createDialog(Integer dialogId, Bundle state, Bundle args) {
        final Dialog dialog = onCreateDialog(dialogId, args);
        if (dialog == null) {
            return null;
        }
        dialog.dispatchOnCreate(state);
        return dialog;
    }
我們會發現,實際在Activity的源碼中,onCreateDialog內部是空的,也就是說,我們需要自己定義的Activity中重寫當前的方法,創建我們的Dialog,然後會在這裡觸發到Dialog的onCreate方法。


有了前面的恢復,就必然有現在的存儲Dialog的狀態的數據:

private void saveManagedDialogs(Bundle outState) {
        if (mManagedDialogs == null) {
            return;
        }
        final int numDialogs = mManagedDialogs.size();
        if (numDialogs == 0) {
            return;
        }
        Bundle dialogState = new Bundle();
        int[] ids = new int[mManagedDialogs.size()];
        for (int i = 0; i < numDialogs; i++) {
            final int key = mManagedDialogs.keyAt(i);
            ids[i] = key;
            final ManagedDialog md = mManagedDialogs.valueAt(i);
            dialogState.putBundle(savedDialogKeyFor(key), md.mDialog.onSaveInstanceState());
            if (md.mArgs != null) {
                dialogState.putBundle(savedDialogArgsKeyFor(key), md.mArgs);
            }
        }
        dialogState.putIntArray(SAVED_DIALOG_IDS_KEY, ids);
        outState.putBundle(SAVED_DIALOGS_TAG, dialogState);
    }

同時在Activity的onDestroy的方法中,會對目前所管理的所有的Dialog進行銷毀。

if (mManagedDialogs != null) {
            final int numDialogs = mManagedDialogs.size();
            for (int i = 0; i < numDialogs; i++) {
                final ManagedDialog md = mManagedDialogs.valueAt(i);
                if (md.mDialog.isShowing()) {
                    md.mDialog.dismiss();
                }
            }
            mManagedDialogs = null;
        }

for循環進行迭代,最後對Dialog的集合引用賦值為空的指針。

關於Activity中的Dialog的管理就講到這裡,希望大家能夠有所收獲。







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