您的位置:首页 > 移动开发 > Android开发

Android系统缓存相关

2015-09-01 01:30 579 查看
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类似
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: