清理應用程式快取
阿新 • • 發佈:2019-02-17
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