android 清理缓存

目前常用的清理缓存:代码如下:
/**

 * 清理缓存
 */
private static long getEnvironmentSize() {
    File localFile = Environment.getDataDirectory();
    long l1;
    if (localFile == null)
        l1 = 0L;
    while (true) {

        String str = localFile.getPath();
        StatFs localStatFs = new StatFs(str);
        long l2 = localStatFs.getBlockSize();
        l1 = localStatFs.getBlockCount() * l2;
        Log.e("清理缓存", str + ":" + l1);
        return l1;
    }
}

public static void getAllMemory() throws Exception {
    PackageManager pm = Splash.mContext.getPackageManager();
    Class[] arrayOfClass = new Class[2];
    Class localClass2 = Long.TYPE;
    arrayOfClass[0] = localClass2;
    arrayOfClass[1] = IPackageDataObserver.class;
    Method localMethod = pm.getClass().getMethod("freeStorageAndNotify",
            arrayOfClass);
    Long localLong = Long.valueOf(getEnvironmentSize() - 1L);
    Object[] arrayOfObject = new Object[2];
    arrayOfObject[0] = localLong;
    localMethod.invoke(pm, localLong, new IPackageDataObserver.Stub() {
        public void onRemoveCompleted(String packageName, boolean succeeded)
                throws RemoteException {
            // TODO Auto-generated method stub
        }
    });
}

获取各个应用的缓存大小:

/**
 * 获得手机中所有程序的缓存
 */
private void queryToatalCache() {
    if (mPackageManager == null) {
        mPackageManager = getContext().getPackageManager();
    }
    List<ApplicationInfo> apps = mPackageManager
            .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES
                    | PackageManager.GET_ACTIVITIES);
    String pkgName = "";
    for (ApplicationInfo info : apps) {
        pkgName = info.packageName;
        try {
            queryPkgCacheSize(pkgName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/**
 * 取得指定包名的程序的缓存大小
 */
private void queryPkgCacheSize(String pkgName) throws Exception {
    if (!TextUtils.isEmpty(pkgName)) {// pkgName不能为空
        // 使用放射机制得到PackageManager类的隐藏函数getPackageSizeInfo
        if (mPackageManager == null) {
            mPackageManager = getContext().getPackageManager();// 得到被反射调用函数所在的类对象
        }
        try {
            // the requested method's name.
            String strGetPackageSizeInfo = "getPackageSizeInfo";
            // 通过反射机制获得该隐藏函数
            Method getPackageSizeInfo = mPackageManager.getClass()
                    .getDeclaredMethod(strGetPackageSizeInfo, String.class,// getPackageSizeInfo方法的参数类型
                            IPackageStatsObserver.class);// getPackageSizeInfo方法的参数类型
            // 调用该函数,并且给其分配参数 ,待调用流程完成后会回调PkgSizeObserver类的函数
            getPackageSizeInfo.invoke(mPackageManager,// 方法所在的类
                    pkgName, mStatsObserver);// 方法使用的参数

        } catch (Exception ex) {
            Log.wtf("tag", "queryPkgSize()-->NoSuchMethodException");
            ex.printStackTrace();
            throw ex; // 抛出异常
        }
    }
}

/**
 * 使用Android系统中的AIDL文件,获得指定程序的大小。AIDL文件形成的Binder机制
 */
private IPackageStatsObserver.Stub mStatsObserver = new IPackageStatsObserver.Stub() {
    @Override
    public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
            throws RemoteException {
        long tmp = totalCacheSize;
        totalCacheSize += pStats.cacheSize;// 累加
        if (tmp != totalCacheSize) {// 总缓存大小有变化
            mHandler.sendEmptyMessage(MSG_UPDATE_TOAST_TEXT);
        }
    }
};

你可能感兴趣的:(android 清理缓存)