Android 如何获取手机总内存和可用内存等信息
在android开发中,有时候我们想获取手机的一些硬件信息,比如android手机的总内存和可用内存大小。
这个该如何实现呢?
通过读取文件"/proc/meminfo"的信息能够获取手机memory的总量,而通过activitymanager.getmemoryinfo(activitymanager.memoryinfo)方法可以获取当前的可用memory量。
"/proc/meminfo"文件记录了android手机的一些内存信息,在命令行窗口里输入"adb shell",进入shell环境,输入"cat /proc/meminfo"即可在命令行里显示meminfo文件的内容
具体如下所示。
c:\users\figo>adb shell
# cat /proc/meminfo
cat /proc/meminfo
memtotal: 94096 kb
memfree: 1684 kb
buffers: 16 kb
cached: 27160 kb
swapcached: 0 kb
active: 35392 kb
inactive: 44180 kb
active(anon): 26540 kb
inactive(anon): 28244 kb
active(file): 8852 kb
inactive(file): 15936 kb
unevictable: 280 kb
mlocked: 0 kb
swaptotal: 0 kb
swapfree: 0 kb
dirty: 0 kb
writeback: 0 kb
anonpages: 52688 kb
mapped: 17960 kb
slab: 3816 kb
sreclaimable: 936 kb
sunreclaim: 2880 kb
pagetables: 5260 kb
nfs_unstable: 0 kb
bounce: 0 kb
writebacktmp: 0 kb
commitlimit: 47048 kb
committed_as: 1483784 kb
vmalloctotal: 876544 kb
vmallocused: 15456 kb
vmallocchunk: 829444 kb
#
下面先对"/proc/meminfo"文件里列出的字段进行粗略解释:
memtotal: 所有可用ram大小。
memfree: lowfree与highfree的总和,被系统留着未使用的内存。
buffers: 用来给文件做缓冲大小。
cached: 被高速缓冲存储器(cache memory)用的内存的大小(等于diskcache minus swapcache)。
swapcached:被高速缓冲存储器(cache memory)用的交换空间的大小。已经被交换出来的内存,仍然被存放在swapfile中,用来在需要的时候很快的被替换而不需要再次打开i/o端口。
active: 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要,否则不会被移作他用。
inactive: 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径。
swaptotal: 交换空间的总大小。
swapfree: 未被使用交换空间的大小。
dirty: 等待被写回到磁盘的内存大小。
writeback: 正在被写回到磁盘的内存大小。
anonpages:未映射页的内存大小。
mapped: 设备和文件等映射的大小。
slab: 内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗。
sreclaimable:可收回slab的大小。
sunreclaim:不可收回slab的大小(sunreclaim+sreclaimable=slab)。
pagetables:管理内存分页页面的索引表的大小。
nfs_unstable:不稳定页表的大小。
要获取android手机总内存大小,只需读取"/proc/meminfo"文件的第1行,并进行简单的字符串处理即可。
下面直接给出详细步骤,大家可以根据实际情况进行相应扩展。
1.新建项目,修改main.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <textview android:layout_width="fill_parent" android:layout_height="wrap_content" android:textstyle="bold" android:id="@+id/system_memory" /> </linearlayout>
2.完善readsystemmemory.java类
package com.figo.readsyememory; import android.app.activity; import android.os.bundle; import java.io.bufferedreader; import java.io.filereader; import java.io.ioexception; import android.app.activitymanager; import android.app.activitymanager.memoryinfo; import android.content.context; import android.text.format.formatter; import android.util.log; import android.widget.textview; public class readsystemmemory extends activity { textview tv = null; private string getavailmemory() {// 获取android当前可用内存大小 activitymanager am = (activitymanager) getsystemservice(context.activity_service); memoryinfo mi = new memoryinfo(); am.getmemoryinfo(mi); //mi.availmem; 当前系统的可用内存 return formatter.formatfilesize(getbasecontext(), mi.availmem);// 将获取的内存大小规格化 } private string gettotalmemory() { string str1 = "/proc/meminfo";// 系统内存信息文件 string str2; string[] arrayofstring; long initial_memory = 0; try { filereader localfilereader = new filereader(str1); bufferedreader localbufferedreader = new bufferedreader( localfilereader, 8192); str2 = localbufferedreader.readline();// 读取meminfo第一行,系统总内存大小 arrayofstring = str2.split("\\s+"); for (string num : arrayofstring) { log.i(str2, num + "\t"); } initial_memory = integer.valueof(arrayofstring[1]).intvalue() * 1024;// 获得系统总内存,单位是kb,乘以1024转换为byte localbufferedreader.close(); } catch (ioexception e) { } return formatter.formatfilesize(getbasecontext(), initial_memory);// byte转换为kb或者mb,内存大小规格化 } /** called when the activity is first created. */ @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); tv = (textview) findviewbyid(r.id.system_memory); tv.settext("手机总内存: " + this.gettotalmemory() + ", " + "可用内存: " + this.getavailmemory()); } }
大功告成,顺利读取android手机的总内存和当前的可用内存。这里只是抛砖引玉,大家可以举一反三,进行扩展。当然我们还可以通过读取"/proc/cupinfo"来获取android手机的cpu参数,通过读取"/proc/stat"文件来计算cpu的使用率,这里不再赘述。
第二种方法:手用java的反射机制来获取手机的内存的一些信息。
public class getfreemem extends activity { /** called when the activity is first created. */ @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); method _readproclines = null; try { class procclass; procclass = class.forname("android.os.process"); class parametertypes[]= new class[] {string.class, string[].class, long[].class }; _readproclines = procclass.getmethod("readproclines", parametertypes); object arglist[] = new object[3]; final string[] mmeminfofields = new string[] {"memtotal:", "memfree:", "buffers:", "cached:"}; long[] mmeminfosizes = new long[mmeminfofields.length]; mmeminfosizes[0] = 30; mmeminfosizes[1] = -30; arglist[0] = new string("/proc/meminfo"); arglist[1] = mmeminfofields; arglist[2] = mmeminfosizes; if(_readproclines!=null){ _readproclines.invoke(null, arglist); for (int i=0; i<mmeminfosizes.length; i++) { log.d("getfreemem", mmeminfofields[i]+" : "+mmeminfosizes[i]/1024); } } } catch (classnotfoundexception e) { e.printstacktrace(); } catch (securityexception e) { e.printstacktrace(); } catch (illegalargumentexception e) { e.printstacktrace(); } catch (illegalaccessexception e) { e.printstacktrace(); } catch (invocationtargetexception e) { e.printstacktrace(); } catch (nosuchmethodexception e) { e.printstacktrace(); } } }
以上就是对 android 获取内存信息的资料整理,做这块android开发的朋友可以看下。