android 記憶體清理

來源:互聯網
上載者:User

這兩天在搞個記憶體清理小外掛程式,網上很少這方面資料,之前找過清理緩衝的例子測試,結果不成功。後來自己思考該怎麼清理記憶體,於是成功搞出來了。

這兩個方法是網上拷別人的,分別用來得到可用記憶體和記憶體總數,這樣我們就可用得到了已用記憶體數。

View Code

    private long getAvailMemory(Context context) 
{
// 擷取android當前可用記憶體大小
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
MemoryInfo mi = new MemoryInfo();
am.getMemoryInfo(mi);
//mi.availMem; 當前系統的可用記憶體

//return Formatter.formatFileSize(context, mi.availMem);// 將擷取的記憶體大小規格化
return mi.availMem/(1024*1024);
}

private long getTotalMemory(Context context)
{
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(context, initial_memory);// Byte轉換為KB或者MB,記憶體大小規格化
return initial_memory/(1024*1024);
}

在Service裡面清理記憶體

自己寫的小方法,通過判斷進程資訊來判斷哪些進程是無用的可用殺掉

View Code

ActivityManager activityManger=(ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> list=activityManger.getRunningAppProcesses();
if(list!=null)
for(int i=0;i<list.size();i++)
{
ActivityManager.RunningAppProcessInfo apinfo=list.get(i);

System.out.println("pid "+apinfo.pid);
System.out.println("processName "+apinfo.processName);
System.out.println("importance "+apinfo.importance);
String[] pkgList=apinfo.pkgList;

if(apinfo.importance>ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE)
{
// Process.killProcess(apinfo.pid);
for(int j=0;j<pkgList.length;j++)
{
//2.2以上是過時的,請用killBackgroundProcesses代替
activityManger.restartPackage(pkgList[j]);
}
}

解析如下:

RunningAppProcessInfo 得到正在啟動並執行進程資訊

pkgList:得到該進程下啟動並執行包名

importance:該進程的重要程度

importance分為幾個層級,數值越低就越重要。數值對應的重要性請看api,我判斷是大於ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE的都殺掉,一般數值大於ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE的進程都長時間沒用或者空進程了。

最後通過for迴圈把包名對應進程殺掉:

2.2版本以下的用activityManger.restartPackage(pkgList[j]);   對應許可權<uses-permission android:name="android.permission.RESTART_PACKAGES" />

2.2以上的用killBackgroundProcesses(包名);    對應許可權<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

之前我以為可用android.os.Process.killProcess(pid);來殺掉其他進程,後來發覺不行

網上找到的解析是

對於這個方法,需要詳細解釋一下。在SDK的文檔中,解釋如下:

Kill the process with the given PID. Note that, though this API allows us to request to kill any process based on its PID, the kernel will still impose standard restrictions on which PIDs you are actually able to kill. Typically this means only the process running the caller's packages/application and any additional processes created by that app; packages sharing a common UID will also be able to kill each other's processes.

英語不好,不能準確翻譯,所以希望大家自己理解,免得對大家造成誤解。我個人對這句話的解釋就是,這個方法使用是有條件的:

a、將被殺掉的進程 和 當前進程 處於同一個包或者應用程式中;

b、將被殺掉的進程 是由當前應用程式所建立的附加進程;

c、將被殺掉的進程 和 當前進程 共用了普通使用者的UID。(這裡的普通使用者,是相對於Root許可權的使用者來說的)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.