今天在写到获取手机可用内存空间的总大小的时候,通过下面的方法去获取的时候,发现该方法最低支持的版本是16,这显然是不可取的。
1 public static long getTotalSpace(Context ctx) { 2 //1.创建ActivityManager对象 3 ActivityManager am = (ActivityManager) 4 ctx.getSystemService(Context.ACTIVITY_SERVICE); 5 //2 获取封装内存信息的对象 6 MemoryInfo memoryInfo = new MemoryInfo(); 7 //3.对对象赋值 8 am.getMemoryInfo(memoryInfo); 9 return memoryInfo.totalMem; 10 }
经查阅资料后,通过读取proc/meminfo的数据,发现第一行就是我想要的可用内存空间的总大小,通过流的形式读取了想要的内存空间的总大小
1 try { 2 FileReader fileReader = new FileReader("proc/meminfo"); 3 BufferedReader br = new BufferedReader(fileReader); 4 5 String readLine = br.readLine();// 读取一行之后刚好是TotalMem的大小 6 7 // 对读取到的字符串进行ASCII值的匹配,获取到需要的内存空间的大小 8 char[] charArray = readLine.toCharArray(); 9 10 // 通过StingBuffer将可用空间的 总大小串起来 11 StringBuffer sb = new StringBuffer(); 12 for (char c : charArray) { 13 if (c >= '0' && c <= '9') { 14 sb.append(c); 15 } 16 } 17 //将sb转换成字符串,同时注意到数据库文件中的单位是kB,为了统一方便使用,转换成字节为单位的 18 return Long.parseLong(sb.toString())*1024; 19 20 } catch (Exception e) { 21 e.printStackTrace(); 22 }
然而不禁对proc/meminfo中的其他数据产生了信息,都代表什么意思?
通过adb shell切换到linux环境下,切换到该目录下,通过cat meminfo得到如下信息
当然你可以在DDMS中找到相应的文件路径,导出来,用记事本打开查看,基本是一样的。
针对这些其他数据,查阅资料后,各自的解释如下: MemTotal: 所有可用RAM大小(即物理内存减去一些预留位和内核的二进制代码大小)