生活随笔
收集整理的這篇文章主要介紹了
android settings源代码分析(3)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本章主要分析google settings里面存儲模塊的代碼。
存儲模塊所在的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"?/>?? 我們現在看Memory這個類
[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函數中,主要做了幾件事情:
1.各種初始化
2.實例化布局,最主要是對Category的添加
3.獲取當前掛載的volume,并且實例化為Category
?
Category最主要的是StorageVolumePreferenceCategory,構造函數如下:
[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));?? ?}?? 構造函數會被如下函數調用:
[java]?view plaincopy
? ? ? ?? public?static?StorageVolumePreferenceCategory?buildForInternal(Context?context)?{?? ????return?new?StorageVolumePreferenceCategory(context,?null);?? }?? 到這里,主要是在Category里面做一些初始化,對于存儲fragment最上面的“內部存儲設備”text顯示就是在構造函數中完成:
[java]?view plaincopy
setTitle(volume?!=?null???volume.getDescription(context)?? ????????????????:?context.getText(R.string.internal_storage));?? ?
對于外置設備Category的創建,主要是在:
[java]?view plaincopy
? ? ?? ???public?static?StorageVolumePreferenceCategory?buildForPhysical(?? ???????????Context?context,?StorageVolume?volume)?{?? ???????return?new?StorageVolumePreferenceCategory(context,?volume);?? ???}?? 唯一的區別就是Volume是否為NULL。
?
創建Category后,主要是對preference的創建,主要是在init函數:
[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)?{?? ???????}?? ???}?? 對preference數據進行更新是在:
[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();?? }?? ?
當點擊cache prefrence時,會彈出dialog,主要是在Memory.java中響應:
[java]?view plaincopy
public?boolean?onPreferenceTreeClick(PreferenceScreen?preferenceScreen,?Preference?preference)?{?? ???????if?(StorageVolumePreferenceCategory.KEY_CACHE.equals(preference.getKey()))?{?? ???????????ConfirmClearCacheFragment.show(this);?? ???????????return?true;?? ???????}?? 查看ConfirmClearCacheFragment的函數:
[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();?? ???}?? 會通過PackageManager獲取所有安裝apk,然后清除所有apk的緩存數據。
?
點擊“卸載SD卡”,會彈出dialog,對應的代碼為:
[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
總結
以上是生活随笔為你收集整理的android settings源代码分析(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。