Android中Activity源碼中是如何對對話方塊Dialog進行處理的,androiddialog

來源:互聯網
上載者:User

Android中Activity源碼中是如何對對話方塊Dialog進行處理的,androiddialog

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

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

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

很明顯,ManagedDialog是Android中定義的一個管理Dialog的資料模型,裡面的成員變數很簡單,一個Dialog的變數,一個儲存Dialog的各種狀態的變數,Bundle的類型的mArgs。同時在Activity中,我們還可以看到這樣的一個變數,mManagedDialogs,大家把這個變數看成是一個HashMap<Integer,ManagedDialog>的類型,當然之所以沒有採用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<ManagedDialog>(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<ManagedDialog>列表對象的集合。通過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的管理就講到這裡,希望大家能夠有所收穫。






      

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.