Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 內存清理

android 內存清理

編輯:關於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權限的用戶來說的)

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved