1、获取应用程序缓存信息
2、清理缓存(也可以不用步骤1,直接清理,步骤1只是为了知道哪些程序有缓存)
1)
Method getPackageSizeInfo = pm.getClass().getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
List<ApplicationInfo> application = new ArrayList();
application = pm.getInstalledApplications(0);
for(int i=0;i<application.size();i++)
{
ApplicationInfo app = application.get(i);
getPackageSizeInfo.invoke(pm, app.packageName, new IPackageStatsObserver.Stub()
{
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException
{
if(pStats.cacheSize != 0)
{
cacheSize += pStats.cacheSize;
Log.e(TAG, "cacheSize: " + pStats.packageName + " ;" + pStats.cacheSize);
}
}
});
}
上面的方法 通过反射机制获取应用程序的缓存信息
2)
Method localMethod = pm.getClass().getMethod("freeStorageAndNotify", Long.TYPE,IPackageDataObserver.class);
Long localLong = Long.valueOf(getEnvironmentSize() - 1L);
Object[] arrayOfObject = new Object[2];
arrayOfObject[0] = localLong;
localMethod.invoke(pm,localLong,new IPackageDataObserver.Stub()
{
@Override
public void onRemoveCompleted(String packageName,
boolean succeeded) throws RemoteException
{
}});
同样通过反射,来清除缓存
private long getEnvironmentSize()
{
File dataFile = Environment.getDataDirectory();
if (dataFile == null)
return 0;
else
{
StatFs localStatFs = new StatFs(dataFile.getPath());
long l2 = localStatFs.getBlockSize();
return localStatFs.getBlockCount() * l2;
}
}
需要用到3个AIDL:
IPackageDataObserver.aidl
IPackageStatsObserver.aidl
PackageStats.aidl