日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android settings源代码分析(3)

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android settings源代码分析(3) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本章主要分析google settings里面存儲模塊的代碼。

存儲模塊所在的fragment為:

[html]?view plaincopy
  • <!--?Storage?-->??
  • ??<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
  • /**?
  • ??*?Build?category?to?summarize?specific?physical?{@link?StorageVolume}.?
  • ??*/??
  • ?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
  • /**?
  • ?*?Build?category?to?summarize?internal?storage,?including?any?emulated?
  • ?*?{@link?StorageVolume}.?
  • ?*/??
  • 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
  • /**?
  • ????*?Build?category?to?summarize?specific?physical?{@link?StorageVolume}.?
  • ????*/??
  • ???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;??
  • ???????//?Always?create?the?preference?since?many?code?rely?on?it?existing??
  • ???????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()?{??
  • ???????//?Check?if?external?media?is?in?use.??
  • ???????try?{??
  • ??????????if?(hasAppsAccessingStorage())?{??
  • ??????????????//?Present?dialog?to?user??
  • ??????????????showDialogInner(DLG_CONFIRM_UNMOUNT);??
  • ??????????}?else?{??
  • ??????????????doUnmount();??
  • ??????????}??
  • ???????}?catch?(RemoteException?e)?{??
  • ???????????//?Very?unlikely.?But?present?an?error?dialog?anyway??
  • ???????????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()?{??
  • ???????//?Present?a?toast?here??
  • ???????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)?{??
  • ???????????//?Informative?dialog?to?user?that?unmount?failed.??
  • ???????????showDialogInner(DLG_ERROR_UNMOUNT);??
  • ???????}??
  • ???}??

  • 原文地址:http://blog.csdn.net/zhudaozhuan/article/details/40621335

    總結

    以上是生活随笔為你收集整理的android settings源代码分析(3)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。