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的管理就講到這裡,希望大家能夠有所收穫。