核心算法描述:
第一步:获取正在运行的进程, 保存在集合当中 : List<IsRunningAppInfo> appList
第二步:读取总使用的CPU, 路径在 private static String path = "/proc/stat";
第三步:读取所有运行进程CPU,路径在 "/proc/" + pid + "/stat"; //pid为进程号
第四步:读取所有运行线程CPU,路径在 "/proc/" + pid + "/task" + tid +"/stat"; //pid为进程号,tid为线程号
第五步:读取好文件的信息,分别保存在不同集合当中,然后回调回去,存入数据库(根据需求,可灵活运用),避免一边读取文件,一边保存数据库当中,不然将耗费大量的时间,产生的误差特别的大
第六步:数据的内容保存好后,到另外一个activity中,从数据库中读取数据,并列表显示出数据。
注意:读取的时候,可能会碰到读取文件的内容的时候,还没有读好(算所占比例的时候会出现出现“除数为0”),需要定义一个handle,在handle当中读取数据(读的过程中,判断是否数据存储完毕),并显示读取的数据,不能在activity当中不然会出现“AndroidRunTime”错误。
获取正在运行的进程:
- /**
- * 获取正在运行的进程
- *
- * @return
- */
- public List<IsRunningAppInfo> queryRunningApp() {
- List<IsRunningAppInfo> listRunApp = new ArrayList<IsRunningAppInfo>();
- am = (ActivityManager) context
- .getSystemService(Context.ACTIVITY_SERVICE);
- List<RunningAppProcessInfo> list = am.getRunningAppProcesses();
- RunningAppProcessInfo runningPro = null;
- IsRunningAppInfo appInfo = null;
- for (int i = 0; i < list.size(); i++) {
- runningPro = list.get(i);
- appInfo = new IsRunningAppInfo();
- appInfo.setPid(runningPro.pid);
- appInfo.setProcessName(runningPro.processName);
- appInfo.setUid(runningPro.uid);
- pkgManager(appInfo);
- listRunApp.add(appInfo);
- }
- return listRunApp;
- }
- /**
- * 获取应用程序的 程序名,图标
- *
- * @param appInfo
- * @throws NameNotFoundException
- */
- public void pkgManager(IsRunningAppInfo appInfo) {
- try {
- PackageManager pm = context.getPackageManager();
- PackageInfo pkInfo;
- pkInfo = pm.getPackageInfo(appInfo.getProcessName(), 0);
- appInfo.setIcon(pkInfo.applicationInfo.loadIcon(pm));
- appInfo.setAppName(pkInfo.applicationInfo.loadLabel(pm).toString());
- } catch (NameNotFoundException e) {
- e.printStackTrace();
- }
- }
- 读取CPU文件:
- public void cpuMain() {
- sqliteHelp
- .clearAllTableData(new String[] {
- Config.TBL_CPUMONITOR_PROCESSCPU,
- Config.TBL_CPUMONITOR_TheadCPU,
- Config.TBL_CPUMONITOR_TOTALCPU }); // 在读取文件前清空所有表数据
- R_W_File rw = new R_W_File();
- rw.clearFileData(new File(rw.getSdcardPath(), "result.txt"));
- i = 0;
- while (i < 2) {
- queryRunningApp(); // 获取正在运行的应用程序信息
- if (i == 0) {
- readTotalCPU(i); // 捕捉时,总CPU
- }
- readProcessCPU(i); // 进程CPU--->线程CPU
- readThreadCPU(i);
- i++;
- }
- }
- /**
- * 获取正在运行的应用程序
- */
- protected void queryRunningApp() {
- IsRunningAppProgress pro = new IsRunningAppProgress(context);
- appList = pro.queryRunningApp();
- }
- /**
- * 总CPU使用量
- */
- protected void readTotalCPU(int i) {
- AsyncTask_TotalCPU taskTotalCPU = new AsyncTask_TotalCPU(context);
- taskTotalCPU.execute(i, null, null);
- }
- /**
- * 进程CPU
- */
- protected void readProcessCPU(int i) {
- AsyncTask_ProgressCPU taskProcessCPU = null;
- taskProcessCPU = new AsyncTask_ProgressCPU(new ProcessCallback(),
- appList);
- taskProcessCPU.execute(i, null, null);
- }
- /**
- * 线程CPU
- */
- protected void readThreadCPU(int i) {
- AsyncTask_TheadCPU taskThreadCPU = new AsyncTask_TheadCPU(
- new ThreadCallback(), appList);
- taskThreadCPU.execute(i, null, null);
- }
- /**
- * 回调方法
- */
- class ThreadCallback implements ICallbacks {
- @Override
- public <T> void call(T t1, T t2) {
- if ((Integer) t2 == 1) {
- readTotalCPU(1); // 捕捉时,总CPU
- }
- @SuppressWarnings("unchecked")
- Map<String[], IsRunningAppInfo> saveThreadCPUMap = (Map<String[], IsRunningAppInfo>) t1;
- saveThreadData(saveThreadCPUMap, (Integer) t2);
- }
- }
- /**
- * 回调方法
- */
- class ProcessCallback implements ICallbacks {
- @Override
- public <T> void call(T t1, T t2) {
- @SuppressWarnings("unchecked")
- Map<String[], IsRunningAppInfo> saveProCPUMap = (Map<String[], IsRunningAppInfo>) t1;
- saveProData(saveProCPUMap, (Integer) t2);
- }
- }
- public void saveThreadData(
- Map<String[], IsRunningAppInfo> saveThreadCPUMap, int j) {
- Set<String[]> key = saveThreadCPUMap.keySet();
- Iterator<String[]> it = key.iterator();
- String[] str = null;
- IsRunningAppInfo appInfo = null;
- ContentValues cv = null;
- while (it.hasNext()) {
- str = it.next();
- appInfo = saveThreadCPUMap.get(str);
- cv = new ContentValues();
- cv.put("processName", appInfo.getProcessName());
- cv.put("pid", appInfo.getPid());
- cv.put("tid", Long.valueOf(str[0]));
- cv.put("utime", Long.valueOf(str[13]));
- cv.put("stime", Long.valueOf(str[14]));
- cv.put("numTimes", j);
- sqliteHelp.append(Config.TBL_CPUMONITOR_TheadCPU, cv);
- }
- if (j == 1) {
- writeData();
- }
- }
- /**
- * 保存进程数据
- *
- * @param saveProCPUMap
- * @param j
- */
- private void saveProData(Map<String[], IsRunningAppInfo> saveProCPUMap,
- int j) {
- Set<String[]> key = saveProCPUMap.keySet();
- Iterator<String[]> it = key.iterator();
- String[] str = null;
- IsRunningAppInfo runApp = null;
- ContentValues cv = null;
- while (it.hasNext()) {
- str = it.next();
- runApp = saveProCPUMap.get(str);
- cv = new ContentValues();
- if (runApp.getIcon() == null) {
- cv.put("icon",
- FormatImage.getInstace().getDrawableToByte(
- context.getResources().getDrawable(
- R.drawable.ic_launcher_default)));
- } else
- cv.put("icon",
- FormatImage.getInstace().getDrawableToByte(
- runApp.getIcon()));
- if (runApp.getAppName() == null || runApp.getAppName().equals("")) {
- cv.put("appName", runApp.getProcessName());
- } else
- cv.put("appName", runApp.getAppName());
- cv.put("processName", runApp.getProcessName());
- cv.put("pid", runApp.getPid());
- cv.put("utime", str[13]);
- cv.put("stime", str[14]);
- cv.put("cutime", str[15]);
- cv.put("cstime", str[16]);
- cv.put("numTimes", j);
- sqliteHelp.append(Config.TBL_CPUMONITOR_PROCESSCPU, cv);
- }
- if (j == 1) {
- writeData();
- }
- }
- public void writeData() {
- try {
- R_W_File files = new R_W_File();
- File mFile = new File(files.getSdcardPath(), "result.txt");
- files.writeFileDataAtTail(mFile, "1");
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- 显示CPU列表数据:
- public View getView(int position, View convertView, ViewGroup parent) {
- ProcessCPU pro = list.get(position);
- if (convertView == null) {
- convertView = inflater.inflate(layoutId, null);
- appView = new AppView(convertView);
- convertView.setTag(appView);
- } else {
- appView = (AppView) convertView.getTag();
- }
- appView.pkgName.setText(pro.getProcessName());
- appView.appIcon.setBackgroundDrawable(pro.getIcon()); // 图标
- appView.appName.setText(pro.getAppName()); // 应用名
- appView.pb.setMax(100);
- if (pro.getProcessName().equals("system"))
- Log.e("systemValue:" + pro.getUtime() + " ==totalCPU:" + totalCPU);
- double schedule = Double.valueOf(String.format("%.2f", pro.getUtime()
- * 100.00 / totalCPU));
- appView.pb.setProgress((int) schedule);
- appView.tvPb.setText("" + schedule + "%");
- return convertView;
- }
- handle中读取并显示数据:
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- dialog = (Dialog) msg.obj;
- queryTotalCPU();
- queryProcessList();
- if (adapterCpuChart == null) {
- adapterCpuChart = new Adapter_cpu_chart(context,
- R.layout.adapter_cpu_chart, list, totalCPU);
- }
- lvChart.setAdapter(adapterCpuChart);
- adapterCpuChart.notifyDataSetChanged();
- pbBar.closeDialogProgressBar(dialog);
- }
- /**
- * 查找总共CPU时间片 每次进行数据查询的时候,将表中的数据重新请空
- */
- public void queryTotalCPU() {
- sql = "select (max(num1)-min(num1)) as total from "
- + "(select (t.user+t.nice+t.system+t.iowait+t.irq+t.softirq+t.stealstolen+t.guest) as num1 "
- + "from TotalCPU t)";
- cursor = sqliteHelp.query(sql);
- int index = -1;
- long allValue = -1;
- long ownValue = -1;
- long ownThreadCPU = -1;
- if (cursor.moveToFirst()) {
- index = cursor.getColumnIndex("total");
- allValue = cursor.getLong(index);
- }
- sqliteHelp.closeDb();
- sql = "select (max(num2)-min(num2)) as ownCPU from (select (p.utime+p.stime+p.cstime+p.cutime) as num2 "
- + "from ProcessCPU p "
- + "where p.processName='"
- + pkgName
- + "') ";
- cursor = sqliteHelp.query(sql);
- if (cursor.moveToFirst()) {
- index = cursor.getColumnIndex("ownCPU");
- ownValue = cursor.getLong(index);
- }
- sqliteHelp.closeDb();
- sql = "select max(num3)-min(num3) as ownThreadCPU "
- + "from (select (t.utime+t.stime) as num3 "
- + "from ThreadCPU t " + "where t.processName='" + pkgName
- + "') ";
- cursor = sqliteHelp.query(sql);
- if (cursor.moveToFirst()) {
- index = cursor.getColumnIndex("ownThreadCPU");
- ownThreadCPU = cursor.getLong(index);
- }
- sqliteHelp.closeDb();
- totalCPU = (allValue - ownValue - ownThreadCPU);
- Log.e("allValue:" + allValue + " " + " ownValue:" + ownValue
- + " ownThreadCPU" + ownThreadCPU);
- }
- /**
- * 查找所有进程的CPU时间片
- */
- public void queryProcessList() {
- sql = "select p.processName,p.appName,p.icon,sum(temp.utime) as utime "
- + "from (select processName,(max(utime)-min(utime)) as utime "
- + "from (select processName,appName,icon, (utime+stime+cutime+cstime) as utime "
- + "from ProcessCPU where processName <> '"
- + pkgName
- + "' and numTimes=0 "
- + "union all "
- + "select processName,appName,icon, (utime+stime+cutime+cstime) as utime "
- + "from ProcessCPU where processName <> '"
- + pkgName
- + "' and numTimes=1 ) "
- + "group by processName "
- + "union all select processName,(max(utime)-min(utime)) as utime "
- + "from (select processName, sum(utime+stime) as utime "
- + "from ThreadCPU where processName <> '"
- + pkgName
- + "' and numTimes=0 "
- + "group by processName union all select processName, sum(utime+stime) as utime "
- + "from ThreadCPU where processName <> '"
- + pkgName
- + "' and numTimes=1 "
- + "group by processName) group by processName) as temp,ProcessCPU p "
- + "where p.processName=temp.processName group by p.processName "
- + "order by utime desc limit 10";
- list = new ArrayList<ProcessCPU>();
- cursor = sqliteHelp.query(sql);
- ProcessCPU proCPU = null;
- if (cursor.moveToFirst()) {
- do {
- proCPU = new ProcessCPU();
- int processName = cursor.getColumnIndex("processName");
- int appName = cursor.getColumnIndex("appName");
- int icon = cursor.getColumnIndex("icon");
- int utime = cursor.getColumnIndex("utime");
- proCPU.setAppName(cursor.getString(appName));
- proCPU.setProcessName(cursor.getString(processName));
- proCPU.setIcon(FormatImage.getInstace().getByteToDrawable(
- cursor.getBlob(icon)));
- proCPU.setUtime(cursor.getLong(utime));
- list.add(proCPU);
- } while (cursor.moveToNext());
- }
- sqliteHelp.closeDb();
- }
- 读取进程CPU:
- public void readFile() {
- String[] str = null;
- for (int i = 0; i < list.size(); i++) {
- runApp = list.get(i);
- file = new File(getPath(runApp.getPid()));
- try {
- fis = new FileInputStream(file);
- br = new BufferedReader(new InputStreamReader(fis));
- String readLine;
- while ((readLine = br.readLine()) != null) {
- str = readLine.split(" ");
- }
- br.close();
- fis.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- saveProCPUMap.put(str, runApp);
- }
- }
- /**
- * 获取每个进程的 文件路径
- *
- * @param pid
- * @return
- */
- public String getPath(long pid) {
- return "/proc/" + pid + "/stat";
- }
- 读取线程CPU:
- public void queryThreadCPU(List<IsRunningAppInfo> list) throws IOException {
- for (int i = 0; i < list.size(); i++) {
- IsRunningAppInfo appInfo = list.get(i);
- queryThreadCPU(appInfo);
- }
- }
- /**
- * 根据每一个pid获取CPU使用率
- *
- * @param pid
- * @return
- * @throws IOException
- */
- public void queryThreadCPU(IsRunningAppInfo appInfo) throws IOException {
- path = "/proc/" + appInfo.getPid() + "/task";
- file = new File(path);
- if (file.exists() && file != null) {
- files = file.listFiles();
- if (files != null) {
- queryThreadCPU(files, appInfo);
- }
- }
- }
- /**
- * 查询某一个进程的 线程CPU使用情况
- *
- * @param files
- * @return
- * @throws IOException
- */
- private void queryThreadCPU(File[] files, IsRunningAppInfo appInfo)
- throws IOException {
- String readLine;
- String[] tStr = null;
- for (int i = 0; i < files.length; i++) {
- File f = files[i];
- path = f.getPath() + "/stat";
- file = new File(path);
- fis = new FileInputStream(file);
- br = new BufferedReader(new InputStreamReader(fis));
- while ((readLine = br.readLine()) != null) {
- tStr = readLine.split(" ");
- }
- }
- saveThreadCPUMap.put(tStr, appInfo);
- }
- @Override
- protected void onPostExecute(Void result) {
- super.onPostExecute(result);
- }
- 读取总CPU:
- public Long readFile() {
- String[] str = null;
- file = new File(path);
- try {
- fis = new FileInputStream(file);
- br = new BufferedReader(new InputStreamReader(fis));
- String readLine;
- if ((readLine = br.readLine()) != null) {
- str = readLine.split(" ");
- }
- br.close();
- fis.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return changeArray(str);
- }
- private Long changeArray(String[] str) {
- Log.e("长度:" + str.length);
- ContentValues cv = new ContentValues();
- cv.put("user", Long.valueOf(str[2]));
- cv.put("nice", Long.valueOf(str[3]));
- cv.put("system", Long.valueOf(str[4]));
- cv.put("idle", Long.valueOf(str[5]));
- cv.put("iowait", Long.valueOf(str[6]));
- cv.put("irq", Long.valueOf(str[7]));
- cv.put("softirq", Long.valueOf(str[8]));
- cv.put("stealstolen", Long.valueOf(str[9]));
- cv.put("guest", Long.valueOf(str[10]));
- cv.put("numTimes", i);
- return sqliteHelp.append(Config.TBL_CPUMONITOR_TOTALCPU, cv);
- }