生活随笔
收集整理的這篇文章主要介紹了
android settings源代码分析(3)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本章主要分析google settings里面存儲(chǔ)模塊的代碼。
存儲(chǔ)模塊所在的fragment為:
[html]?view plaincopy
?? ??<header?? ??????android:id="@+id/storage_settings"?? ??????android:fragment="com.android.settings.deviceinfo.Memory"?? ??????android:icon="@drawable/ic_settings_storage"?? ??????android:title="@string/storage_settings"?/>?? 我們現(xiàn)在看Memory這個(gè)類
[java]?view plaincopy
@Override?? ??public?void?onCreate(Bundle?icicle)?{?? ??????super.onCreate(icicle);?? ?? ??????final?Context?context?=?getActivity();?? ?? ??????mUsbManager?=?(UsbManager)?getSystemService(Context.USB_SERVICE);?? ?? ??????mStorageManager?=?StorageManager.from(context);?? ??????mStorageManager.registerListener(mStorageListener);?? ?? ??????addPreferencesFromResource(R.xml.device_info_memory);?? ?? ??????addCategory(StorageVolumePreferenceCategory.buildForInternal(context));?? ?? ??????final?StorageVolume[]?storageVolumes?=?mStorageManager.getVolumeList();?? ??????for?(StorageVolume?volume?:?storageVolumes)?{?? ??????????if?(!volume.isEmulated())?{?? ??????????????addCategory(StorageVolumePreferenceCategory.buildForPhysical(context,?volume));?? ??????????}?? ??????}?? ?? ??????setHasOptionsMenu(true);?? ??}?? 在onCreate函數(shù)中,主要做了幾件事情:
1.各種初始化
2.實(shí)例化布局,最主要是對(duì)Category的添加
3.獲取當(dāng)前掛載的volume,并且實(shí)例化為Category
?
Category最主要的是StorageVolumePreferenceCategory,構(gòu)造函數(shù)如下:
[java]?view plaincopy
? ? ?? ?public?static?StorageVolumePreferenceCategory?buildForPhysical(?? ?????????Context?context,?StorageVolume?volume)?{?? ?????return?new?StorageVolumePreferenceCategory(context,?volume);?? ?}?? ?? ?private?StorageVolumePreferenceCategory(Context?context,?StorageVolume?volume)?{?? ?????super(context);?? ?? ?????mVolume?=?volume;?? ?????mMeasure?=?StorageMeasurement.getInstance(context,?volume);?? ?? ?????mResources?=?context.getResources();?? ?????mStorageManager?=?StorageManager.from(context);?? ?????mUserManager?=?(UserManager)?context.getSystemService(Context.USER_SERVICE);?? ?? ?????setTitle(volume?!=?null???volume.getDescription(context)?? ?????????????:?context.getText(R.string.internal_storage));?? ?}?? 構(gòu)造函數(shù)會(huì)被如下函數(shù)調(diào)用:
[java]?view plaincopy
? ? ? ?? public?static?StorageVolumePreferenceCategory?buildForInternal(Context?context)?{?? ????return?new?StorageVolumePreferenceCategory(context,?null);?? }?? 到這里,主要是在Category里面做一些初始化,對(duì)于存儲(chǔ)fragment最上面的“內(nèi)部存儲(chǔ)設(shè)備”text顯示就是在構(gòu)造函數(shù)中完成:
[java]?view plaincopy
setTitle(volume?!=?null???volume.getDescription(context)?? ????????????????:?context.getText(R.string.internal_storage));?? ?
對(duì)于外置設(shè)備Category的創(chuàng)建,主要是在:
[java]?view plaincopy
? ? ?? ???public?static?StorageVolumePreferenceCategory?buildForPhysical(?? ???????????Context?context,?StorageVolume?volume)?{?? ???????return?new?StorageVolumePreferenceCategory(context,?volume);?? ???}?? 唯一的區(qū)別就是Volume是否為NULL。
?
創(chuàng)建Category后,主要是對(duì)preference的創(chuàng)建,主要是在init函數(shù):
[java]?view plaincopy
public?void?init()?{?? ???????final?Context?context?=?getContext();?? ?? ???????removeAll();?? ?? ???????final?UserInfo?currentUser;?? ???????try?{?? ???????????currentUser?=?ActivityManagerNative.getDefault().getCurrentUser();?? ???????}?catch?(RemoteException?e)?{?? ???????????throw?new?RuntimeException("Failed?to?get?current?user");?? ???????}?? ?? ???????final?List<UserInfo>?otherUsers?=?getUsersExcluding(currentUser);?? ???????final?boolean?showUsers?=?mVolume?==?null?&&?otherUsers.size()?>?0;?? ?? ???????mUsageBarPreference?=?new?UsageBarPreference(context);?? ???????mUsageBarPreference.setOrder(ORDER_USAGE_BAR);?? ???????addPreference(mUsageBarPreference);?? ?? ???????mItemTotal?=?buildItem(R.string.memory_size,?0);?? ???????mItemAvailable?=?buildItem(R.string.memory_available,?R.color.memory_avail);?? ???????addPreference(mItemTotal);?? ???????addPreference(mItemAvailable);?? ?? ???????mItemApps?=?buildItem(R.string.memory_apps_usage,?R.color.memory_apps_usage);?? ???????mItemDcim?=?buildItem(R.string.memory_dcim_usage,?R.color.memory_dcim);?? ???????mItemMusic?=?buildItem(R.string.memory_music_usage,?R.color.memory_music);?? ???????mItemDownloads?=?buildItem(R.string.memory_downloads_usage,?R.color.memory_downloads);?? ???????mItemCache?=?buildItem(R.string.memory_media_cache_usage,?R.color.memory_cache);?? ???????mItemMisc?=?buildItem(R.string.memory_media_misc_usage,?R.color.memory_misc);?? ?? ???????mItemCache.setKey(KEY_CACHE);?? ?? ???????final?boolean?showDetails?=?mVolume?==?null?||?mVolume.isPrimary();?? ???????if?(showDetails)?{?? ???????????if?(showUsers)?{?? ???????????????addPreference(new?PreferenceHeader(context,?currentUser.name));?? ???????????}?? ?? ???????????addPreference(mItemApps);?? ???????????addPreference(mItemDcim);?? ???????????addPreference(mItemMusic);?? ???????????addPreference(mItemDownloads);?? ???????????addPreference(mItemCache);?? ???????????addPreference(mItemMisc);?? ?? ???????????if?(showUsers)?{?? ???????????????addPreference(new?PreferenceHeader(context,?R.string.storage_other_users));?? ?? ???????????????int?count?=?0;?? ???????????????for?(UserInfo?info?:?otherUsers)?{?? ???????????????????final?int?colorRes?=?count++?%?2?==?0???R.color.memory_user_light?? ???????????????????????????:?R.color.memory_user_dark;?? ???????????????????final?StorageItemPreference?userPref?=?new?StorageItemPreference(?? ???????????????????????????getContext(),?info.name,?colorRes,?info.id);?? ???????????????????mItemUsers.add(userPref);?? ???????????????????addPreference(userPref);?? ???????????????}?? ???????????}?? ???????}?? ?? ???????final?boolean?isRemovable?=?mVolume?!=?null???mVolume.isRemovable()?:?false;?? ????????? ???????mMountTogglePreference?=?new?Preference(context);?? ???????if?(isRemovable)?{?? ???????????mMountTogglePreference.setTitle(R.string.sd_eject);?? ???????????mMountTogglePreference.setSummary(R.string.sd_eject_summary);?? ???????????addPreference(mMountTogglePreference);?? ???????}?? ?? ???????final?boolean?allowFormat?=?mVolume?!=?null;?? ???????if?(allowFormat)?{?? ???????????mFormatPreference?=?new?Preference(context);?? ???????????mFormatPreference.setTitle(R.string.sd_format);?? ???????????mFormatPreference.setSummary(R.string.sd_format_summary);?? ???????????addPreference(mFormatPreference);?? ???????}?? ?? ???????final?IPackageManager?pm?=?ActivityThread.getPackageManager();?? ???????try?{?? ???????????if?(pm.isStorageLow())?{?? ???????????????mStorageLow?=?new?Preference(context);?? ???????????????mStorageLow.setOrder(ORDER_STORAGE_LOW);?? ???????????????mStorageLow.setTitle(R.string.storage_low_title);?? ???????????????mStorageLow.setSummary(R.string.storage_low_summary);?? ???????????????addPreference(mStorageLow);?? ???????????}?else?if?(mStorageLow?!=?null)?{?? ???????????????removePreference(mStorageLow);?? ???????????????mStorageLow?=?null;?? ???????????}?? ???????}?catch?(RemoteException?e)?{?? ???????}?? ???}?? 對(duì)preference數(shù)據(jù)進(jìn)行更新是在:
[java]?view plaincopy
public?void?updateApproximate(long?totalSize,?long?availSize)?{?? ????mItemTotal.setSummary(formatSize(totalSize));?? ????mItemAvailable.setSummary(formatSize(availSize));?? ?? ????mTotalSize?=?totalSize;?? ?? ????final?long?usedSize?=?totalSize?-?availSize;?? ?? ????mUsageBarPreference.clear();?? ????mUsageBarPreference.addEntry(0,?usedSize?/?(float)?totalSize,?android.graphics.Color.GRAY);?? ????mUsageBarPreference.commit();?? ?? ????updatePreferencesFromState();?? }?? ?
當(dāng)點(diǎn)擊cache prefrence時(shí),會(huì)彈出dialog,主要是在Memory.java中響應(yīng):
[java]?view plaincopy
public?boolean?onPreferenceTreeClick(PreferenceScreen?preferenceScreen,?Preference?preference)?{?? ???????if?(StorageVolumePreferenceCategory.KEY_CACHE.equals(preference.getKey()))?{?? ???????????ConfirmClearCacheFragment.show(this);?? ???????????return?true;?? ???????}?? 查看ConfirmClearCacheFragment的函數(shù):
[java]?view plaincopy
@Override?? ???public?Dialog?onCreateDialog(Bundle?savedInstanceState)?{?? ???????final?Context?context?=?getActivity();?? ?? ???????final?AlertDialog.Builder?builder?=?new?AlertDialog.Builder(context);?? ???????builder.setTitle(R.string.memory_clear_cache_title);?? ???????builder.setMessage(getString(R.string.memory_clear_cache_message));?? ?? ???????builder.setPositiveButton(android.R.string.ok,?new?DialogInterface.OnClickListener()?{?? ???????????@Override?? ???????????public?void?onClick(DialogInterface?dialog,?int?which)?{?? ???????????????final?Memory?target?=?(Memory)?getTargetFragment();?? ???????????????final?PackageManager?pm?=?context.getPackageManager();?? ???????????????final?List<PackageInfo>?infos?=?pm.getInstalledPackages(0);?? ???????????????final?ClearCacheObserver?observer?=?new?ClearCacheObserver(?? ???????????????????????target,?infos.size());?? ???????????????for?(PackageInfo?info?:?infos)?{?? ???????????????????pm.deleteApplicationCacheFiles(info.packageName,?observer);?? ???????????????}?? ???????????}?? ???????});?? ???????builder.setNegativeButton(android.R.string.cancel,?null);?? ?? ???????return?builder.create();?? ???}?? 會(huì)通過(guò)PackageManager獲取所有安裝apk,然后清除所有apk的緩存數(shù)據(jù)。
?
點(diǎn)擊“卸載SD卡”,會(huì)彈出dialog,對(duì)應(yīng)的代碼為:
[java]?view plaincopy
private?void?unmount()?{?? ????????? ???????try?{?? ??????????if?(hasAppsAccessingStorage())?{?? ???????????????? ??????????????showDialogInner(DLG_CONFIRM_UNMOUNT);?? ??????????}?else?{?? ??????????????doUnmount();?? ??????????}?? ???????}?catch?(RemoteException?e)?{?? ????????????? ???????????Log.e(TAG,?"Is?MountService?running?");?? ???????????showDialogInner(DLG_ERROR_UNMOUNT);?? ???????}?? ???}?? [java]?view plaincopy
@Override?? public?Dialog?onCreateDialog(int?id)?{?? ????switch?(id)?{?? ????case?DLG_CONFIRM_UNMOUNT:?? ????????????return?new?AlertDialog.Builder(getActivity())?? ????????????????.setTitle(R.string.dlg_confirm_unmount_title)?? ????????????????.setPositiveButton(R.string.dlg_ok,?new?DialogInterface.OnClickListener()?{?? ????????????????????public?void?onClick(DialogInterface?dialog,?int?which)?{?? ????????????????????????doUnmount();?? ????????????????????}})?? ????????????????.setNegativeButton(R.string.cancel,?null)?? ????????????????.setMessage(R.string.dlg_confirm_unmount_text)?? ????????????????.create();?? [java]?view plaincopy
private?void?doUnmount()?{?? ????????? ???????Toast.makeText(getActivity(),?R.string.unmount_inform_text,?Toast.LENGTH_SHORT).show();?? ???????IMountService?mountService?=?getMountService();?? ???????try?{?? ???????????sLastClickedMountToggle.setEnabled(false);?? ???????????sLastClickedMountToggle.setTitle(getString(R.string.sd_ejecting_title));?? ???????????sLastClickedMountToggle.setSummary(getString(R.string.sd_ejecting_summary));?? ???????????mountService.unmountVolume(sClickedMountPoint,?true,?false);?? ???????}?catch?(RemoteException?e)?{?? ????????????? ???????????showDialogInner(DLG_ERROR_UNMOUNT);?? ???????}?? ???}??
原文地址:http://blog.csdn.net/zhudaozhuan/article/details/40621335
總結(jié)
以上是生活随笔為你收集整理的android settings源代码分析(3)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。