public void onClick(View v) {
if (list.size()>0) {
//删除所有缓存
try {
Class<?> loadClass = getActivity().getClass().getClassLoader().loadClass("android.content.pm.PackageManager");
//Long.class Long TYPE long
Method method = loadClass.getDeclaredMethod("freeStorageAndNotify", Long.TYPE,IPackageDataObserver.class);
method.invoke(pm, Long.MAX_VALUE,new MyIPackageDataObserver());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
btn_fragment_clearcache.setVisibility(View.GONE);
list.clear();
myAdapter.notifyDataSetChanged();
tv_fragmentclear_text.setText("清除缓存完成");
}
}
……
private class MyIPackageDataObserver extends IPackageDataObserver.Stub{
//当缓存清理完成之后调用
@Override
public void onRemoveCompleted(String packageName, boolean succeeded)
throws RemoteException {
}
}
还需要aidl /src/android/content/pm/IPackageDataObserver.aidl
权限:<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
Android4.2与以前的系统版本相比,将“目录占用的空间大小”也加入应用占用空间大小的统计。所以cache目录也加入了应用Cache Size的统计。
//获取缓存大小
IPackageStatsObserver.Stub mStatsObserver = new IPackageStatsObserver.Stub() {
public void onGetStatsCompleted(PackageStats stats, boolean succeeded) {
long cachesize = stats.cacheSize;//缓存大小
long codesize = stats.codeSize;//应用程序的大小
long datasize = stats.dataSize;//数据大小
//12288文件夹大小
if (cachesize>12288) {
System.out.println(stats.packageName+"缓存"+cachesize);
String cache = Formatter.formatFileSize(getActivity(), cachesize);
HaveCacheApp haveCacheApp=new HaveCacheApp(stats.packageName , cache);
list.add(haveCacheApp);
}
// String code = Formatter.formatFileSize(getActivity(), codesize);
// String data = Formatter.formatFileSize(getActivity(), datasize);
//System.out.println(stats.packageName+" cachesize:"+cache +" codesize:"+code+" datasize:"+data);
}
};