• 3、应用设置之界面标注


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

  • 相关阅读:
    移动端 异常捕获
    禁止选中网页的某段文字
    Java正则表达式的解释说明
    error while performing database login with the xxx driver
    javascript 日期转换为中文
    chrono使用
    resize
    github使用
    adb 无法连接 CreateProcess failure, error 2 * could not start server *
    opencv-videowriter
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4017684.html
Copyright © 2020-2023  润新知