获取手机的运行内存,正在运行的进程
实体类如下,TaskInfo.java:
/** * 进程的信息封装类 */ public class TaskInfo { /** * 进程的图标 */ private Drawable icon; /** * 进程的名字 */ private String name; /** * 为了区分进程的包名 */ private String packName; /** * 内存大小,以字节为单位 */ private int memorySize; /** * true代表用户进程,false代表系统进程 */ private boolean userTask; public Drawable getIcon() { return icon; } public void setIcon(Drawable icon) { this.icon = icon; } public int getMemorySize() { return memorySize; } public void setMemorySize(int memorySize) { this.memorySize = memorySize; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPackName() { return packName; } public void setPackName(String packName) { this.packName = packName; } public boolean isUserTask() { return userTask; } public void setUserTask(boolean userTask) { this.userTask = userTask; } @Override public String toString() { return "TaskInfo{" + "icon=" + icon + ", name='" + name + '\'' + ", packName='" + packName + '\'' + ", userTask=" + userTask + '}'; } }
工具类,SystemInfoUtils.java:
import android.app.ActivityManager; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.os.Debug; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; /** * 获取系统正在运行的程序信息工具类 */ public class SystemInfoUtils { /** * 获取正在运行的进程的数量 * @param context 上下文 */ public static int getRunningProcessCount(Context context){ //PackageManager 包管理器,相当于程序管理器.静态的内容 //ActivityManager 进程管理器,管理手机的活动信息.动态的内容 ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> infos = am.getRunningAppProcesses();//获取运行的进程 return infos.size(); } /** * 获取手机可用的剩余运行内存 * @return 字节数 */ public static long getAvailMemory(Context context){ ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); ActivityManager.MemoryInfo memoryInfo=new ActivityManager.MemoryInfo(); am.getMemoryInfo(memoryInfo); return memoryInfo.availMem; } /** * 获取手机可用的总运行内存 * 格式化字节为单位的大小:android.text.format.Formatter.formatFileSize(this, totalMemory) * 通过adb命令查看,adb shell进入 * # cd proc (进入系统的配置信息目录,可以使用ls -l命令查看) * # cat cpuinfo (查看cpu信息) * # cat meminfo (查看这个文件内容就可以看到内存信息) */ public static long getTotalMemory(Context context){ /* ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); ActivityManager.MemoryInfo memoryInfo=new ActivityManager.MemoryInfo(); am.getMemoryInfo(memoryInfo); return memoryInfo.totalMem;//需要API16以上*/ try { File file = new File("/proc/meminfo"); FileInputStream fis = new FileInputStream(file); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String totalRam = br.readLine(); StringBuffer sb = new StringBuffer(); //MemTotal: 513000 KB char[] cs = totalRam.toCharArray(); for (char c : cs) { if (c >= '0' && c <= '9') { sb.append(c); } } long result = Long.parseLong(sb.toString()) * 1024;//因为读出来的是KB,所以这里转换为B方便后面的格式化 return result;//字节 } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 获取所有的进程信息(包括进程的图片 名称 占用的内存大小) * TaskInfo为进程信息的封装类 */ public static List<TaskInfo> getTaskInfos(Context context){ ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); PackageManager pm = context.getPackageManager(); List<TaskInfo> taskInfos = new ArrayList<TaskInfo>();//存放得到的数据 List<ActivityManager.RunningAppProcessInfo> infos = am.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo info : infos) { TaskInfo taskInfo = new TaskInfo();//进程信息实体类 String processName = info.processName; //获取应用包名 //通过该应用的pid获取内存信息 Debug.MemoryInfo[] memoryInfos = am.getProcessMemoryInfo(new int[]{info.pid}); int memsize = memoryInfos[0].getTotalPrivateDirty() * 1024; try { ApplicationInfo applicationInfo = pm.getApplicationInfo(processName, 0); Drawable icon=applicationInfo.loadIcon(pm);//获取图标 String name=applicationInfo.loadLabel(pm).toString();//名称 taskInfo.setIcon(icon); taskInfo.setName(name); taskInfo.setMemorySize(memsize); //判断是不是用户进程 if((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)==0){ taskInfo.setUserTask(true);//用户进程 }else{ taskInfo.setUserTask(false);//系统进程 } taskInfos.add(taskInfo); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } return taskInfos; } }
这里将listView显示就省略了.......直接看下效果图吧:
在设置适配器的时候只需要注意复用的问题:
//LinearLayout为item的布局,convertView为滑出去复用的View if (convertView != null && (convertView instanceof LinearLayout)) { //避免复用产生空指针异常 holder= (ViewHolder) convertView.getTag(); }
杀死进程见:杀死进程
注意:系统的有些进程你是杀不了的,但是为了更好的用户体验,在清理内存的时候,需要把杀不掉的进程也从listView中移除,这就需要使用假数据了,即:
把所有的进程数据都放到集合中,再将集合填充到listView中,当清理内存的时候,删除掉集合中对应的数据就可以了,这样用户就以为把进程都杀死掉了