一键清理缓存功能
一键清理缓存原理:利用PackageManager下隐藏的api,freeStorageAndNotify /* @hide
*/ public abstract void freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer); long freeStorageSize //要释放的缓存,如果系统缓存小于freeStorageSize,那么释放系统缓存,如果系统缓存大于freeStorageSize ,那么释放系统缓存-freeStorageSize 的大小。 The number of bytes of storage to befreed by the system. 权限:
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" /> 小结: 这相当于利用系统的漏洞, 如果想申请的free空间大于系统rom空间,那么返回系统rom空间 如果freeStorageAndNotify小于系统rom空间,那么返回系统rom空间-freeStorageAndNotify
|
核心代码: CleanCacheActivity.java // 2、一键清理缓存点击事件
btn_clean_cache.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 一键清理缓存
//public abstract void freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer);
PackageManager packageManager = getPackageManager();
Method[] methods = PackageManager.class.getMethods();
for (Method method : methods) {
if (method.getName().equals("freeStorageAndNotify")) {
try {
method.invoke(packageManager, Long.MAX_VALUE,new MyIPackageDataObserver());
} catch (Exception e) {
ToastUtils.showToastInThread(CleanCacheActivity.this, "清理缓存失败");
e.printStackTrace();
}
break;
}
}
}
});/**
* 5、一键清理-使用远程服务
* @author hacket
*/
private class MyIPackageDataObserver extends IPackageDataObserver.Stub{
@Override
public void onRemoveCompleted(String packageName, boolean succeeded)
throws RemoteException {
ToastUtils.showToastInThread(CleanCacheActivity.this, "清理缓存成功");
}
}
|
结果: |
问题: 低版本的手机,对于分配的Long.MAX_VALUE可能解析成-1,所以用Integer.MAX_VALUE就可以了 method.invoke(packageManager, Long.MAX_VALUE,new MyIPackageDataObserver()); |