1.根据关键字查询系统缓存的获取方法
Setting源码缓存获取的实现
//创建了一个实现了IPackageStatsObserver.Stub借口的子类对象,并且实现了onGetStatsCompleted方法 final IPackageStatsObserver.Stub mStatsObserver = new IPackageStatsObserver.Stub() { @Override public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { } }; mPm.getPackageSizeInfo(mCurComputingSizePkg, mStatsObserver);
反射调用系统隐藏方法
// 1.获取指定类的字节码文件 try { Class<?> clazz = Class.forName("android.content.pm.PackageManager"); // 2.获取调用方法对象 Method method = clazz.getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class); // 3.获取对象调用方法 method.invoke(mPm, "com.android.browser", mStatsObserver); } catch (Exception e) { e.printStackTrace(); }
相关权限
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
所需文件(连个aidl文件)
IPackageStatsObserver.aidl
PackageStats.aidl
注意:使用使要把其放在android.content.pm包下
2.单个缓存的清理操作
一、单个缓存的清理,需要是系统应用
以上 权限系统应用无法获得
要想单个清理,调用系统清理缓存的activity,隐式意图开启清理界面,逐个清理
先关实例方法:
Intent intent = new Intent(
"android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.parse("package:"
+ info.packageName));
startActivity(intent);
二、 全部清理,权限
<category android:name="android.intent.category.LAUNCHER" />
所需aidl 文件
IPackageDataObserver.aidl
相关实例方法:
public void freeAche() {
try {
Class<?> clazz = Class.forName("android.content.pm.PackageManager");
// 2.获取调用方法对象
Method method = clazz.getMethod("freeStorageAndNotify", long.class,
IPackageDataObserver.class);
// 3.获取对象调用方法
method.invoke(mPm, Long.MAX_VALUE, new IPackageDataObserver.Stub() {
@Override
public void onRemoveCompleted(String packageName,
boolean succeeded) throws RemoteException {
// 清除缓存完成后调用的方法(考虑权限)
Message msg = Message.obtain();
msg.what = CACHE_CLEAN_FINISH;
mHandler.sendMessage(msg);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}