android 实现清理缓存功能

系统文件(注:这个是系统的文件系统,不允许修改的)
内置SD卡(注:现在的手机基本上都有,就是我们所谓的ROM,是不可以移除的,RAM是我们手机的运行内存)
外置SD卡(注:这个就是我们的SD卡了,可以移除)
我们的应用程序一般会产生以下几种类型的数据:
- file-普通的文件存储
- database-数据库文件(.db文件)
- sharedPreference-配置数据(.xml文件)
应用内数据的所有路径:
- /data/data/com.xxx.xxx/cache - 应用内缓存(注:对应方法getCacheDir())
- /data/data/com.xxx.xxx/databases - 应用内数据库
- /data/data/com.xxx.xxx/shared_prefs - 应用内配置文件
- /data/data/com.xxx.xxx/files - 应用内文件(注:对应方法getFilesDir())

关键的地方 获取缓存路径
SD卡缓存路径 Context.getExternalCacheDir().getPath() ;
用于获取APP的在SD卡中的cache目录/mnt/sdcard/Android/data//cache;
开发的时候我们需要考虑如果这个手机有没有SD卡,或者SD正好被移除了的情况,因此比较优秀的程序都会专门写一个方法来获取缓存地址
public File getDiskCacheDir(Context context, String uniqueName) {  
    String cachePath;  
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())  
            || !Environment.isExternalStorageRemovable()) {  
        cachePath = context.getExternalCacheDir().getPath();  
    } else {  
        cachePath = context.getCacheDir().getPath();  
    }  
    return new File(cachePath + File.separator + uniqueName);  
}  

App的缓存路径
Context.getCacheDir().getPath() :
用于获取APP的cache目录 /data/data//cache目录
 

import android.content.Context
import android.os.Environment
import com.porsche.codebase.core.CoreApplication
import java.io.File
import java.lang.Double
import java.math.BigDecimal

object DataCleanManager {
    @Throws(Exception::class)
    fun getTotalCacheSize(context: Context): String? {
        var cacheSize = getFolderSize(context.cacheDir)
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            cacheSize += getFolderSize(context.externalCacheDir!!)
        }
        return getFormatSize(cacheSize)
    }

    //删除内外缓存
    fun clearAllCache() {
        deleteDir(CoreApplication.instance().cacheDir)
        if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {
            deleteDir(CoreApplication.instance().externalCacheDir)
        }
    }

    private fun deleteDir(dir: File?): Boolean? {
        if (dir != null && dir.isDirectory) {
            val children: Array = dir.list()
            for (i in children.indices) {
                val success = deleteDir(File(dir, children[i])) ?: return false
                if (!success) {
                    return false
                }
            }
        }
        return dir?.delete()
    }

    // 获取文件
    //Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
    //Context.getExternalCacheDir() --> SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
    @Throws(Exception::class)
    fun getFolderSize(file: File): Long {
        var size: Long = 0
        try {
            val fileList: Array = file.listFiles()
            for (i in fileList.indices) {
                // 如果下面还有文件
                if (fileList[i].isDirectory) {
                    size = size + getFolderSize(fileList[i])
                } else {
                    size = size + fileList[i].length()
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return size
    }

    /**
     * 格式化单位
     *
     * @param size
     * @return
     */
    private fun getFormatSize(size: Long): String? {

        val kiloByte = size / 1024.toDouble()
        if (kiloByte < 1) {
//            return size / 1024.toString() + "kB"
        }
        val megaByte = kiloByte / 1024
        if (megaByte < 1) {
            val result1 = BigDecimal(java.lang.Double.toString(kiloByte))
            return result1.setScale(1, BigDecimal.ROUND_HALF_UP)
                .toPlainString().toString() + "KB"
        }
        val gigaByte = megaByte / 1024
        if (gigaByte < 1) {
            val result2 = BigDecimal(Double.toString(megaByte))
            return result2.setScale(1, BigDecimal.ROUND_HALF_UP)
                .toPlainString().toString() + "MB"
        }
        val teraBytes = gigaByte / 1024
        if (teraBytes < 1) {
            val result3 = BigDecimal(java.lang.Double.toString(gigaByte))
            return result3.setScale(2, BigDecimal.ROUND_HALF_UP)
                .toPlainString().toString() + "GB"
        }
        val result4 = BigDecimal(teraBytes)
        return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()
            .toString() + "TB"
    }

/**
     * 计算缓存的大小
     */
    private void caculateCacheSize() {
        long fileSize = 0;
        String cacheSize = "0KB";
        File filesDir = getActivity().getFilesDir();
        File cacheDir = getActivity().getCacheDir();

        fileSize += FileUtil.getDirSize(filesDir);
        fileSize += FileUtil.getDirSize(cacheDir);
        // 2.2版本才有将应用缓存转移到sd卡的功能
        if (isMethodsCompat(android.os.Build.VERSION_CODES.FROYO)) {
            File externalCacheDir = MethodsCompat
                    .getExternalCacheDir(getActivity());
            fileSize += FileUtil.getDirSize(externalCacheDir);
            fileSize += FileUtil.getDirSize(new File(
                    org.kymjs.kjframe.utils.FileUtils.getSDCardPath()
                            + File.separator + "KJLibrary/cache"));
        }
        if (fileSize > 0)
            cacheSize = FileUtil.formatFileSize(fileSize);
        tvCache.setText(cacheSize);
    }

    public static boolean isMethodsCompat(int VersionCode) {
        int currentVersion = android.os.Build.VERSION.SDK_INT;
        return currentVersion >= VersionCode;
    }

 

}

你可能感兴趣的:(Android开发)