找了很久只找到一直不用ROOT,但清理所有APP的缓存的方法。以下记录:
/**
* 清理全部应用程序缓存的点击事件
*
* @param view
*/
public void cleanAll(View view) {
try {
PackageManager packageManager = main.this.getPackageManager();
Method localMethod = packageManager.getClass().getMethod("freeStorageAndNotify", Long.TYPE,
IPackageDataObserver.class);
Long localLong = Long.valueOf(getEnvironmentSize() - 1L);
Object[] arrayOfObject = new Object[2];
arrayOfObject[0] = localLong;
localMethod.invoke(packageManager, localLong, new IPackageDataObserver.Stub() {
@Override
public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {
Toast.makeText(getApplicationContext(), "清除状态: " + succeeded, Toast.LENGTH_SHORT).show();
Log.i("TAG","清除状态: " + succeeded);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
private static long getEnvironmentSize()
{
File localFile = Environment.getDataDirectory();
long l1;
if (localFile == null)
l1 = 0L;
while (true)
{
String str = localFile.getPath();
StatFs localStatFs = new StatFs(str);
long l2 = localStatFs.getBlockSize();
l1 = localStatFs.getBlockCount() * l2;
return l1;
}
}
下面还有获取APP缓存信息的方法:
/**
* 获取Android Native App的缓存大小、数据大小、应用程序大小
*
* @param context
* Context对象
* @param pkgName
* 需要检测的Native App包名
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
public static void getPkgSize(final Context context, String pkgName) throws NoSuchMethodException,
InvocationTargetException,
IllegalAccessException {
// getPackageSizeInfo是PackageManager中的一个private方法,所以需要通过反射的机制来调用
Method method = PackageManager.class.getMethod("getPackageSizeInfo",
new Class[] { String.class, IPackageStatsObserver.class });
// 调用 getPackageSizeInfo 方法,需要两个参数:1、需要检测的应用包名;2、回调
method.invoke(context.getPackageManager(), new Object[] {
pkgName,
new IPackageStatsObserver.Stub() {
@SuppressLint("NewApi")
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {
// 子线程中默认无法处理消息循环,自然也就不能显示Toast,所以需要手动Looper一下
Looper.prepare();
// 从pStats中提取各个所需数据
Toast.makeText(context,
"缓存大小=" + Formatter.formatFileSize(context, pStats.cacheSize) +
"\n数据大小=" + Formatter.formatFileSize(context, pStats.dataSize) +
"\n程序大小=" + Formatter.formatFileSize(context, pStats.codeSize),
Toast.LENGTH_LONG).show();
Log.i("TAG",
"内部缓存大小=" + Formatter.formatFileSize(context, pStats.cacheSize) +
"\n数据大小=" + Formatter.formatFileSize(context, pStats.dataSize) +
"\n程序大小=" + Formatter.formatFileSize(context, pStats.codeSize)+
"\n外部缓冲数据大小=" + Formatter.formatFileSize(context, pStats.externalCacheSize )+
"缓存大小=" + Formatter.formatFileSize(context, pStats.cacheSize + pStats.externalCacheSize));
// 遍历一次消息队列,弹出Toast
Looper.loop();
}
}
});
}
当然他们需要3个 AIDL文件的支持。还有2个权限:
在这里就只贴出主要的代码片段。具体看DEMO:DEMO地址
接下来记录下需要root的清缓存方法:
String[] commands = new String[] {"cd sdcard", "ls", "rm -r /data/data/com.UCMobile/downTheme"};
首先cd sdcard进度sd卡=-=,然后ls列出项目,最后rm -r删除文件