标签:
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类似
标签:
原文地址:http://www.cnblogs.com/cbooy/p/4774729.html