转载请注明出处:http://blog.csdn.net/droyon/article/details/39891355
一、所有、正在执行、已停用、USB存储设备、已下载TAB页界面元素标注。
1、图标。
boolean ensureIconLocked(Context context, PackageManager pm) { if (this.icon == null) { if (this.apkFile.exists()) { this.icon = this.info.loadIcon(pm); return true; } else { this.mounted = false; this.icon = context.getResources().getDrawable( com.android.internal.R.drawable.sym_app_on_sd_unavailable_icon); } } else if (!this.mounted) { // If the app wasn't mounted but is now mounted, reload // its icon. if (this.apkFile.exists()) { this.mounted = true; this.icon = this.info.loadIcon(pm); return true; } } return false; } }
2、应用名称。
void ensureLabel(Context context) { if (this.label == null || !this.mounted) { if (!this.apkFile.exists()) { this.mounted = false; this.label = info.packageName; } else { this.mounted = true; CharSequence label = info.loadLabel(context.getPackageManager()); this.label = label != null ? label.toString() : info.packageName; } } }
3、大小。
ApplicationsState.AppFilter filterObj; Comparator<AppEntry> comparatorObj; private int mWhichSize = SIZE_TOTAL; boolean emulated = Environment.isExternalStorageEmulated(); if (emulated) { mWhichSize = SIZE_TOTAL; } else { mWhichSize = SIZE_INTERNAL; } switch (mFilterMode) { case FILTER_APPS_THIRD_PARTY: filterObj = ApplicationsState.THIRD_PARTY_FILTER; break; case FILTER_APPS_SDCARD: filterObj = ApplicationsState.ON_SD_CARD_FILTER; if (!emulated) { mWhichSize = SIZE_EXTERNAL; } break; case FILTER_APPS_DISABLED: filterObj = ApplicationsState.DISABLED_FILTER; break; default: filterObj = ApplicationsState.ALL_ENABLED_FILTER; break; }
void updateSizeText(CharSequence invalidSizeStr, int whichSize) { if (ManageApplications.DEBUG) Log.i(ManageApplications.TAG, "updateSizeText of " + entry.label + " " + entry + ": " + entry.sizeStr); if (entry.sizeStr != null) { switch (whichSize) { case ManageApplications.SIZE_INTERNAL: appSize.setText(entry.internalSizeStr); break; case ManageApplications.SIZE_EXTERNAL: appSize.setText(entry.externalSizeStr); break; default: appSize.setText(entry.sizeStr); break; } } else if (entry.size == ApplicationsState.SIZE_INVALID) { appSize.setText(invalidSizeStr); } }
不同的TAB页,依照是否含有模拟存储区,大小的计算方式不同。
大小的具体计算方式,请參考应用设置之属性、名词等解析。
4、5、空间。
此处的空间为应用所占的空间,属于机身存储设备区。计算方式:
try { final long[] stats = mContainerService.getFileSystemStats( Environment.getExternalStorageDirectory().getPath()); mTotalStorage = stats[0]; mFreeStorage = stats[1]; } catch (RemoteException e) { Log.w(TAG, "Problem in container service", e); }
二、正在执行界面元素标注。
1、图标。
public Drawable loadIcon(Context context, RunningState state) { if (mPackageInfo != null) { return mPackageInfo.loadIcon(state.mPm); } return null; }
2、名称。
void ensureLabel(PackageManager pm) { if (mLabel != null) { return; } try { ApplicationInfo ai = pm.getApplicationInfo(mProcessName, PackageManager.GET_UNINSTALLED_PACKAGES); if (ai.uid == mUid) { mDisplayLabel = ai.loadLabel(pm); mLabel = mDisplayLabel.toString(); mPackageInfo = ai; return; } } catch (PackageManager.NameNotFoundException e) { } // If we couldn't get information about the overall // process, try to find something about the uid. String[] pkgs = pm.getPackagesForUid(mUid); // If there is one package with this uid, that is what we want. if (pkgs.length == 1) { try { ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], PackageManager.GET_UNINSTALLED_PACKAGES); mDisplayLabel = ai.loadLabel(pm); mLabel = mDisplayLabel.toString(); mPackageInfo = ai; return; } catch (PackageManager.NameNotFoundException e) { } } // If there are multiple, see if one gives us the official name // for this uid. for (String name : pkgs) { try { PackageInfo pi = pm.getPackageInfo(name, 0); if (pi.sharedUserLabel != 0) { CharSequence nm = pm.getText(name, pi.sharedUserLabel, pi.applicationInfo); if (nm != null) { mDisplayLabel = nm; mLabel = nm.toString(); mPackageInfo = pi.applicationInfo; return; } } } catch (PackageManager.NameNotFoundException e) { } } // If still don't have anything to display, just use the // service info. if (mServices.size() > 0) { ApplicationInfo ai = mServices.values().iterator().next() .mServiceInfo.applicationInfo; mPackageInfo = ai; mDisplayLabel = mPackageInfo.loadLabel(pm); mLabel = mDisplayLabel.toString(); return; } // Finally... whatever, just pick the first package's name. try { ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], PackageManager.GET_UNINSTALLED_PACKAGES); mDisplayLabel = ai.loadLabel(pm); mLabel = mDisplayLabel.toString(); mPackageInfo = ai; return; } catch (PackageManager.NameNotFoundException e) { } }
3、含有的服务以及进城详情。
mergedItem = new MergedItem(pi.mUserId); for (ServiceItem si : pi.mServices.values()) {//构建内部mServices,mProcesInfo。 mergedItem.mServices.add(si); si.mMergedItem = mergedItem; } mergedItem.mProcess = pi; mergedItem.mOtherProcesses.clear(); for (int mpi=firstProc; mpi<(mProcessItems.size()-1); mpi++) { mergedItem.mOtherProcesses.add(mProcessItems.get(mpi)); }
setDescription(context, (mProcess.mPid > 0 ? 1 : 0) + mOtherProcesses.size(), mServices.size());
4、大小。
ong[] pss = ActivityManagerNative.getDefault() .getProcessPss(pids); boolean updateSize(Context context, long pss, int curSeq) { mSize = pss * 1024; if (mCurSeq == curSeq) { String sizeStr = Formatter.formatShortFileSize( context, mSize); if (!sizeStr.equals(mSizeStr)){ mSizeStr = sizeStr; // We update this on the second tick where we update just // the text in the current items, so no need to say we // changed here. return false; } } return false; }
5、执行时间。
long activeSince = service.restarting == 0 ? service.activeSince : -1; 服务activie的时间 ai.mFirstRunTime = activeSince/*item.mActiveSince*/; DateUtils.formatElapsedTime(builder, (SystemClock.elapsedRealtime()-mFirstRunTime)/1000)
6、7、正在执行的空间计算。内存空间。
ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo(); mAm.getMemoryInfo(memInfo); SECONDARY_SERVER_MEM = memInfo.secondaryServerThreshold; MemInfoReader mMemInfoReader = new MemInfoReader(); mMemInfoReader.readMemInfo(); long availMem = mMemInfoReader.getFreeSize() + mMemInfoReader.getCachedSize() - SECONDARY_SERVER_MEM; float totalMem = mMemInfoReader.getTotalSize(); float totalShownMem = availMem + mLastBackgroundProcessMemory + mLastServiceProcessMemory;