編輯:關於Android編程
各位童鞋,對於Android而言,離開Activity,基本上就無從談起開發,那麼親們對於Activity的實現原理熟悉麼?反正我在沒有看源碼之前是不熟悉的,下面,咱們一起按照老規矩,一起來看一下Activity的源碼吧。這一篇文章主要講解的是Activity如何對對話框Dialog進行實現統一管理的。
首先我們看到的是這樣一個類:
private static class ManagedDialog { Dialog mDialog; Bundle mArgs; } private SparseArraymManagedDialogs;
接下來我們需要看的一個方法是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首先獲取Bundle的對象,獲取Bundle對象中存儲的Dialog的id的數組。創建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); } } } }
創建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); }
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; }
關於Activity中的Dialog的管理就講到這裡,希望大家能夠有所收獲。
動態加載、插件化開發很重要當今360手機助手(DroidPlugin),個人開源(VirtualApp)、百度DL、攜程DynamicAPK都用到了該技術本例的大概思路是
1 背景Android系統提供了很多豐富的API去實現UI的2D與3D動畫,最主要的劃分可以分為如下幾類:View Animation: 視圖動畫在古老的Android版
在前文中,我們分析了Android應用程序窗口的運行上下文環境的創建過程。由此可知,每一個Activity組件都有一
春節放假回老家,發現家裡的貓換型號了,具備無線功能,但是悲劇的是連接到無線網絡後還得撥號上網,依據經驗,只能使用超級管理員開通自動撥號功能,知己知彼,我們首