1、把IPackageDataObserver.aidl、IPackageStatsObserver.aidl、PackageStats.aidl复制到项目的android.content.pm包中。
如图:
2、核心代码
private PackageManager pm;
// 存放缓存信息的容器
private List<CacheInfo> cacheDatas = new ArrayList<CacheInfo>();
@Override
protected void onCreate(Bundle savedInstanceState) {
....
// 包管理器
pm = getPackageManager();
}
/**
* 清理所有用户应用程序的缓存
*
*/
public void clearAll() {
System.out.println("clear all....");
Class clazz = pm.getClass();// 获取PackageManager的类类型
try {
Method method = clazz.getDeclaredMethod("freeStorageAndNotify",
long.class, IPackageDataObserver.class);
// 把包名传递给回调对象
// getcacheInfo.packName = packageName;
method.invoke(pm, Long.MAX_VALUE, new ClearCache());// 结果回调在IPackageStatsObserver的对象中
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 得到单个应用程序的缓存
*
* @param packageName
* 要得到缓存的程序包名
*/
private void getAppCacheSize(String packageName) {
Class clazz = pm.getClass();// 获取PackageManager的类类型
try {
Method method = clazz.getDeclaredMethod("getPackageSizeInfo",
String.class, IPackageStatsObserver.class);
// 把包名传递给回调对象
// getcacheInfo.packName = packageName;
method.invoke(pm, packageName, new GetCacheInfo(packageName));// 结果回调在IPackageStatsObserver的对象中
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 缓存信息的封装类
*
* @author Administrator
*
*/
private class CacheInfo {
Drawable icon;
String name;
long cacheSizeLong;// 缓存大小
String cacheSize;// 格式化后字符串
}
/**
* 清理缓存
*
* @author Administrator
*
*/
private class ClearCache extends IPackageDataObserver.Stub {
@Override
public void onRemoveCompleted(final String packageName,
boolean succeeded) throws RemoteException {
// 子线回调结果显示
runOnUiThread(new Runnable() {
@Override
public void run() {
long totalSize = 0;// 累计缓存大小
for (CacheInfo info : cacheDatas) {
// 变量缓存数据容器
totalSize += info.cacheSizeLong;
}
cacheDatas.clear();// 清空缓存
Toast.makeText(
getApplicationContext(),
"垃圾文件清理成功,本次为您节省了"
+ Formatter.formatFileSize(
getApplicationContext(), totalSize)
+ "空间", 1).show();
}
});
}
}
private int counts = 0;
/**
* 获取缓存大小
*
* @author Administrator
*
*/
private class GetCacheInfo extends IPackageStatsObserver.Stub {
String packName;
public GetCacheInfo(String packName) {
this.packName = packName;
}
/*
* (non-Javadoc) 回调结果
*
* @see
* android.content.pm.IPackageStatsObserver#onGetStatsCompleted(android
* .content.pm.PackageStats, boolean)
*/
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
synchronized (packName) {
counts++;
System.out.println(packName + "扫描");
// 判断是否有缓存
if (pStats.cacheSize > 0) {
System.out.println("有缓存信息:" + packName);
// 有缓存
// 把app和对应的缓存信息记录(放到容器中)
// 图标 名字 缓存大小
CacheInfo info = new CacheInfo();
try {
PackageInfo packageInfo = pm
.getPackageInfo(packName, 0);
// 设置app的图标
info.icon = packageInfo.applicationInfo.loadIcon(pm);
// 设置app的名字
info.name = packageInfo.applicationInfo.loadLabel(pm)
+ "";
// 缓存大小
info.cacheSizeLong = pStats.cacheSize;
// 设置缓存的大小 (格式化字符串)
info.cacheSize = Formatter.formatFileSize(
getApplicationContext(), pStats.cacheSize);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 添加一条缓存信息
cacheDatas.add(info);
}
// 这里可以通过count与所有要扫描的apk的数量做比较,判断是否扫描完毕
// if (counts == allApks.size()) {
// handler.obtainMessage(FINISH).sendToTarget();
// }
}
}
}
3、清单文件中需要添加的权限
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>