当前位置: 移动技术网 > IT编程>移动开发>Android > Android 如何获取手机总内存和可用内存等信息

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

巴伐利亚玫瑰txt,billionchords,幻灯

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网