如何使用Java检索Android设备上的可用RAM

本文概述

你的Android设备上的RAM不仅存储Linux内核, 还存储来自所有已安装的应用程序, GPU等的其他类型的数据。设置中列出的可用RAM可能与你已安装的RAM总量不同设备。如果要在Android应用程序上显示此信息, 则需要根据要定位的Android版本弄乱不同的代码。

在本文中, 我们将向你展示如何在Android设备中使用Java检索设备的最大可用RAM大小。

A. Android API级别> = 16(JellyBean及更高版本)

如果你的应用程序仅针对Android API Level> = 16的设备, 则可以使用依赖于Android活动管理器的方法:

A.1。获取以字节为单位的RAM大小

以下方法返回RAM的最大可用大小(以字节为单位)。它返回一个长变量, 例如1567342592:

import android.content.Context;
import java.text.DecimalFormat;
import android.app.ActivityManager;

/**
* Returns the available ammount of RAM of your Android device in Bytes e.g 1567342592 (1.5GB)
* @return {Long}
*/
public long getMemorySizeInBytes()
{
    Context context = getApplicationContext();

    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

    ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();

    activityManager.getMemoryInfo(memoryInfo);

    long totalMemory = memoryInfo.totalMem;

    return totalMemory;
}

A2。获取人类可读格式的RAM大小(Mb, Gb, Tb)

以下方法以人类可读的格式返回RAM的可用大小。它将返回一个字符串, 例如2GB, 1.5GB:

import android.content.Context;
import java.text.DecimalFormat;
import android.app.ActivityManager;

/**
* Returns the available ammount of RAM of your Android device in a human readable format e.g 1.56GB, 4GB, 512MB
*
* @return {String}
*/
public String getMemorySizeHumanized()
{
    Context context = getApplicationContext();

    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

    ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();

    activityManager.getMemoryInfo(memoryInfo);

    DecimalFormat twoDecimalForm = new DecimalFormat("#.##");

    String finalValue = "";
    long totalMemory = memoryInfo.totalMem;

    double kb = totalMemory / 1024.0;
    double mb = totalMemory / 1048576.0;
    double gb = totalMemory / 1073741824.0;
    double tb = totalMemory / 1099511627776.0;

    if (tb > 1) {
        finalValue = twoDecimalForm.format(tb).concat(" TB");
    } else if (gb > 1) {
        finalValue = twoDecimalForm.format(gb).concat(" GB");
    } else if (mb > 1) {
        finalValue = twoDecimalForm.format(mb).concat(" MB");
    }else if(kb > 1){
        finalValue = twoDecimalForm.format(mb).concat(" KB");
    } else {
        finalValue = twoDecimalForm.format(totalMemory).concat(" Bytes");
    }

    return finalValue;
}

B.任何Android API级别

如果你的代码需要在任何Android版本上运行, 则可以(如在每个基于Linux的系统中一样)通过/ proc / meminfo文件检索RAM的数量。系统使用/ proc / meminfo来报告系统上的可用内存和已使用内存(物理内存和交换内存)以及内核使用的共享内存和缓冲区的数量。

为了在Android上读取提到的文件, 请依靠Java的RandomAccessFile类读取文件。该文件包含类似于以下内容的结构:

Linux/proc/meminfo输出示例

因此, 你将需要处理文本以提取所需的内容, 在本例中, 我们将使用正则表达式进行处理并保持其简单性, 以下方法getMemorySizeHumanized返回一个具有人类可读大小的RAM的字符串, 例如2GB:

import android.content.Context;
import java.io.RandomAccessFile;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.IOException;

/**
 * Returns the available amount of RAM of your Android device in a human readable format e.g 1.56GB, 4GB, 512MB
 *
 * @return {String}
 */
public String getMemorySizeHumanized() {
    RandomAccessFile reader;
    String load;
    DecimalFormat twoDecimalForm = new DecimalFormat("#.##");
    double totRam;
    String lastValue = "";

    try {
        reader = new RandomAccessFile("/proc/meminfo", "r");
        load = reader.readLine();
        Pattern p = Pattern.compile("(\\d+)");
        Matcher m = p.matcher(load);
        String value = "";
        while (m.find()) {
            value = m.group(1);
        }

        reader.close();

        totRam = Double.parseDouble(value);

        double mb = totRam / 1024.0;
        double gb = totRam / 1048576.0;
        double tb = totRam / 1073741824.0;

        if (tb > 1) {
            lastValue = twoDecimalForm.format(tb).concat(" TB");
        } else if (gb > 1) {
            lastValue = twoDecimalForm.format(gb).concat(" GB");
        } else if (mb > 1) {
            lastValue = twoDecimalForm.format(mb).concat(" MB");
        } else {
            lastValue = twoDecimalForm.format(totRam).concat(" KB");
        }

    } catch (IOException ex) {
        ex.printStackTrace();
    }

    return lastValue;
}

编码愉快!

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?