72获取内存信息(运行的进程数,可用的总内存,剩余内存)&&获取可用的总内存的BUG的解决
获取内存信息(运行的进程数,可用的总内存,剩余内存)属于系统的工具方法了,开始的工具方法是这样的:
package com.ustc.mobilemanager.utils; import java.util.List; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo; import android.app.ActivityManager.RunningAppProcessInfo; import android.content.Context; /** * 系统信息的工具类 * * @author * */ public class SystemInfoUtils { /** * 获取正在运行的进程的数量 * * @param context * @return */ public static int getRunningProcessCount(Context context) { ActivityManager am = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> infos = am.getRunningAppProcesses(); return infos.size(); } /** * 获取手机可用的剩余的内存 * * @param context * @return */ public static long getAvailMem(Context context) { ActivityManager am = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); MemoryInfo outInfo = new MemoryInfo(); am.getMemoryInfo(outInfo); return outInfo.availMem; } /** * 获取手机总内存 * * @param context * @return */ public static long getTotalMem(Context context) { ActivityManager am = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); MemoryInfo outInfo = new MemoryInfo(); am.getMemoryInfo(outInfo); return outInfo.totalMem; } }
那么对于获得正在运行的进程总数而言,显示需要获得ActivityManager:Activity管理器,通过Activity的管理器的getRunningAppProcesses得到一个RunningAppProcessInfo的List集合,集合的size正是我们需要知道的正在运行的进程总数;
对于获得剩余内存而言:
首先也是获得ActivityManager,使用ActivityManager的getMemoryInfo方法,将MemoryInfo对象穿进去作为他的参数,这样就可以返回MemoryInfo的字段availMem,这就是我们需要的剩余内存;
按照同样的方法,去获取总得可用的内存,发现没有totalMem这个属性,将程序最低的兼容版本改到16,我靠,居然有了,然后在Activity中调用:
package com.ustc.mobilemanager; import com.ustc.mobilemanager.utils.SystemInfoUtils; import android.app.Activity; import android.os.Bundle; import android.text.format.Formatter; import android.view.Window; import android.widget.TextView; public class TaskManagerActivity extends Activity { /* * 运行的进程的总数量 */ private TextView tv_process_count; /* * 剩余/总内存 */ private TextView tv_mem_info; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_task_manager); tv_mem_info = (TextView) findViewById(R.id.tv_mem_info); tv_process_count = (TextView) findViewById(R.id.tv_process_count); int processCount = SystemInfoUtils.getRunningProcessCount(this); tv_process_count.setText("运行中进程:" + processCount + "个"); long availMem = SystemInfoUtils.getAvailMem(this); long totalMem = SystemInfoUtils.getTotalMem(this); tv_mem_info.setText("剩余/总内存:" + Formatter.formatFileSize(this, availMem) + "/" + Formatter.formatFileSize(this, totalMem)); } }
一运行在4.0的手机上,挂了!打开Logcat发现下面的错误:
错误是:NoSuchFieldError。
所以需要重写这个方法,通过终端进入手机shell,进入proc文件夹,查看meminfo文件,如下:
我们可以查看setting下的源码,查看google怎么写的:
/** * 获取手机总内存 * * @param context * @return long byte */ public static long getTotalMem(Context context) { // ActivityManager am = (ActivityManager) context // .getSystemService(Context.ACTIVITY_SERVICE); // MemoryInfo outInfo = new MemoryInfo(); // am.getMemoryInfo(outInfo); // // return outInfo.totalMem; try { File file = new File("/proc/meminfo"); FileInputStream fis = new FileInputStream(file); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String line = br.readLine(); StringBuilder sb = new StringBuilder(); // MemTotal: 484792 kB for (char c : line.toCharArray()) { if (c >= '0' && c <= '9') { sb.append(c); } } // 单位是byte 方便转化 return Long.parseLong(sb.toString()) * 1024; } catch (Exception e) { e.printStackTrace(); return 0; } }
只要读取第一行,然后只要截取数字就可以了。最后为了使用Formatter.formatFileSize的方便,将最后的结果乘以1024方便转化。
运行结果:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。