備忘:清理軟件緩存功能的代碼
個人測試了第二種方法,是有效果的
清理軟件緩存
一種帶root權限的:
Class c1 = Class.forName("android.content.pm.IPackageDataObserver");
Method method = pm.getClass().getMethod("deleteApplicationCacheFiles", String.class,IPackageDataObserver.class);
method.invoke(pm, packageName,new IPackageDataObserver.Stub(){
@Override
public void onRemoveCompleted(String packageName,
boolean succeeded) throws RemoteException {
// TODO Auto-generated method stub
}
});
<uses-permission android:name="android.permission.DELETE_CACHE_FILES" />
另外一種是不用root權限;一鍵清理:
權限:<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
private static long getEnvironmentSize() { File localFile = Environment.getDataDirectory(); long l1; if (localFile == null) l1 = 0L; String str = localFile.getPath(); StatFs localStatFs = new StatFs(str); long l2 = localStatFs.getBlockSize(); l1 = localStatFs.getBlockCount() * l2; return l1; } public static void clear(Activity activity) { try { PackageManager pm = activity.getPackageManager(); 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() { public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException { Log.e("onRemoveCompleted,packageName="+packageName+",succeeded="+succeeded); } }); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
可能會遇到IPackageDataObserver這個無法導進去,自己寫一個IPackageDataObserver.aidl,內容如下:
package android.content.pm;
/**
* API for package data change related callbacks from the Package Manager.
* Some usage scenarios include deletion of cache directory, generate
* statistics related to code, data, cache usage(TODO)
* {@hide}
*/
oneway interface IPackageDataObserver {
void onRemoveCompleted(in String packageName, boolean succeeded);
}放在src包下就行了。