欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 如何获取手机总内存和可用内存等信息

程序员文章站 2024-03-05 19:19:01
在android开发中,有时候我们想获取手机的一些硬件信息,比如android手机的总内存和可用内存大小。 这个该如何实现呢? 通过读取文件"/proc/memin...

在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开发的朋友可以看下。