android缓存清理

来源:互联网 发布:网络统考大学英语b 编辑:程序博客网 时间:2024/05/17 00:56
/**
* 获取包名的应用缓存 在生命周期方法onCreate中先调用一次getCacheSize( );
PackageManager pm = getActivity().getPackageManager();
List<PackageInfo> infos = pm.getInstalledPackages(0);
for (PackageInfo info : infos) {
getCacheSize(info);
}
* @param packgeName
*/

public void getCacheSize(PackageInfo packgeInfo) {
try {
Method myUserId = UserHandle.class.getDeclaredMethod("myUserId");
// 4.2 后需要一个int 类型的参数 从UserHandle(解释:应再保险用户信息)中获取
int userID = (Integer) myUserId.invoke(pm,null);
Method method = PackageManager.class.getDeclaredMethod("getPackageSizeInfo", String.class, int.class, IPackageStatsObserver.class);
method.invoke(pm, packgeInfo.packageName, userID, new MyPackObserver(packgeInfo));
} catch (Exception e) {
e.printStackTrace();
}
}


private class MyPackObserver extends android.content.pm.IPackageStatsObserver.Stub{
private PackageInfo packgeInfo;
public MyPackObserver(PackageInfo info){
this.packgeInfo = info;
}


@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
long cachesize = pStats.cacheSize;//缓存大小
long datasize = pStats.dataSize;//数据大小
long codesize = pStats.codeSize;//应用代码(包)大小
if (flag == true) {//有的应用是默认有12KB缓存的 清理不了,只能加个判断
//flag  是否第一次清理缓存,true: 是   ,  false: 不是;   第一次清理操作过后flag =false;
if (cachesize > 0) {
CacheInfo info = new CacheInfo();//实例化创建的bean对象
info.setAppName(packgeInfo.applicationInfo.loadLabel(pm).toString());
info.setIcon(packgeInfo.applicationInfo.loadIcon(pm));
info.setCacheSize(cachesize);
cacheInfos.add(info); //cacheInfos是一个List<CacheInfo> //视图布局使用List View还是其他自定一个,显示时return cacheInfos.size();
}
} else {
if (cachesize > 12288) {//大于12KB  //第二次清理获取  排除默认有12KB缓存的应用
CacheInfo info = new CacheInfo();
info.setAppName(packgeInfo.applicationInfo.loadLabel(pm).toString());
info.setIcon(packgeInfo.applicationInfo.loadIcon(pm));
info.setCacheSize(cachesize);
cacheInfos.add(info);
}
}
}
}


/**
*bean对象 最好单独创建一个类
*/

public class CacheInfo {
private String appName;
private long cacheSize;
private String packgeName;
private long dataSize;
private long codeSize;
private Drawable icon;
// get( ) -- set( ) -- 以及toStirng( )方法省约
}


/**
* 清理缓存
*/

private void deleteAllCache() {
Method[] methods = PackageManager.class.getMethods();
Long localLong = Long.valueOf(getEnvironmentSize() - 1L);
Object[] arrayOfObject = new Object[2];
arrayOfObject[0] = localLong;
for(Method method : methods){
if( "freeStorageAndNotify".equals(method.getName()) ) {
try {
method.invoke(pm, localLong, new MyPackageDataObserver());//Integer.MAX_VALUE * 100 实测不适合真机4.2版本以上换成localLong,
} catch (Exception e) {
e.printStackTrace();
}
return;
}
}
}


/**
* @return 所有缓存数据
*/


private 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;
return l1;
}

}


private class MyPackageDataObserver extends IPackageDataObserver.Stub{
@Override

public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {

getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//清理完成 执行UI操作
});
}
}

如果导不了IPackageStatsObserver, IPackageDataObserver 包 参照图片上做


aidl文件下载地址:
http://download.csdn.net/detail/xyyyxyyyx/7617415

http://www.bvbcode.com/cn/c0fmsirg-1806530-down

之前没有创建github项目,我的demo地址:https://github.com/CMythYang/RunAndroid


0 0
原创粉丝点击