转载请注明出处: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;