編輯:關於Android編程
這兩天在搞個內存清理小插件,網上很少這方面資料,之前找過清理緩存的例子測試,結果不成功。後來自己思考該怎麼清理內存,於是成功搞出來了。
這兩個方法是網上拷別人的,分別用來得到可用內存和內存總數,這樣我們就可用得到了已用內存數。
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權限的用戶來說的)
QQ或者微信出現過滑動,最近聯系人列表,可以刪去當前選中的聯系人,這個功能很棒。就是試著做了下。其實是使用了開源框架SwipeListView 。 SwipeL
本文實例講述了Android實現將一個Activity設置成窗口樣式的方法。分享給大家供大家參考,具體如下:1.在res/value文件夾下的style.xml文件中加入
著手開發一款應用的時候,設置或者菜單頁面是可能需要的,但是,那重復的布局會很令人苦惱。新手可能會一項項的重復繪制,有經驗的你或許會用到include,或者用到組合控件。除
Android 自定義view實現動態進度條效果圖: 這個是看了梁肖的demo,根據他的思路自己寫了一個,但是我寫的這個貌似計算還是有些問題,從上面的圖就可以