Android系统缓存相关

1. 如何获取每个应用的缓存文件及大小

PackageManager pm = context.getPackageManager();
try {
    Method mmethod = PackageManager.class.getMethod("getPackageSizeInfo", String.class,IPackageStatsObserver.class);

    List<PackageInfo> packageInfos = pm.getInstalledPackages(0);
    
    // 数据变化的观察者,来自IPackageStatsObserver.Stub
    DataChangedObserver dataChangedObserver = new DataChangedObserver();
    
    for (PackageInfo packageInfo : packageInfos) {
        // 系统的方法背hide,因此使用反射机制来获取该方法
        mmethod.invoke(pm, packageInfo.packageName, dataChangedObserver);
    }
} catch (Exception e) {
    e.printStackTrace();
}
/**
 * 扫描结果的观察者 需要权限 <uses-permission
 * android:name="android.permission.GET_PACKAGE_SIZE"/>
 * 
 * @author chenhao24
 * 
 */
private class DataChangedObserver extends IPackageStatsObserver.Stub {
    @Override
    public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {

        if (!succeeded) {
            return;
        }
        
        // 获取缓存大小
        long cacheSize = pStats.cacheSize;
        
        // 获取应用的名称
        String packageName = pStats.packageName;
    }
}

IPackageStatsObserver.Stub 的引入.手动建android.content.pm包拷贝文件到此目录下

2. 如何清空缓存?可以使用上面类似的方法反射进行相关的操作,但是此操作需要系统级别的应用才可以清理,市面上的软件如何做到清理的呢?跳到应用信息页去手动的清理,但是市面上的软件做到了可以清理全部缓存文件,利用了Android系统的一个机制,当向系统申请空间(很大超过了目前系统空闲的大小)时,如果系统没有足够的空间可供使用,系统会删除所有应用的缓存文件,进而做到了清理全部缓存文件的目的。

PackageManager pm = context.getPackageManager();
try {
    // 使用反射
    Method mmethod = PackageManager.class.getMethod("freeStorageAndNotify", Long.class,IPackageDataObserver.class);
    mmethod.invoke(pm, Integer.MAX_VALUE,new ApplyDataObserver());
} catch (Exception e) {
    e.printStackTrace();
}
/**
 * 申请空间,消除缓存的数据观察者
 * @author chenhao24
 *
 */
private class ApplyDataObserver extends IPackageDataObserver.Stub{
    @Override
    public void onRemoveCompleted(String packageName, boolean succeeded)throws RemoteException {
        if(! succeeded){
            Log.i(TAG,"release sys cache error");
            return;
        }
        Log.i(TAG,"release sys cache success");
    }
}

IPackageDataObserver.Stub获取与IPackageStatsObserver.Stub类似

原文地址:https://www.cnblogs.com/cbooy/p/4774729.html