1. 程式人生 > >獲取Android手機總記憶體和可用記憶體

獲取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行,並進行簡單的字串處理即可。

      下面直接給出詳細步驟,大家可以根據實際情況進行相應擴充套件。
第一步:新建一個Android工程,命名為ReadSystemMemory,如下圖所示。

 

第二步:修改在layout目錄下的main.xml檔案,程式碼如下:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent">
  6. <TextView
  7.     android:layout_width="fill_parent"
  8.     android:layout_height="wrap_content"
  9.     android:textStyle="bold"
  10.     android:id="@+id/system_memory"/>
  11. </LinearLayout>

第三步:完善ReadSystemMemory類,程式碼如下: 

  1. package com.figo.readsyememory;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import java.io.BufferedReader;  
  5. import java.io.FileReader;  
  6. import java.io.IOException;  
  7. import android.app.ActivityManager;  
  8. import android.app.ActivityManager.MemoryInfo;  
  9. import android.content.Context;  
  10. import android.text.format.Formatter;  
  11. import android.util.Log;  
  12. import android.widget.TextView;  
  13. publicclass ReadSystemMemory extends Activity {  
  14.     TextView tv = null;  
  15.     private String getAvailMemory() {// 獲取android當前可用記憶體大小
  16.         ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  
  17.         MemoryInfo mi = new MemoryInfo();  
  18.         am.getMemoryInfo(mi);  
  19.         //mi.availMem; 當前系統的可用記憶體
  20.         return Formatter.formatFileSize(getBaseContext(), mi.availMem);// 將獲取的記憶體大小規格化
  21.     }  
  22.     private String getTotalMemory() {  
  23.         String str1 = "/proc/meminfo";// 系統記憶體資訊檔案
  24.         String str2;  
  25.         String[] arrayOfString;  
  26.         long initial_memory = 0;  
  27.         try {  
  28.             FileReader localFileReader = new FileReader(str1);  
  29.             BufferedReader localBufferedReader = new BufferedReader(  
  30.                     localFileReader, 8192);  
  31.             str2 = localBufferedReader.readLine();// 讀取meminfo第一行,系統總記憶體大小
  32.             arrayOfString = str2.split("//s+");  
  33.             for (String num : arrayOfString) {  
  34.                 Log.i(str2, num + "/t");  
  35.             }  
  36.             initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;// 獲得系統總記憶體,單位是KB,乘以1024轉換為Byte
  37.             localBufferedReader.close();  
  38.         } catch (IOException e) {  
  39.         }  
  40.         return Formatter.formatFileSize(getBaseContext(), initial_memory);// Byte轉換為KB或者MB,記憶體大小規格化
  41.     }  
  42.     /** Called when the activity is first created. */
  43.     @Override
  44.     publicvoid onCreate(Bundle savedInstanceState) {  
  45.         super.onCreate(savedInstanceState);  
  46.         setContentView(R.layout.main);  
  47.         tv = (TextView) findViewById(R.id.system_memory);  
  48.         tv.setText("手機總記憶體: " + this.getTotalMemory() + ", " + "可用記憶體: "
  49.                 + this.getAvailMemory());  
  50.     }  
  51. }  

第四步:執行該工程,結果如下:

 

      大功告成,順利讀取android手機的總記憶體和當前的可用記憶體。這裡只是拋磚引玉,大家可以舉一反三,進行擴充套件。當然我們還可以通過讀取"/proc/cupinfo"來獲取android手機的CPU引數,通過讀取"/proc/stat"檔案來計算CPU的使用率,這裡不再贅述。

      我是新手上路,剛接觸android,第一次寫博文難免有所疏漏,歡迎大家多多指正,共同進步。