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方便转化。

运行结果:

技术分享





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。