获取内存信息(运行的进程数,可用的总内存,剩余内存)属于系统的工具方法了,开始的工具方法是这样的:
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方便转化。
运行结果: